Ubuntu 20.04 已有运行中Apache时部署Docker版GitLab的端口冲突解决
端口冲突调整方案
核心思路
现有Apache已经完全占用宿主机80、443端口承载多站点业务,调整全程不需要改动原有站点的任何配置,也不会中断现有业务,实现逻辑为:
- 将GitLab容器的HTTP、SSH端口映射到宿主机未被占用的高端口,且仅绑定本地回环地址,避免端口直接暴露公网
- 给GitLab分配独立的访问域名,在Apache的现有虚拟主机体系中新增对应域名的分流规则,将该域名的流量转发到GitLab容器对应的本地端口
- 调整GitLab内部配置匹配外部访问的域名、SSH端口,避免页面跳转、SSH克隆等功能异常
第一步:重新创建GitLab容器
先删除之前创建失败的临时容器,调整端口映射规则:
# 强制删除之前启动失败的gitlab容器 sudo docker rm -f gitlab # 重新启动容器,端口映射规则:宿主机本地回环8080对应容器80(HTTP)、本地回环2222对应容器22(SSH),无需额外映射8443端口,因为流量全走Apache代理入口 sudo docker run --detach \ --hostname gitlab.hostname.de \ --publish 127.0.0.1:8080:80 --publish 127.0.0.1:2222:22 \ --name gitlab \ --restart always \ --volume $GITLAB_HOME/config:/etc/gitlab \ --volume $GITLAB_HOME/logs:/var/log/gitlab \ --volume $GITLAB_HOME/data:/var/opt/gitlab \ gitlab/gitlab-ee:latest
注意:映射时必须指定绑定127.0.0.1,不要直接绑定0.0.0.0,否则高端口会直接暴露到公网,存在安全风险
等待容器启动后,修改GitLab的核心配置文件(路径为$GITLAB_HOME/config/gitlab.rb),修改以下参数:
external_url 'http://gitlab.hostname.de':替换为你给GitLab分配的独立访问域名,不要附带端口号gitlab_rails['gitlab_shell_ssh_port'] = 2222:告知GitLab对外提供SSH服务的端口是宿主机映射的2222,避免Git仓库SSH连接端口错误
修改完成后执行配置重加载命令让规则生效:
sudo docker exec -it gitlab gitlab-ctl reconfigure
第二步:配置Apache反向代理规则
先开启Apache需要的反向代理、重写相关模块:
sudo a2enmod proxy proxy_http headers rewrite ssl sudo systemctl restart apache2
在Apache的站点配置目录(/etc/apache2/sites-available/)下新增GitLab对应的虚拟主机配置文件,比如命名为gitlab.conf,写入以下内容:
# 承接80端口的HTTP请求,统一重定向到HTTPS <VirtualHost *:80> ServerName gitlab.hostname.de RewriteEngine on RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L] </VirtualHost> # 承接443端口的HTTPS请求,反向代理到GitLab容器 <VirtualHost *:443> ServerName gitlab.hostname.de # 复用Apache现有全局/其他站点的SSL证书配置,无需单独为GitLab申请证书 SSLEngine on SSLCertificateFile /你的现有证书路径/fullchain.pem SSLCertificateKeyFile /你的现有证书路径/privkey.pem # 反向代理转发规则 ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ ProxyPreserveHost On # 修正请求头标记,让GitLab正确识别HTTPS访问 RequestHeader set X-Forwarded-Proto "https" RequestHeader set X-Forwarded-Ssl on </VirtualHost>
配置检查无误后启用站点并重载Apache:
# 检查配置语法是否正确 sudo apache2ctl configtest # 启用gitlab站点配置 sudo a2ensite gitlab.conf # 重载Apache,不中断现有业务 sudo systemctl reload apache2
注意事项
- 启动容器前先检查端口占用:执行
sudo ss -tulnp | grep -E '8080|2222',确认对应端口未被其他进程占用 - GitLab第一次初始化需要3-5分钟,容器启动后不要立刻访问,等初始化完成后再测试域名访问
- 现有Apache上的其他站点配置不需要做任何修改,新增的虚拟主机只会匹配对应GitLab域名的流量,不会影响原有站点业务
- 如果需要GitLab使用独立域名的HTTPS证书,只需要把gitlab.conf里的证书路径替换成对应域名的证书路径即可
内容的提问来源于stack exchange,提问作者webGuy
相关产品推荐
相关产品推荐

