CentOS7 使用 Docker 部署 GitLab-CE-CN

最近需要在公司的CentOS7服务器上部署一套GitLab服务,打算采用Docker来完成,记录一下部署过程。

安装 Docker 与 Docker Compose

安装 Docker

卸载旧版本(新机可忽略)

1
2
3
4
5
6
7
8
sudo yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

安装所需包

1
2
3
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

配置仓库

1
2
3
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

安装 Docker Engine Community

安装最新版本的 Docker Engine-Community 和 containerd

1
2
3
sudo yum install -y docker-ce \
docker-ce-cli \
containerd.io

如果提示接受 GPG 密钥,选yes。

启动 Docker

1
sudo systemctl start docker

验证安装

1
2
sudo docker -v
sudo docker run hello-world

正确输出如下

安装 Docker Compose

安装企业Linux的额外软件包

1
sudo yum install -y epel-release

安装 python3-pip

1
sudo yum install -y python3-pip

安装 Docker Compose

1
sudo pip3 install docker-compose

验证安装

1
docker-compose version

正确输出如下

安装 Redis 和 GitLab

Network

我这边预计会复用Redis,所以要创建单独的Redis镜像,那么在创建之前,需要先见一个 network 用于将多个镜像放置在同一网络环境下。

1
sudo docker network create net_default

Redis

下面创建 Redis,我这里使用 Docker Compose 来完成。
新建一个文件夹并将其重命名为 Redis,在 Redis 文件夹中创建 config 文件夹,而后在 config 文件夹中创建 Redis 的配置文件 redis.conf

1
2
3
4
#redis的databases数量
databases 32
#redis密码
requirepass qm4Cqd3srYK0MHTPEZmf

在 Redis 目录中新建 docker-compose.yml 脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3'
services:
redis:
image: redis:4.0.8-alpine
container_name: db-redis
restart: always
ports:
- 6379:6379
networks:
- net_default
volumes:
- ./config:/docker/config
- ./data:/data
command: redis-server /docker/config/redis.conf
networks:
net_default:
external: true

然后在 docker-compose.yml 所在目录下
接下来,在 docker-compose.yml 所在目录运行 docker-compose:

1
docker-compose up -d

GitLab

新建一个文件夹并将其重命名为 GitLab,在 GitLab 文件夹中创建 config 文件夹,在 config 文件夹中创建 ssl 文件夹,而后将我们的 SSL 证书拷贝到 ssl 目录中。

而后回到 GitLab 文件夹开始编写我们的 docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
version: '3'
services:
gitlab:
image: 'twang2218/gitlab-ce-zh:latest'
container_name: gitlab
restart: unless-stopped
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.xxxxxx.com'
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/ssl_certificate.pem"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/ssl_certificate_key.key"
gitlab_rails['time_zone'] = 'Asia/Shanghai'
#以下为启用邮件SMTP相关设置,我用的QQ邮箱
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = 'smtp.qq.com'
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = 'xxxxxx@qq.com'
gitlab_rails['smtp_password'] = 'ruqajdavfihndcad'
gitlab_rails['smtp_domain'] = 'smtp.qq.com'
gitlab_rails['smtp_authentication'] = 'login'
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'xxxxxx@qq.com'
gitlab_rails['gitlab_email_display_name'] = 'GitLab'
gitlab_rails['gitlab_email_reply_to'] = '3347611871@qq.com'
user["git_user_email"] = 'xxxxxx@163.com'
#修改sidekiq的数量,减少内存占用,默认为15,也可以不填
sidekiq['concurrency'] = 10
#使用外部redis所需设置,根据刚刚生成的redis设置修改
gitlab_rails['redis_port'] = 6379
gitlab_rails['redis_host'] = 'db-redis'
gitlab_rails['redis_password'] = 'qm4Cqd3srYK0MHTPEZmf'
gitlab_rails['redis_database'] = '1'
#因为22端口被占用,修改映射的端口号时,同时修改在Gitlab项目中的ssh地址加上端口号
gitlab_rails['gitlab_shell_ssh_port'] = 23
ports:
- '80:80'
- '443:443'
- '23:22'
networks:
- net_default
volumes:
- ./config:/etc/gitlab
- ./data:/var/opt/gitlab
- ./logs:/var/log/gitlab
networks:
net_default:
external: true

接下来,在 docker-compose.yml 所在目录运行 docker-compose:

1
docker-compose up -d


至此,我们完成了使用 Docker 搭建 GitLab 的全过程,直接访问HTTP对应服务器的80/443端口接口即可:

踩坑记录

docker端口映射或启动容器时报错Error response from daemon: driver failed programming external connectivity on endpoint

docker服务启动时定义的自定义链DOCKER由于某种原因被清掉
重启docker服务及可重新生成自定义链DOCKER

1
systemctl restart docker

SMTP 验证失败

163、QQ等邮箱在开启了授权码之后,需要使用授权码做协议登陆。

阿里云,启动以后无法通过外部访问

首先需要排除防火墙问题,firewall 和 iptables 均需要处理,处理后如果仍然不行,那可能是阿里云自身的安全策略问题,需要在管理后台设置。

阿里云,邮件无法发送

可能是阿里云对 25 端口做了屏蔽,可以按照我给出的配置,使用 SSL 的 SMTP 端口 465 。