Gitlab容器化与服务器迁移实践

534 阅读5分钟

因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基础操作

image-20210926111121750.png

拉取镜像,使用docker pull命令拉取远程仓库的镜像到本地 ;

命令格式:docker pull [Registry]/[Repository]/[Image]:[Tag]

重命名镜像,使用docker tag命令“重命名”镜像 ;

命令格式:docker tag [SOURCE_IMAGE](#) [TARGET_IMAGE](#)

查看镜像,使用docker image lsdocker images命令查看本地已经存在的镜像 ;

删除镜像,使用docker rmi命令删除镜像 ;

构建镜像,构建镜像有两种方式。第一种方式是使用docker build命令基于 Dockerfile 构建镜像,也是我比较推荐的镜像构建方式;第二种方式是使用docker commit命令基于已经运行的容器提交为镜像。

Dockerfile常用指令:

image-20210926111823658.png eg:

FROM centos:7COPY 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版本一定要与原版本对应,不然就会出现如下报错:

0bf743af412189eea716170bb2ff33c.png

如果出现该报错,则执行docker-compose down,更换image为对应版本,并将数据卷内容全部删除,避免启动遇到未知错误。

3.2 启动Gitlab服务

在配置文件目录执行,docker-compose up -d

也可以使用-f指定文件路径

接下来Docker会去拉取镜像并启动,启动完成后执行docker ps查看容器状态:

1656045293802.png

容器正常启动,使用浏览器打开:

1656045400801.png 页面正常打开。

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密码重置的过程:

  1. step1:进入gitlab管理后台:gitlab-rails console -e production
  2. step2:检索用户:user=User.where(id: 1).first
  3. step3:重置密码:user.password='${reset_password}'
  4. step4:确认密码:user.password_confirmation='${reset_password}'
  5. 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  查看日志;

四、参考资料

EdgeX Foundry第一弹 容器运行时docker与服务编排