CentOS8 使用 Docker 部署 GitLab-CE

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

2021-07-05
更新:

  1. 系统升级为CentOS8
  2. 因为GitLab新版本直接支持了中文且GitLab-CE-CN一直没有更新,故而镜像换成了GitLab-CE
  3. redis 升级为最新版
  4. 实践中发现默认源安装的pip版本安装docker-compose时必然出错,故而加入更新pip步骤
  5. 实际使用过程中发现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
2
sudo yum install -y python3-pip
python3 -m pip install -U pip

安装 Docker Compose

1
sudo pip3 install docker-compose

验证安装

1
docker-compose version

正确输出如下

安装 Redis 和 GitLab

Network

我这边预计会复用Redis,所以要创建单独的Redis镜像,那么在创建之前,需要先见一个 network 用于将多个镜像放置在同一网络环境下。(如果局域网中已经存在对应网段,请自行替换)

1
2
3
4
5
6
sudo docker network create \
--driver=bridge \
--subnet=192.112.0.0/16 \
--ip-range=192.112.5.0/24 \
--gateway=192.112.5.254 \
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
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
52
version: '3'
services:
gitlab-ce:
image: 'gitlab/gitlab-ce:13.0.14-ce.0'
container_name: gitlab-ce
restart: unless-stopped
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.apukj.com'
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/5216854__apukj.com.pem"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/5216854__apukj.com.key"
gitlab_rails['time_zone'] = 'Asia/Shanghai'

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = 'smtp.exmail.qq.com'
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = 'admin@apukj.com'
gitlab_rails['smtp_password'] = 'FmSM8juiYywqJnXv'
gitlab_rails['smtp_domain'] = 'smtp.exmail.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'] = 'admin@apukj.com'
gitlab_rails['gitlab_email_display_name'] = '阿铺科技源码服务'
gitlab_rails['gitlab_email_reply_to'] = 'admin@apukj.com'
user["git_user_email"] = 'admin@apukj.com'
#修改sidekiq的数量,减少内存占用,默认为15,也可以不填
sidekiq['concurrency'] = 10
#使用外部redis所需设置,根据刚刚生成的redis设置修改
gitlab_rails['redis_port'] = 6379
gitlab_rails['redis_host'] = 'db-redis'
gitlab_rails['redis_password'] = 'edHtDM44XbOzsQcEXlaR'
gitlab_rails['redis_database'] = '1'
#因为22端口被占用,修改映射的端口号时,同时修改在Gitlab项目中的ssh地址加上端口号
gitlab_rails['gitlab_shell_ssh_port'] = 24
ports:
- '80:80'
- '443:443'
- '24:22'
- '5432:5432'
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 。

欢迎关注我的其它发布渠道