当前位置:首页 > 工具 > 正文内容

Docker环境GitLab服务器迁移实战

访客 工具 2026年7月1日 1

概述

本文记录的是基于Docker部署的GitLab实例,从一台Linux服务器迁移到另一台服务器的全过程。迁移过程中涉及数据目录同步、容器启动配置以及权限修复等关键步骤。

操作步骤

1. 停止原服务器上的GitLab容器

在源服务器上执行停止命令,确保容器正常关闭后再进行后续操作:

root@source-host:~# docker stop gitlab.corp内部.cn
gitlab.corp内部.cn

2. 同步数据目录到目标服务器

使用rsync命令将GitLab容器所使用的数据存储目录整体传输到新服务器。在局域网环境下,传输速度通常可以达到很高水平:

root@source-host:/mnt/storage01/gitlab# rsync -avz gitlab.corp内部.cn user@192.168.5.88:/mnt/storage01
The authenticity of host '192.168.5.88 (192.168.5.88)' can't be established.
ECDSA key fingerprint is SHA256:AbCdEfGhIjKlMnOpQrStUvWxYz0123456789ABCDEFGHIJ.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.5.88' (ECDSA) to the list of known hosts.
user@192.168.5.88's password: 
sending incremental file list
gitlab.corp内部.cn/
gitlab.corp内部.cn/docker-compose.yml
gitlab.corp内部.cn/config/
gitlab.corp内部.cn/config/gitlab-secrets.json
gitlab.corp内部.cn/config/gitlab.rb
gitlab.corp内部.cn/logs/
gitlab.corp内部.cn/logs/sshd/current
gitlab.corp内部.cn/logs/sshd/lock
gitlab.corp内部.cn/data/

sent 1,023,458,912 bytes  received 201,547 bytes  13,204,587.39 bytes/sec
total size is 5,312,847,118  speedup is 5.19
root@source-host:/mnt/storage01/gitlab# 

3. 验证docker-compose.yml配置文件

在目标服务器上检查docker-compose.yml文件内容,确保路径配置正确:

root@target-host:/mnt/storage01/gitlab.corp内部.cn# vi docker-compose.yml

配置文件内容如下:

version: '3.6'

services:
  web:
    image: 'registry.gitlab.cn/omnibus/gitlab-jh:16.7.6'
    restart: always
    container_name: gitlab.corp内部.cn
    hostname: 'gitlab.corp内部.cn'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://gitlab.corp内部.cn'
        gitlab_rails['gitlab_shell_ssh_port'] = 2224
    ports:
      - '60002:443'
      - '8929:80'
      - '2224:22'
    dns:
      - 192.168.5.254
    volumes:
      - '/mnt/storage01/gitlab.corp内部.cn/config:/etc/gitlab'
      - '/mnt/storage01/gitlab.corp内部.cn/logs:/var/log/gitlab'
      - '/mnt/storage01/gitlab.corp内部.cn/data:/var/opt/gitlab'
      - '/home/certd/gitlab.corp内部.cn:/etc/gitlab/ssl'
    shm_size: '256m'

4. 启动GitLab容器

使用docker-compose命令启动容器:

root@target-host:/mnt/storage01/gitlab.corp内部.cn# docker-compose up -d
Creating network "gitlabcorp_default" with the default driver
Pulling web (registry.gitlab.cn/omnibus/gitlab-jh:16.7.6)...
16.7.6: Pulling from omnibus/gitlab-jh
d66d6a6a3687: Pull complete
69b4e98ec663: Pull complete
33d64feb3e33: Pull complete
92f2674f9018: Pull complete
ef32215ff226: Pull complete
e6ccdd486b58: Pull complete
4475ff4ff63c: Pull complete
7940e6d9c9c9: Pull complete
Digest: sha256:cc8f7b21c95d6b3a4f5e8a9c1d7e3f2b4a6c8d0e2f4a6b8c0d2e4f6a8b0c2d4e
Status: Downloaded newer image for registry.gitlab.cn/omnibus/gitlab-jh:16.7.6
Creating gitlab.corp内部.cn ... done

查看容器运行状态:

root@target-host:/mnt/storage01/gitlab.corp内部.cn# docker ps
CONTAINER ID   IMAGE                                         COMMAND             CREATED              STATUS                                 PORTS                                                                                                                     NAMES
a1923b7c8e55   registry.gitlab.cn/omnibus/gitlab-jh:16.7.6   "/assets/wrapper"   About a minute ago   Up About a minute (health: starting)   0.0.0.0:2224->22/tcp, :::2224->22/tcp, 0.0.0.0:8929->80/tcp, :::8929->80/tcp, 0.0.0.0:60002->443/tcp, :::60002->443/tcp   gitlab.corp内部.cn

5. 处理权限问题

多次检查容器状态,发现容器状态显示为unhealthy:

