1. 备份
a)查看Docker的目录映射
使用 docker container ls 命令,查看服务器上的容器清单,找到gitlab的容器的ID(CONTAINER ID)和镜像的名称(NAMES)。
[root@iZuf6hvskoa8hddrc49em0Z ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b44059c3e4e4 gitlab/gitlab-ce "/assets/wrapper" 4 months ago Up 2 months (unhealthy) 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:222->22/tcp, :::222->22/tcp, 0.0.0.0:8001->80/tcp, :::8001->80/tcp gitlab
使用命令 docker inspect [<CONTAINER ID> | <NAMES>] | grep Mounts -A 30 获取目录映射信息,具体如下所示:
[root@iZuf6hvskoa8hddrc49em0Z ~]# docker inspect gitlab | grep Mounts -A 30
"Mounts": [
{
"Type": "bind",
"Source": "/home/gitlab/logs",
"Destination": "/var/log/gitlab",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/home/gitlab/data",
"Destination": "/var/opt/gitlab",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/home/gitlab/config",
"Destination": "/etc/gitlab",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
上述输出结果中,有三个目录映射,其中 Source是服务器目录,Destination是docker内部目录。稍候,在新的服务器中,我们需要手动创建这三个Source目录。
b)数据备份
逐一执行下列命令,完成 gitlab 的数据备份。
1)开启一个交互模式的终端
[root@iZuf6hvskoa8hddrc49em0Z ~]# docker exec -it gitlab /bin/bash
root@dev:/#
2)进入备份文件存放目录,删除原有的备份文件
root@dev:/# cd /var/opt/gitlab/backups
root@dev:/var/opt/gitlab/backups# rm * -f
3)备份 Gitlab 数据
root@dev:/var/opt/gitlab/backups# gitlab-rake gitlab:backup:create
4)查看备份文件
root@dev:/var/opt/gitlab/backups# ls
1636968437_2021_11_15_14.0.1_gitlab_backup.tar
5)停止 Gitlab 服务
root@dev:/var/opt/gitlab/backups# gitlab-ctl stop
ok: down: alertmanager: 0s, normally up
ok: down: gitaly: 0s, normally up
ok: down: gitlab-exporter: 0s, normally up
ok: down: gitlab-workhorse: 0s, normally up
ok: down: grafana: 1s, normally up
ok: down: logrotate: 0s, normally up
ok: down: nginx: 0s, normally up
ok: down: postgres-exporter: 1s, normally up
ok: down: postgresql: 0s, normally up
ok: down: prometheus: 1s, normally up
ok: down: puma: 0s, normally up
ok: down: redis: 0s, normally up
ok: down: redis-exporter: 1s, normally up
ok: down: sidekiq: 1s, normally up
ok: down: sshd: 0s, normally up
2. 安装Gitlab服务
a)创建目录
执行下列命令创建目录映射用的目录
[root@iZuf67tb9ohgwgpdsddvloZ ~]# mkdir /home/gitlab
[root@iZuf67tb9ohgwgpdsddvloZ ~]# mkdir /home/gitlab/data
[root@iZuf67tb9ohgwgpdsddvloZ ~]# mkdir /home/gitlab/logs
[root@iZuf67tb9ohgwgpdsddvloZ ~]# mkdir /home/gitlab/config
b)获取原Gitlab服务的版本
通过备份还原的方式,必须确保新服务器上的Gitlab版本与原来一致。
1)获取原 Gitlab 服务的版本号
[root@iZuf67tb9ohgwgpdsddvloZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gitlab/gitlab-ce 14.0.1-ce.0 f85d08f83476 4 months ago 2.21GB
如上面的TAG信息就是版本号,但是,很多情况下,安装时未指定版本号,而是默认安装最新版本,此时 docker images 返回的 TAG 如下所示:
[root@iZuf6hvskoa8hddrc49em0Z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gitlab/gitlab-ce latest f85d08f83476 4 months ago 2.21GB
sonatype/nexus3 latest 9bcc23eff098 4 months ago 701MB
nginx latest 4f380adfc10f 4 months ago 133MB
这种情况下,执行 docker inspect <IMAGE ID> 命令,如下:
[root@iZuf6hvskoa8hddrc49em0Z ~]# docker inspect f85d08f83476
[
{
"Id": "sha256:f85d08f83476fbe330906892b2817339c99e02901ac9a35479c5e2db334e64c0",
"RepoTags": [
"gitlab/gitlab-ce:latest"
],
"RepoDigests": [
"gitlab/gitlab-ce@sha256:3689c780a6a621298911992a5a475a35e44ea2215cc5b4498272cab9e5c206b2"
],
获取RepoDigests中sha256:之后的12位字符(本案里是:3689c780a6a6),去 Docker Hub查找相应的版本号。
在查询内容框中输入 docker images 返回结果中的REPOSITORY,这里就是 gitlab/gitlab-ce,获得如下查询结果:
点击 gitlab/gitlab-ce ,进入明细界面,然后点击 TAG 标签,如下:
与查询结果中的DIGEST逐一匹配之前获取的前12位字符(3689c780a6a6)。为了加快查找速度,关注一下 Docker Image 命令输出的CREATED列,从这个时间点着手,可以省去很多时间。找到相关记录后,其TAG值就是版本号。本案例结果如下(14.0.1-ce.0):
c)拉取 Gitlab的Docker镜像
[root@iZuf67tb9ohgwgpdsddvloZ ~]# docker pull gitlab/gitlab-ce:14.0.1-ce.0
d)启动 gitlab
docker run --detach \
--privileged=true \
--hostname dev.company.com \
--publish 443:443 --publish 8001:80 --publish 2222:22 \
--name gitlab --restart always \
--volume /home/gitlab/config:/etc/gitlab \
--volume /home/gitlab/logs:/var/log/gitlab \
--volume /home/gitlab/data:/var/opt/gitlab f85d08f83476
上面命令中各参数解释:
1)privileged=true,给容器加上宿主机root权限,否则可能会报权限不足导致启动失败
2)hostname为docker服务器的主机名
3)端口映射依实际情况设定,例如:8001:80表示宿主服务器端口8001映射Docker的80端口
4)restart always表示当docker关闭时,自动重启
5)volume三个卷的设置就是之前的目录映射
6)f85d08f83476为IMAGE ID。
注意:2222端口号不可以改变,否则,IDEA可以PULL但PUSH失败,会报401错误
e)查看日志
如果启动失败,可以使用下列命令查看日志
[root@iZuf67tb9ohgwgpdsddvloZ ~]# docker logs -n20 gitlab
其中,20表示希望显示20条日志记录
3. 数据还原
a)复制备份文件
在原服务器上通过下列命令将备份文件复制到目标服务器的 /var/opt/gitlab/backups 目录下
[root@iZuf67tb9ohgwgpdsddvloZ ~]# docker exec -it gitlab /bin/bash
root@dev:/# cd /var/opt/gitlab/backups
root@dev:/var/opt/gitlab/backups# ls
1636955947_2021_11_15_14.0.1_gitlab_backup.tar
root@dev:/var/opt/gitlab/backups# scp 16*.tar root@100.100.100.100:/home/gitlab/data/backups
其中,16*.tar是指向备份文件,100.100.100.100是目标服务器的地址。终端会要求输入目标服务器的密码,输入密码回车后,文件即会复制到指定目录。
b)还原文件
1)进入目标服务器容器
[root@iZuf67tb9ohgwgpdsddvloZ ~]# docker exec -it gitlab /bin/bash
2)关闭数据连接服务
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
3)定位到备份文件所在目录
cd /var/opt/gitlab/backups
4)对备份文件授权,否则会还原时会报错
chmod 777 *
5)执行下列命令,恢复数据
gitlab-rake gitlab:backup:restore BACKUP=1636955947_2021_11_15_14.0.1
其中,BAKUP后的内容是备份文件名中的"_gitlab"字符前的内容。
6)复制配置文件
执行下列命令可以从原服务器上将gitlab的配置文件 gitlab.rb 和gitlab-secrets.json 复制到目标服务器的 /home/gitlab/config 目录下
root@dev:/# exit
exit
[root@iZuf67tb9ohgwgpdsddvloZ ~]# cd /home/gitlab/config
[root@iZuf67tb9ohgwgpdsddvloZ config]# ls
gitlab.rb gitlab-secrets.json initial_root_password ssh_host_ecdsa_key ssh_host_ecdsa_key.pub ssh_host_ed25519_key ssh_host_ed25519_key.pub ssh_host_rsa_key ssh_host_rsa_key.pub trusted-certs
[root@iZuf67tb9ohgwgpdsddvloZ config]# scp gitlab.rb root@100.100.100.100:/home/gitlab/config
[root@iZuf67tb9ohgwgpdsddvloZ config]# scp gitlab-secrets.json root@100.100.100.100:/home/gitlab/config
其中,exit是用来从docker中退出的命令。
7)重新加载配置
gitlab-ctl reconfigure
8)完成数据恢复后,重启服务即可
gitlab-ctl start