如何配置运行在Docker中的GitLab的外部地址

家里弄了个NAS服务器,在NAS上安装了一个Docker,于是弄了很多内部服务放在Docker上跑。

但是在设置GitLab时遇到了点问题,经过一番折腾,得到这个很简单的处理方式。

先说问题。大多数服务都是基于Web的,会要求暴露出80端口。Docker上有很多服务,IP共用主机的没问题,但是端口必须特别指定,然后映射到容器里的80端口上。

比如这样:

# docker run --detach                       \
    -p 11443:443 -p 11480:80 -p 11422:22    \
    --name gitlab                           \
    --restart always                        \
    -v /gitlab/config:/etc/gitlab           \
    -v /gitlab/logs:/var/log/gitlab         \
    -v /gitlab/data:/var/opt/gitlab         \
    gitlab/gitlab-ce

但是如此设置,GitLab中一旦建立项目后,项目的“克隆”里并不能自动提供合适的地址,只会给出这样的东西:

http://b483cf8abf26/some_projects/project.git

很恶心,不好用!

按照网上的一些文章,据说修改/etc/gitlab/gitlab.rb中的external_url那一行,就可以了。比如修改成:

external_url "http://192.168.1.114:11480"

但是一旦应用修改:

gitlab-ctl reconfigure

服务直接访问不了啦。

怎么回事呢?实际上,这个external_url设置一旦带有端口,服务原本的80端口是会被改成设置的端口的。那么按照创建容器时的设置的-p 11480:80,肯定是不通的。

改一下容器的端口映射,直接-p 11480:11480,OK了。另外注意一下,这个GitLab镜像内部还占用8080端口,所以最好不要用,否则还要配置/etc/gitlab/gitlab.rb文件:

unicorn['port'] = 8800

这个unicorn的端口配置我没有试验过,仅作为笔记摘录。

这样配置好external_url,也只是解决了第一步,项目克隆中的使用HTTP克隆里的地址,使用SSH克隆还不正常,端口不对。怎么改?继续配置/etc/gitlab/gitlab.rb文件:

gitlab_rails['gitlab_shell_ssh_port'] = 11422

好了,重置、重启GitLab:

gitlab-ctl reconfigure
gitlab-ctl restart

这里重启应该是没啥必要性的,多做无过。完事后,克隆里的地址应该都是正常可用的了。

事毕,我们可以查看一下端口信息:

# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 localhost:9229          0.0.0.0:*               LISTEN
tcp        0      0 localhost:9236          0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:8060            0.0.0.0:*               LISTEN
tcp        0      0 localhost:9168          0.0.0.0:*               LISTEN
tcp        0      0 localhost:9187          0.0.0.0:*               LISTEN
tcp        0      0 localhost:9090          0.0.0.0:*               LISTEN
tcp        0      0 localhost:9093          0.0.0.0:*               LISTEN
tcp        0      0 localhost:9121          0.0.0.0:*               LISTEN
tcp        0      0 localhost:8154          0.0.0.0:*               LISTEN
tcp        0      0 localhost:8155          0.0.0.0:*               LISTEN
tcp        0      0 localhost:8153          0.0.0.0:*               LISTEN
tcp        0      0 localhost:8150          0.0.0.0:*               LISTEN
tcp        0      0 localhost:8151          0.0.0.0:*               LISTEN
tcp        0      0 localhost:8092          0.0.0.0:*               LISTEN
tcp        0      0 localhost:8082          0.0.0.0:*               LISTEN
tcp        0      0 localhost:8080          0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:11480           0.0.0.0:*               LISTEN
tcp        0      0 localhost:3000          0.0.0.0:*               LISTEN
tcp        0      0 :::22                   :::*                    LISTEN
tcp        0      0 :::9094                 :::*                    LISTEN
udp        0      0 :::9094                 :::*
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     5584197 /var/opt/gitlab/gitaly/gitaly.socket
unix  2      [ ACC ]     STREAM     LISTENING     5588069 /var/opt/gitlab/gitaly/run/gitaly-306/sock.d/ruby.1
unix  2      [ ACC ]     STREAM     LISTENING     5584198 /var/opt/gitlab/gitaly/run/gitaly-306/sock.d/intern
unix  2      [ ACC ]     STREAM     LISTENING     5573442 /var/opt/gitlab/gitaly/run/gitaly-306/sock.d/ruby.0
unix  2      [ ACC ]     STREAM     LISTENING     5591350 /var/opt/gitlab/postgresql/.s.PGSQL.5432
unix  2      [ ACC ]     STREAM     LISTENING     5609652 /var/opt/gitlab/gitlab-rails/sockets/gitlab.socket
unix  2      [ ACC ]     STREAM     LISTENING     5591983 /var/opt/gitlab/gitlab-workhorse/sockets/socket
unix  2      [ ACC ]     STREAM     LISTENING     5589222 /var/opt/gitlab/redis/redis.socket

因为external_url的配置,GitLab完全没有用到80端口,而是11480

GitLab居然会根据外部地址的端口,指定内部使用的端口,这谁能想到啊。