docker固定ip,抛弃端口映射吧  -- 通过搭建gitlab看看如何使用

2019-11-27 17:37:14 35点赞 264收藏 31评论

0. 什么是docker

抛开win和mac外,在linux系统下(包括群辉),docker是容器,方便部署和资源隔离、限制。

通过docker部署程序和普通直接部署程序相比较,仅仅会多占用一些磁盘空间。所以大家可以放心大胆的使用docker。

注册表: 相当于应用商城,可以选择下载不同的应用。

镜像: 就是下载的应用、软件包,大家下载的都是绿色软件,几乎不需要安装的,可能需要我们简单配置下。

容器: 相当于我们安装好的软件,同一个镜像可以启动多次,创建多个一样的容器。

很多套件是我们安装的是一些服务,比如数据库、gitlab、homeassistant等。群辉上的docker套件,每次重启容器的ip会发生变化,通过端口映射的方式来找到对应的服务。开始我也是采用这种方式,后面发现容器一多,端口就乱78遭的。

那么就得想个办法固定ip,这样直接通过ip+端口的形式访问服务,没有必要进行端口映射了。

本文内容需要开启ssh,使用终端进行。

1. 创建网络

原有的网络不支持固定ip,只能新建一个了:

sudo docker network create --subnet=172.18.0.0/16 fixbridge

默认的网段是172.17.0.0/16,我们使用相邻的,具体的随意即可。fixbridge 是网络的名称,后续需要通过这个名字指定网络。

创建的网络创建的网络

创建的网络也可以通过界面查看


2. 创建容器

我们不能直接通过群辉的界面创建,只能通过终端创建容器。 创建的容器,界面也可以看到和操作。我们以'sameersbn/gitlab:latest'为例子,创建一个gitlab服务。

2.1 创建redis容器

https://hub.docker.com/r/sameersbn/redis/

提供的命令是多行的,后面的表示该条命令没有结束。直接复制到终端即可。

sudo docker run --name redis_101 -itd --net fixbridge --ip 172.18.0.101 --restart always
--volume /volume1/docker/redis/data:/var/lib/redis
--volume /volume1/docker/redis/log:/var/log/redis
--env 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
--env 'REDIS_VERSION=4.0.9'
--env 'REDIS_USER=redis'
--env 'REDIS_DATA_DIR=/var/lib/redis'
--env 'REDIS_LOG_DIR=/var/log/redis'
sameersbn/redis:latest

--name 容器的名称, 我起的名字里面带ip,方便查看

--net 我们创建的网络名称,写你的网络名字哦

--ip 指定的ip。除了该参数界面无法配置外,其他参数界面均可配置。

--restart always 不当关机时,会尝试重启

--volume 指定路径映射, :前面是宿主的路径,该路径你需要在群辉里面创建的。 :后面是映射到容器内部的路径。

--env 环境变量

sameersbn/redis:latest 下载的镜像和版本,和自己下载的镜像对应哦。

docker固定ip,抛弃端口映射吧  -- 通过搭建gitlab看看如何使用

我们选择镜像--启动---高级设置

--env 就是环境选项卡,全部拷贝到命令行里面,这些参数目的是让我们改的,一般默认就行

--volume 对应的是卷,哪些路径需要映射呢? 基本都是env指定的。

如果不知道怎么填写可以启动一下,看看默认是什么内容。或者通过介绍页面查看帮助。

2.2 postgresql容器

https://hub.docker.com/r/sameersbn/postgresql

postgresql这个数据库,和mysql一样出名,gitlab支持较好。使用mysql也不错,但是gitlab无法使用子group,

