参考:
- docker拉取gitlab社区版
1 | sh复制代码docker pull gitlab/gitlab-ce:latest |
查看是否拉取成功
1 | sh复制代码[root@test gitlab] docker images |
- 使用容器卷将数据映射到本地并运行
宿主机位置 | 容器位置 | 作用 |
---|---|---|
/usr/local/gitlab/config | /etc/gitlab | 用于存储 GitLab 配置文件 |
/usr/local/gitlab/logs | /var/log/gitlab | 用于存储日志 |
/usr/local/gitlab/data | /var/opt/gitlab | 用于存储应用数据 |
在宿主机创建映射目录
1 | sh复制代码[root@test ~] mkdir -p /usr/local/gitlab/config #递归创建目录,即使上级目录不存在,会按目录层级自动创建目录 |
3.1 创建方法一
创建gitlab_start.sh
文件
1 | sh复制代码[root@test gitlab] touch gitlab_start.sh |
编写内容
1 | sh复制代码#!/bin/sh |
参数说明:
–detach: 设置容器后台运行
–hostname: 设置容器的 hostname,如果是本地localhost ,否则使用外网ip
–publish: 端口转发规则(80:Http 访问端口,443:Https 访问端口,10080:主机的 ssh 访问端口,22:Docker 容器中 ssh 访问端口)
–name:容器名称
–restart always:每次启动容器就重启GitLab
–volume: 共享目录挂载,即 docker 容器内外数据共享
–e:配置 Gitlab 运行的环境变量
在该文件目录下,授予gitlab_start.sh
执行权限
1 | sh复制代码chmod +x gitlab_start.sh |
1 | sh复制代码./gitlab_start.sh #执行脚本 |
可能遇到的错误
1 | sh复制代码[root@test gitlab] ./gitlab_start.sh |
要注意端口是否被占用
1 | sh复制代码[root@test gitlab] netstat -ntulp | grep 80 #查看所有80端口使用情况 |
修改gitlab_start.sh
文件,将映射到宿主机的端口改为8088
,或者其它没被占用的端口
1 | sh复制代码 --publish 443:443 --publish 8088:80 --publish 10080:22 \ |
重新运行./gitlab_start.sh
文件,报错如下
1 | sh复制代码[root@test gitlab] ./gitlab_start.sh |
这是因为之前的容器虽然没有运行起来,但是已经创建了,把它删除掉
1 | sh复制代码[root@test gitlab] docker ps -a |
1 | sh复制代码[root@test gitlab] docker rm 000d |
重新运行gitlab_start.sh
文件
1 | sh复制代码[root@test gitlab] ./gitlab_start.sh |
可以看到容器成功启动
3.2创建方法二
创建docker-compose.yml
文件,并在该文件所在的文件夹目录下运行docker-compose up -d
需要事先安装docker-compose
1 | sh复制代码version: '2' |
注:端口和映射目录可根据需要修改
若开放访问端口为80
,external_url
可不加端口号,默认80
- 修改gitlab配置文件(方法一需要)
若以3.1方法创建,需要修改相关配置文件
1 | sh复制代码vim /usr/local/gitlab/config/gitlab.rb |
1 | sh复制代码# 改SSH端口为10080,以便不和宿主机22端口冲突 |
4.1 应用配置,重启服务
在Gitlab容器运行状态时,重启服务,并远程访问网站测试
1 | sh复制代码# 进入gitlab bash |
*若访问Gitlab出现502等错误,使用命令检查错误原因
1 | sh复制代码gitlab-rake gitlab:check |
e.g.
1 | sh复制代码Try fixing it: |
查看上述配置文件,查找错误原因
访问GitLab失败错误
虽然容器启动成功,但是却没办法根据ip:port访问gitlab
启动一个tomcat容器测试端口
拉取tomcat镜像
1 | sh复制代码docker pull tomcat:jdk8-openjdk |
为了测试8088端口是否可用,先把gitlab的容器暂停
1 | sh复制代码docker stop gitlab |
启动tomcat容器,并将tomcat容器的8080端口映射到宿主机的8088端口
1 | sh复制代码[root@test ~] docker run -d --name tomcat -p 8088:8080 tomcat:jdk8-openjdk |
一切正常,访问ip:8088,还是和以前一样访问不了
开启防火墙并打开端口
因为之前系统的防火墙一直是关闭的并且其它的服务能正常访问,所以没有怀疑是防火墙的问题
1 | sh复制代码[root@test ~] firewall-cmd --state |
把防火墙打开
1 | sh复制代码[root@test ~] systemctl start firewalld.service |
访问之前能正常访问的服务,果然没法正常访问。
把该服务的端口开发,正常访问。
打开8088端口
1 | sh复制代码[root@test ~] firewall-cmd --permanent --add-port=8088/tcp |
再次访问
返回tomcat的404页面:HTTP Status 404 – Not Found
虽然是404页面,但是说明此时的端口是能正常访问的
再次启动gitlab服务
把tomcat的容器停止运行,重新运行gitlab容器
1 | sh复制代码[root@test ~] docker stop tomcat |
虽然没启动成功,但离成功更进一步了:)
尝试把这个容器删除掉,再创建一次后还是得到这个错误。
1 | sh复制代码[root@test gitlab] systemctl restart docker |
还是访问不了,检查一下GitLab内部是否有问题
1 | sh复制代码[root@test gitlab] docker ps |
一切正常
我再次换成tomcat容器进行测试,发现8088端口访问不了了。
但是在宿主机内ping本机是可以的
1 | sh复制代码[root@test tomcat] curl localhost:8088 |
但是,换成ip:8088则不行
问题转移:为什么访问不了容器内的服务
参考
根据以上两篇文章,提出阿里云的内网eth0 网段正好跟Docker 的虚拟网卡都是 172 网段,有冲突
观察发现我使用的云服务器也是阿里云,并且通过ifconfig
查看
1 | sh复制代码[root@test config] ifconfig |
并且查看阿里云的内网ip确实也是172
开头。
编辑配置文件/etc/docker/daemon.json
,若daemon.json
文件不存在新建即可。
1 | json复制代码{ |
重新启动docker服务
1 | sh复制代码systemctl restart docker |
1 | sh复制代码[root@test docker]# ifconfig |
可以看到docker0 的地址变了。
但是要注意,使用docker启动的服务会默认使用docker0,如果是用docker-compose启动的服务则不会。上面的br-12aa369ee4a6对应的是docker-compose启动的服务,可以看到还是172的网段。
docker-compose up使用自定义的网段的两种方式(从其根源指定)
根据该文使用方法2,即修改daemon.json
。但并不能成功访问,我的环境是:docker:20.10.7,docker-compose:1.24.1
1 | sh复制代码{ |
后面发现访问不成功的原因在于docker与防火墙之间的关系,可以关掉防火墙,开启docker,不能访问则打开防火墙。在它们之间来回试探 = =。
后面尝试过关闭firewalld,打开iptables。
在启用iptables时,一般关掉iptables可以正常访问,打开则不能正常访问。
在启用firewalld时,按照docker和firewalld之间启动关闭的顺序不同,有时是开着防火墙能访问,有时是关了防火墙能访问。
但是容器内不能访问外部网络,该问题现在还未解决。
有一种迂回的解决方法就是容器使用host网络模式
问题:怀疑是docker,firewalld与iptables之间的设置问题
还有一种访问不了GitLab的情况是端口映射和配置文件有误。
快速的解决方法:将宿主机端口号和容器号设置相同,可参考下面的博客。
利用GitLab Docker images安装GitLab(填坑)
总结
如果系统环境正常,安装会十分顺利,一般不会有奇怪的问题。
我在不同的服务器安装过
阿里云 CentOS 7.6: 访问正常,但是因内存不够出现502错误,容器内可正常连接外部网络
阿里云 Alibaba Cloud Linux 2: 可能不能正常访问容器,容器内不能正常连接外部网络。怀疑是防火墙与docker的问题。
本文转载自: 掘金