root@target-host:/mnt/storage01/gitlab.corp内部.cn# docker ps
CONTAINER ID   IMAGE                                         COMMAND             CREATED         STATUS                     PORTS                                                                                                                     NAMES
a1923b7c8e55   registry.gitlab.cn/omnibus/gitlab-jh:16.7.6   "/assets/wrapper"   8 minutes ago   Up 6 minutes (unhealthy)   0.0.0.0:2224->22/tcp, :::2224->22/tcp, 0.0.0.0:8929->80/tcp, :::8929->80/tcp, 0.0.0.0:60002->443/tcp, :::60002:443/tcp   gitlab.corp内部.cn

通过docker logs查看日志,发现关键错误信息:

……很长的日志……
2024-03-19_03:43:09.98701 22197:M 19 Mar 2024 03:43:09.986 # Fatal error loading the DB: Permission denied. Exiting.
……后边还有……

这是由于数据传输过程中文件权限丢失导致的。执行以下命令修复权限:

root@target-host:/mnt/storage01/gitlab.corp内部.cn# docker exec -it gitlab.corp内部.cn update-permissions

该命令执行完成后,重新启动容器:

root@target-host:/mnt/storage01/gitlab.corp内部.cn# docker-compose restart
Restarting gitlab.corp内部.cn ... done
root@target-host:/mnt/storage01/gitlab.corp内部.cn# docker ps
CONTAINER ID   IMAGE                                         COMMAND             CREATED          STATUS                        PORTS                                                                                                                     NAMES
a1923b7c8e55   registry.gitlab.cn/omnibus/gitlab-jh:16.7.6   "/assets/wrapper"   10 minutes ago   Up About a minute (healthy)   0.0.0.0:2224->22/tcp, :::2224->22/tcp, 0.0.0.0:8929->80/tcp, :::8929->80/tcp, 0.0.0.0:60002->443/tcp, :::60002->443/tcp   gitlab.corp内部.cn

容器状态显示为healthy后,即可通过浏览器正常访问GitLab。

6. 配置重新加载

当修改了gitlab.rb配置文件或在Web管理界面更改某些设置后,配置不会立即生效。此时如果直接重启容器,可能会中断用户正在进行的操作。可以通过以下命令在容器内部执行配置重新加载:

gitlab-ctl reconfigure

该命令会重新应用所有配置项,使更改立即生效。

相关文章

Trojan服务器搭建与配置

一、整体架构(先对齐认知)Clash Meta (PC / iOS / Android)        ↓ TLS   Trojan Server (443)        ↓     InternetTrojan 的核心是: TLS + HTTPS 流量伪装 看起来像正常网站 非常适合...

Tailscale 的详细用法

Tailscale 是一种基于 WireGuard 协议 的 零配置 VPN(虚拟私有网络)服务,让设备之间能够 安全、加密地直接连接,就像它们在同一个本地网络一样。它的核心特点是 简单、安全、跨平台。Tailscale 非常适合 没有公网 IP、两台电脑不在同一局域网 的场景。 简单来说,Tailscale 是什么?Tailscale 是一款让你的各种设备(电脑、服务器、手机...

Clash Tun 模式 导致 爱快(iKuai SD-Wan)内网域名无法访问

一、Clash  DNS 配置dns:  enable: true  listen: 0.0.0.0:53  ipv6: true  enhanced-mode: redir-host  nameserver:    - 223.5.5.5    - 223.6.6.6iKuai 内网域名 ...

深入解析Node.js运行环境与异步I/O架构

深入解析Node.js运行环境与异步I/O架构

核心定义与价值Node.js本质上是一个JavaScript运行环境,而非编程语言或应用框架。它赋予了JavaScript脱离浏览器在服务端、命令行工具及网络应用中执行的能力。其核心意义在于:用单一语言打通前后端开发壁垒。基于事件驱动与非阻塞I/O的架构特性,Node.js在处理API网关、实时通信及微服务等I/O密集型场景时表现卓越,已成为现代后端工程的主流选择。浏览器沙箱限制1995年Java...

ADO.NET SQL参数化查询的最佳实践

在 ADO.NET 中执行 SQL 查询时,参数化查询是一种关键的安全措施和性能优化手段。它通过将 SQL 命令和用户提供的数据分开处理,有效防止了 SQL 注入攻击,并有助于数据库缓存执行计划。下面总结了几种常用的参数化查询方式。 1. 使用 SqlParameter 对象(推荐) 这是最推荐的参数化查询方式。通过显式创建 SqlParameter 对象,您可以精确控制参数的类...

基于ELK的日志集中化分析系统搭建

构建统一日志管理平台的必要性 在分布式架构中,各服务节点独立运行,日志分散存储于不同主机。传统通过命令行工具如grep、awk逐个检索日志的方式,在数据量庞大时效率极低,难以实现快速定位问题。为提升运维效率,需建立集中式日志处理体系,具备日志采集、传输、存储、分析与告警能力。 ELK技术栈核心组件解析 Elasticsearch:分布式搜索引擎,支持全文检索、实时数据分析和高可用集群部署,...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。