sudo docker run --name postgresql_102 -itd --net fixbridge --ip 172.18.0.102 --restart always
--volume /volume1/docker/postgresql/certs:/etc/postgresql/certs
--volume /volume1/docker/postgresql/data:/var/lib/postgresql
--volume /volume1/docker/postgresql/log:/var/log/postgresql
--env "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
--env "PG_APP_HOME=/etc/docker-postgresql"
--env "PG_VERSION=10"
--env "PG_USER=postgres"
--env "PG_HOME=/var/lib/postgresql"
--env "PG_RUNDIR=/run/postgresql"
--env "PG_LOGDIR=/var/log/postgresql"
--env "PG_CERTDIR=/etc/postgresql/certs"
--env "PG_BINDIR=/usr/lib/postgresql/10/bin"
--env "PG_DATADIR=/var/lib/postgresql/10/main"
--env 'DB_NAME=gitlabhq_production' # 创建数据库
--env 'DB_USER=gitlab' # 创建用户,该用户具备访问上面的数据库的权限
--env 'DB_PASS=XXXXXX' # 用户密码
--env 'DB_EXTENSION=pg_trgm'
sameersbn/postgresql:latest

注释的三行表示创建个数据库以及用户给gitlab使用。

2.3 gitlab容器

https://hub.docker.com/r/sameersbn/gitlab#postgresql

sudo docker run --name gitlab_103 -itd --net fixbridge --ip 172.18.0.103
--publish 10022:22 # 映射端口号,22端口比较特殊需要映射出来
--volume /volume1/docker/gitlab/config:/home/git/gitlab/config:rw # 后面的rw表示可以读写,默认rw,之前很多没加
--volume /volume1/docker/gitlab/log:/var/log/gitlab:rw
--volume /volume1/docker/gitlab/data:/home/git/data:rw
--env "GITLAB_SSH_PORT=10022" # 和端口映射的端口一样哦,这三个配置会展示都网页提供clone地址用的
--env "GITLAB_SSH_HOST=git.xxx.xxx" # 你想采用的域名
--env "GITLAB_HOST=git.XXX.xxx" # 同上,可以不同
--env "DEBUG=true"
--env "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
--env "GITLAB_VERSION=11.11.3"
--env "RUBY_VERSION=2.5"
--env "GOLANG_VERSION=1.12.6"
--env "GITLAB_SHELL_VERSION=9.1.0"
--env "GITLAB_WORKHORSE_VERSION=8.7.0"
--env "GITLAB_PAGES_VERSION=1.5.0"
--env "GITALY_SERVER_VERSION=1.42.4"
--env "GITLAB_USER=git"
--env "GITLAB_HOME=/home/git"
--env "GITLAB_LOG_DIR=/var/log/gitlab"
--env "GITLAB_CACHE_DIR=/etc/docker-gitlab"
--env "RAILS_ENV=production"
--env "NODE_ENV=production"
--env "GITLAB_INSTALL_DIR=/home/git/gitlab"
--env "GITLAB_SHELL_INSTALL_DIR=/home/git/gitlab-shell"
--env "GITLAB_GITALY_INSTALL_DIR=/home/git/gitaly"
--env "GITLAB_DATA_DIR=/home/git/data"
--env "GITLAB_BUILD_DIR=/etc/docker-gitlab/build"
--env "GITLAB_RUNTIME_DIR=/etc/docker-gitlab/runtime"
--env "REDIS_PORT=6379" # 刚才redis的端口号
--env "REDIS_HOST=172.18.0.101" # redis的ip
--env "DB_ADAPTER=postgresql" # 使用postgresql数据库
--env "DB_HOST=172.18.0.102" # 使用postgresql数据库ip
--env "DB_PORT=5432" # 使用postgresql数据库端口
--env "DB_PASS=XXXXXXXX" # 使用postgresql数据库密码,这三个参数和之前启动数据库时的一样
--env "DB_USER=gitlab" # 使用postgresql数据库用户名
--env "DB_NAME=gitlabhq_production" # 使用postgresql数据库数据库名称
--env "GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string3-xx1" # 随机的字符串,加密用,
--env "GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string2-yy" # 字符串不同加密的内容也不同,随机填写和其他人区分
--env "GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string1-z22z" # 这三个参数全部替换掉,采用不一样的字符串
sameersbn/gitlab:latest

命令比较长,需要配置的几个后面使用#进行注释说明

GITLAB_HOST,GITLAB_SSH_HOST,GITLAB_SSH_PORT 这三个参数使用见下图

docker固定ip,抛弃端口映射吧  -- 通过搭建gitlab看看如何使用

这个容器内部包括一个nginx,我们后面做映射的使用没有使用nginx的端口,可以将nginx剔除掉。


