因Gitlab资源占用较多,且云服务资源有限,拟迁移Gitlab至物理服务器。本文记录服务迁移过程。
一、容器化基础
1.1 Docker安装
step 1:卸载已有资源 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
.
step 2:添加 Docker 安装源 yum-config-manager \ --add-repo \ <https://download.docker.com/linux/centos/docker-ce.repo>
.
如果提示yum-config-manager
不存在,执行yum -y install yum-utils
.
step 3: 安装最新版本Docker yum install docker-ce docker-ce-cli containerd.io
.
如果想要安装指定版本的Docker,可以使用以下命令:
yum list docker-ce --showduplicates | sort -r
.
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
.
step 4: 启动docker
systemctl start docker
启动完成后,运行hello world容器,检查是否安装正确,命令如下:
docker run hello-world
Docker 首先会检查本地是否有hello-world
这个镜像,如果发现本地没有这个镜像,Docker 就会去 Docker Hub
官方仓库下载此镜像,然后运行它。最后输出 "Hello from Docker!
" 并退出。
如需卸载docker,执行yum -y remove docker-engine
,,如需删除镜像、容器、卷以及自定义文件,可执行以下命令:
rm -rf /var/lib/docker
1.2 Docker基础操作
拉取镜像,使用docker pull命令拉取远程仓库的镜像到本地 ;
命令格式:docker pull [Registry]/[Repository]/[Image]:[Tag]
重命名镜像,使用docker tag命令“重命名”镜像 ;
命令格式:docker tag [SOURCE_IMAGE](#) [TARGET_IMAGE](#)
查看镜像,使用docker image ls
或docker images
命令查看本地已经存在的镜像 ;
删除镜像,使用docker rmi
命令删除镜像 ;
构建镜像,构建镜像有两种方式。第一种方式是使用docker build
命令基于 Dockerfile
构建镜像,也是我比较推荐的镜像构建方式;第二种方式是使用docker commit
命令基于已经运行的容器提交为镜像。
Dockerfile
常用指令:
eg:
FROM centos:7
COPY nginx.repo /etc/yum.repos.d/nginx.repo
RUN yum install -y nginx
EXPOSE 80
ENV HOST=iotnginx
CMD ["nginx","-g","daemon off;"]
第一行表示基于 centos:7 这个镜像来构建自定义镜像。这里需要注意,每个 Dockerfile 的第一行除了注释都必须以 FROM 开头。
第二行表示拷贝本地文件 nginx.repo
文件到容器内的 /etc/yum.repos.d
目录下。这里拷贝 nginx.repo
文件是为了添加 nginx 的安装源。
第三行表示在容器内运行yum install -y nginx
命令,安装 nginx 服务到容器内,执行完第三行命令,容器内的 nginx 已经安装完成。
第四行声明容器内业务(nginx)使用 80 端口对外提供服务。
第五行定义容器启动时的环境变量 HOST=iotnginx
,容器启动后可以获取到环境变量 HOST 的值为 iotnginx。
第六行定义容器的启动命令,命令格式为 json 数组。这里设置了容器的启动命令为 nginx ,并且添加了 nginx 的启动参数 -g 'daemon off;' ,使得 nginx 以前台的方式启动。
1.3 单机服务编排入门
单机服务编排工具Docker-compose,这里我们介绍他的安装与基础命令。
curl -L "https://github.com/docker/compose/releases/download/${release_tag}/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
替换release_tag为对应版本,这里我们使用最新的v2.6.0.
curl -L "https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
常用命令:
- 启动:
docker-compose up -d
注意这里需要在yml配置文件路径执行,其他路径执行需要-f指定配置文件地址。 - 查看日志:
docker-compose logs -f ${compose-contatainer-name}
- 停止:
docker-compose stop
- 停止并删除容器:
docker-compose down
- 其他命令帮助:
docker-compose --help
深入学习容器化与服务编排,请查阅参考资料。
二、数据备份
Gitlab安装过程在迁移模块体现,备份将直接使用容器能力。
# 进入容器
docker exec -it e01d316eea0f /bin/bash
# 停止数据连接服务
> gitlab-ctl stop unicorn
> gitlab-ctl stop sidekiq
# 备份数据
> gitlab-rake gitlab:backup:create
宿主机会在数据卷中生成备份文件1655967173_2022_06_23_14.3.3_gitlab_backup.tar
.
三、服务迁移
之前我们已经安装好了Docker与Docker-Compose,现在我们进入Gitlab的安装与迁移工作。
3.1 定义Docker-Compose配置文件
version: '2'
services:
gitlab:
image: 'gitlab/gitlab-ce:14.3.3-ce.0'
restart: 'no'
hostname: 'cqbdri'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
# 注意这里不要写端口
external_url 'http://192.168.16.10'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
ports:
- '8002:80'
- '2222:22'
volumes:
- /home/gitlab/config:/etc/gitlab
- /home/gitlab/data:/var/opt/gitlab
- /home/gitlab/log:/var/log/gitlab
这里主要注意端口映射和数据卷,另外需要注意Gitlab版本一定要与原版本对应,不然就会出现如下报错:
如果出现该报错,则执行docker-compose down
,更换image
为对应版本,并将数据卷内容全部删除,避免启动遇到未知错误。
3.2 启动Gitlab服务
在配置文件目录执行,docker-compose up -d
也可以使用-f
指定文件路径
接下来Docker会去拉取镜像并启动,启动完成后执行docker ps查看容器状态:
容器正常启动,使用浏览器打开:
页面正常打开。
3.3 数据恢复
将之前生成的备份文件,上传到gitlab的backup目录:
mv 1655967173_2022_06_23_14.3.3_gitlab_backup.tar /home/gitlab/back/backups
# 进入到容器中 docker exec -it6a95bb75f3a2 /bin/bash
# 停止数据连接服务
> gitlab-ctl stop unicorn
> gitlab-ctl stop sidekiq
# 恢复数据
> gitlab-rake gitlab:backup:restore BACKUP=1655967173_2022_06_23_14.3.3
# 恢复完成后,重启服务
> gitlab-ctl restart
使用原账号登录Gitlab,检查代码仓库是否存在。
3.4 重置root密码
服务重置后,账户信息也会保留,但存在root账户无法登录的情况,这里我们也记录下root密码重置的过程:
- step1:进入gitlab管理后台:
gitlab-rails console -e production
- step2:检索用户:
user=User.where(id: 1).first
- step3:重置密码:
user.password='${reset_password}'
- step4:确认密码:
user.password_confirmation='${reset_password}'
- step5:保存:
user.save!
3.5 Gitlab常用命令
在使用阶段,可能遇到各类未知问题,为方便问题排查,这里记录Gitlab常用的原生命令:
- gitlab-ctl start 启动所有 gitlab 组件;
- gitlab-ctl stop 止所有 gitlab 组件;
- gitlab-ctl restart 重启所有 gitlab 组件;
- gitlab-ctl status 查看服务状态;
- gitlab-ctl reconfigure 启动服务;
- vim /etc/gitlab/gitlab.rb 修改默认的配置文件;
- gitlab-rake gitlab:check SANITIZE=true --trace 检查gitlab;
- gitlab-ctl tail 查看日志;