3. 映射域名

3.1 群辉反向代理

控制面板 --- 应用程序门户 --- 反向代理设置 --- 新增

docker固定ip,抛弃端口映射吧  -- 通过搭建gitlab看看如何使用

按图填写即可:

  • 名字:随便起个

  • 来源:协议选择http或者https,有条件上https, 主机名填写你需要的域名,端口使用443或者80

  • 目的地:即我们的gitlab应用,协议http,主机名 172.18.0.103,端口8181。


3.2 路由端口映射

此处不再展开, 需要把群辉映射出去。

3.3 ddns

将域名绑定到ip上,也可以使用通配符

docker固定ip,抛弃端口映射吧  -- 通过搭建gitlab看看如何使用

本人使用通配符,这样就方便随时配置域名。

4. 总结

volume 参数的目的是让程序的数据能够保留到我们的群辉中,即使升级版本也能保留。不信你删除掉容器,重新run一个出来看看是不是完全一样的。大家可以百度下“稳定版白群晖升级数据丢失,官方回复说与他们无关”,本人不对事件做任何评论,大家珍惜自己的数据。特别是小公司,一定要舍得花钱招人,有招兼职的也可以联系我哦。

env参数的作用,是让我们对容器的程序进行定制,目的就是让我们能够按照我们的口味用着顺心。

文章可能有遗漏之处,如果有问题大家留言区见docker固定ip,抛弃端口映射吧  -- 通过搭建gitlab看看如何使用 ,大家多多收藏、多多点赞支持,要准备高产了~

完~

展开 收起
31评论

  • 精彩
  • 最新
  • 这么硬核的docker文章,发在这里估计没多少人看。我先打赏吧~

    校验提示文案

    提交
    感谢金主,群晖拿来作为pt工具未免太浪费了~

    校验提示文案

    提交
    收起所有回复
  • [龇牙] 过几天再来个docker compose的文章

    校验提示文案

    提交
    在往下看的人更少了~

    校验提示文案

    提交
    收起所有回复
  • 不明白有何用?

    校验提示文案

    提交
    写的太少,文章结构组织的比较差。总体概念就是多用docker

    校验提示文案

    提交
    收起所有回复
  • 对gitlab不熟,应用场景不说说?

    校验提示文案

    提交
    一般用不到的,除非你是很大的技术部门,很多小组可以在上面交流

    校验提示文案

    提交
    不知道的话说明你在的行业不使用,没必要熟悉它。

    校验提示文案

    提交
    还有5条回复
    收起所有回复
  • 为啥重启容器ip会变化

    校验提示文案

    提交
    你没让他固定,他就按照启动顺序分配。和DHCP类似

    校验提示文案

    提交
    收起所有回复
  • 这本质不还是内网穿透吗?

    校验提示文案

    提交
    完全没关系的两回事~

    校验提示文案

    提交
    收起所有回复
  • 我群辉装的没遇到过ip变化啊

    校验提示文案

    提交
    重启就变化,如果没变的话,可能你就一个容器或者你不知道说的是哪个。

    校验提示文案

    提交
    收起所有回复
  • docker的文章值得买里很少啊,有没有论坛能推荐一下?

    校验提示文案

    提交
    我属于自学的docker,目前也是懂点皮毛。 docker的原理, docker的使用,基本这个流程搜索了点教程看的。

    校验提示文案

    提交
    收起所有回复
  • 通过群辉的界面创建也没问题吧,界面上的网络选择你新建的这个不就可以了

    校验提示文案

    提交
    可以,我比较习惯终端

    校验提示文案

    提交
    创建容器的时候界面不能固定Ip

    校验提示文案

    提交
    收起所有回复
  • 有深度,收藏了

    校验提示文案

    提交
  • 硬,太硬核了 [皱眉]

    校验提示文案

    提交
  • 怎么免费使用 ee版本?

    校验提示文案

    提交
  • 群晖docker还有哪些好的应用?求推荐

    校验提示文案

    提交
  • 80和443端口基本挂得差不多了 [喜极而泣]

    校验提示文案

    提交
  • 大佬……能帮我整一下不 [喜极而泣]

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
264
扫一下,分享更方便,购买更轻松