Ubuntu服务器上使用docker-compose部署 gitlab(图文并茂记录)

为何使用docker-compose进行GitLab的部署安装

原因:docker-compose便于对GitLab 容器进行资源控制进行(如优化节省服务器资源、便捷删除等)

GitLab本身是一个笨重的应用服务,一般来说,需要4核CPU和8GB内存才能正常运行,再低一些也行,不过需要把gitlab自带的一些功能服务给进行优化,比如有:

    1. Puma Worker Processes(处理HTTP请求,网页访问、API调用等)调低一些
    1. Sidekiq Max Concurrency (后台任务并发)也调低一些
    1. Prometheus Monitoring(监控系统)直接关掉------监控系统方案有很多,不用也无妨,甚至可以直接使用命令行查看监控
    1. 数据库优化(减少PostgreSQL缓冲区)、Redis内存限制(限制缓存使用)、邮件功能关闭、Gitaly优化、Git操作限制等...

编写docker-compose.yml

比如这里是使用12345端口作为http,使用12346端口作为ssh

yml 复制代码
# version: '3.6' # 笔者的是Docker Compose V2 所以不用版本号了
services:
  web:
    image: 'gitlab/gitlab-ce:latest'
    container_name: gitlab-play
    restart: always
    hostname: '15.201.99.306'
    
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        # === 基础访问配置 ===
        external_url 'http://15.201.99.306:12345'
        gitlab_rails['gitlab_shell_ssh_port'] = 12346

        # === 邮件功能配置 ===
        # 默认值: true,优化后: false,节省内存: ~50-100MB
        gitlab_rails['incoming_email_enabled'] = false  # 关闭邮件接收功能
        gitlab_rails['outgoing_email_enabled'] = false  # 关闭邮件发送功能
        
        # === 认证配置 ===
        # 默认值: false,保持关闭状态,避免额外内存开销: ~30-50MB
        gitlab_rails['ldap_enabled'] = false  # 关闭LDAP认证

        # === 核心资源优化配置 ===
        # 默认值: 根据CPU核心数自动计算(通常4-8个),优化后: 1,节省内存: ~200-400MB
        puma['worker_processes'] = 1
        # 默认值: 25,优化后: 3,节省内存: ~150-300MB
        sidekiq['max_concurrency'] = 3
        
        # === 关闭监控组件以节省资源内存 ===
        # 以下监控组件默认都是 true,全部关闭后总共节省内存: ~800MB-1.2GB
        prometheus_monitoring['enable'] = false  # 默认: true,节省: ~200-300MB
        node_exporter['enable'] = false         # 默认: true,节省: ~50-100MB
        redis_exporter['enable'] = false        # 默认: true,节省: ~30-50MB
        postgres_exporter['enable'] = false     # 默认: true,节省: ~30-50MB
        gitlab_exporter['enable'] = false       # 默认: true,节省: ~50-100MB
        alertmanager['enable'] = false          # 默认: true,节省: ~100-150MB
        
        # === 数据库优化以节省资源内存 ===
        # 默认值: "256MB",优化后: "128MB",节省内存: ~128MB
        postgresql['shared_buffers'] = "128MB"
        # 默认值: 8,优化后: 2,节省内存: ~50-100MB
        postgresql['max_worker_processes'] = 2
        
        # === 额外的内存优化配置 ===
        # 默认值: 300MB,优化后: 200MB,节省内存: ~100MB
        gitaly['ruby_max_rss'] = 200000000  # 限制Gitaly Ruby进程最大内存使用(200MB)
        
        # 内存分配器优化,加快内存回收,节省内存: ~50-100MB
        gitlab_rails['env'] = {
          'MALLOC_CONF' => 'dirty_decay_ms:1000,muzzy_decay_ms:1000'
        }
        
        # === Git操作并发限制 ===
        # 默认值: 20,优化后: 3,节省内存: ~100-200MB
        gitaly['concurrency'] = [
          {
            'rpc' => "/gitaly.SmartHTTPService/PostReceivePack",
            'max_per_repo' => 3  # 限制每个仓库的并发推送操作
          }, {
            'rpc' => "/gitaly.SSHService/SSHUploadPack", 
            'max_per_repo' => 3  # 限制每个仓库的并发拉取操作
          }
        ]
        
        # === Redis优化配置 ===
        # 默认值: 无限制,优化后: 256MB,节省内存: ~100-200MB
        redis['maxmemory'] = "256mb"
        redis['maxmemory_policy'] = "allkeys-lru"  # 内存不足时删除最少使用的键
        
        # === Unicorn/Puma额外优化 ===
        # 默认值: 8,优化后: 4,节省内存: ~100-150MB
        puma['max_threads'] = 4
        # 默认值: 60秒,优化后: 30秒,更快释放空闲连接
        puma['worker_timeout'] = 30
        
        # === 关闭不必要的服务 ===
        # 默认值: true,优化后: false,节省内存: ~50-100MB
        registry['enable'] = false              # 关闭Docker Registry功能
        # 默认值: true,优化后: false,节省内存: ~30-50MB  
        mattermost['enable'] = false            # 关闭Mattermost聊天功能
        # 默认值: true,优化后: false,节省内存: ~20-30MB
        gitlab_kas['enable'] = false            # 关闭Kubernetes Agent功能

    # 端口映射
    ports:
      - "12345:12345"  # HTTP访问端口
      - "12346:12346"  # SSH访问端口
    
    # 数据卷映射
    volumes:
      - './config:/etc/gitlab'    # 配置文件目录
      - './logs:/var/log/gitlab'  # 日志目录
      - './data:/var/opt/gitlab'  # 数据目录
    
    # 默认值: 64m,优化后: 512m,为GitLab提供足够的共享内存
    shm_size: '512m'
    
    # 资源限制配置
    deploy:
      resources:
        limits:
          # 默认值: 无限制,优化后: 3.5G,为8G服务器预留足够系统内存
          memory: 3.5G
          # 默认值: 无限制,优化后: 2.0核,为4核服务器预留CPU资源
          cpus: '2.0'

优化总结

js 复制代码
# ========================================
# 内存优化总结:
# ========================================
# 1. 关闭监控组件:           节省 ~800MB-1.2GB
# 2. 减少Puma worker进程:    节省 ~200-400MB  
# 3. 降低Sidekiq并发:       节省 ~150-300MB
# 4. 数据库缓冲区优化:       节省 ~128MB
# 5. 关闭邮件功能:          节省 ~50-100MB
# 6. Gitaly内存限制:        节省 ~100MB
# 7. Redis内存限制:         节省 ~100-200MB
# 8. 关闭Registry等服务:    节省 ~100-180MB
# 9. Git操作并发限制:       节省 ~100-200MB
# 10. 其他优化配置:         节省 ~100-200MB
# ========================================
# 
# 总计预计节省内存: 1.8GB - 2.8GB
# 
# 优化前GitLab默认内存使用: ~4-6GB
# 优化后预计内存使用: ~2-3GB
# 
# ========================================

启动容器------跑GitLab服务

当然,提前安装好docker和docker compose,执行如下命令,查看版本

然后,把yml文件丢到服务器上,在对应目录下,执行命令,启动容器,跑起来GitLab服务

bash 复制代码
docker compose up -d
  • docker compose:调用 Docker Compose v2 插件(v2 版本命令格式为空格分隔,区别于旧版 docker-compose)
  • up:用于创建并启动 docker-compose.yml(或 compose.yml)文件中定义的所有服务(容器、网络、卷等)
  • -d:可选参数,全称 --detach,表示「后台运行」模式。执行后不会阻塞终端,服务会在后台启动,终端可继续输入其他命令

下载成功以后,gitlab自动会进行初始化,可以执行命令docker logs -f gitlab-play查看输入日志,这里的gitlab-play也就是yml里面的container_name

输出一大堆日志如下【这个过程有点慢,大概5-10分钟左右】

当gitlab初始化结束后,我们就可以在浏览器中,输入自己的服务器ip和刚刚设置的端口,比如笔者设置的是12345,进行访问了,就能够看到对应页面了,如下

gitlab初始化慢的原因

  • gitlab初始首次启动需执行大量后台任务
  • 比如有:数据库初始化:创建数百张表、索引和默认数据
  • Redis 数据库初始化:设置缓存结构
  • GitLab 服务自检:Puma、Sidekiq、NGINX、PostgreSQL 等组件逐个启动并自检
  • 生成 SSH 主机密钥:RSA、ECDSA、Ed25519 等密钥生成(耗时)
  • 网络问题、硬盘问题(ssd固态硬盘就快速一些)

修改gitlab默认密码

首先执行查看命令docker exec gitlab-play cat /etc/gitlab/initial_root_password 注意,gitlab-play是yml文件中定义的,容器名字

然后,输入用户名密码 root/umy******************3+nw=进入

密码文件通常在24小时后会自动删除,所以得立刻修改

然后点击左上角的头像,点击进入Edit Profile

点击Password

  • 接下来,可以选择给gitlab配置ssl证书,如果有的话,因为 Git 默认不支持对gitlab使用未加密的http连接
  • 或者使用Access Tokens或者改用SSH协议
  • 当然也可以使用nginx代理,视情况而定(当然也可以配置host)

给gitlab配置ssl证书

创建对应文件夹,做数据卷的映射

bash 复制代码
    # 数据卷映射(包含SSL证书目录)
    volumes:
      - './config:/etc/gitlab'    # 配置文件(含ssl子目录的证书)
      - './logs:/var/log/gitlab'  # 日志目录
      - './data:/var/opt/gitlab'  # 数据目录

注意 把ssl证书,存放在config/ssl/ 里面

对应的,在yml文件中指定对应的证书和私钥

bash 复制代码
    # === SSL证书配置 ===
    nginx['ssl_certificate'] = "/etc/gitlab/ssl/ashuai.site.pem"       # 容器内证书路径
    nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/ashuai.site.key"   # 容器内私钥路径

同时hostname: 'ashuai.site'并且external_url 'https://ashuai.site:12345'指定

完整域名docker-compose.yml配置

yml 复制代码
services:
  web:
    image: 'gitlab/gitlab-ce:latest'
    container_name: gitlab-play
    restart: always
    hostname: 'ashuai.site'
    
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        # === 基础访问配置(HTTPS + 自定义端口)===
        external_url 'https://ashuai.site:12345'
        gitlab_rails['gitlab_shell_ssh_port'] = 12346  # SSH端口保持不变
        
        # === SSL证书配置 ===
        nginx['ssl_certificate'] = "/etc/gitlab/ssl/ashuai.site.pem"       # 容器内证书路径
        nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/ashuai.site.key"   # 容器内私钥路径
        # nginx['redirect_http_to_https'] = true  # 强制HTTP请求重定向到HTTPS
        
        # === 邮件功能配置 ===
        gitlab_rails['incoming_email_enabled'] = false
        gitlab_rails['outgoing_email_enabled'] = false
        
        # === 认证配置 ===
        gitlab_rails['ldap_enabled'] = false
        
        # === 核心资源优化配置 ===
        puma['worker_processes'] = 1
        sidekiq['max_concurrency'] = 3
        
        # === 关闭监控组件 ===
        prometheus_monitoring['enable'] = false
        node_exporter['enable'] = false
        redis_exporter['enable'] = false
        postgres_exporter['enable'] = false
        gitlab_exporter['enable'] = false
        alertmanager['enable'] = false
        
        # === 数据库优化 ===
        postgresql['shared_buffers'] = "128MB"
        postgresql['max_worker_processes'] = 2
        
        # === 额外内存优化 ===
        gitaly['ruby_max_rss'] = 200000000  # 200MB
        gitlab_rails['env'] = {
          'MALLOC_CONF' => 'dirty_decay_ms:1000,muzzy_decay_ms:1000'
        }
        
        # === Git操作并发限制 ===
        gitaly['concurrency'] = [
          {
            'rpc' => "/gitaly.SmartHTTPService/PostReceivePack",
            'max_per_repo' => 3
          }, {
            'rpc' => "/gitaly.SSHService/SSHUploadPack", 
            'max_per_repo' => 3
          }
        ]
        
        # === Redis优化 ===
        redis['maxmemory'] = "256mb"
        redis['maxmemory_policy'] = "allkeys-lru"
        
        # === Puma优化 ===
        puma['max_threads'] = 4
        puma['worker_timeout'] = 30
        
        # === 关闭不必要的服务 ===
        registry['enable'] = false
        mattermost['enable'] = false
        gitlab_kas['enable'] = false

    # 端口映射(HTTPS和SSH保持自定义端口,避免冲突)
    ports:
      - "12345:12345"  # HTTPS访问端口(外部:内部)
      - "12346:12346"  # SSH访问端口(外部:内部)
    
    # 数据卷映射(包含SSL证书目录)
    volumes:
      - './config:/etc/gitlab'    # 配置文件(含ssl子目录的证书)
      - './logs:/var/log/gitlab'  # 日志目录
      - './data:/var/opt/gitlab'  # 数据目录
    
    # 共享内存配置
    shm_size: '512m'
    
    # 资源限制
    deploy:
      resources:
        limits:
          memory: 3.5G
          cpus: '2.0'

最后,就是设置组织群组、创建项目、正常pull/push代码了,也就是日常开发了...

A good memory is no substitute for a pen and paper. Let's jot it down...

相关推荐
<花开花落>2 天前
gitlab-runner 再次实践中理解和学习
gitlab
Vahala0623-孔勇3 天前
CI/CD流水线优化:GitLab CI镜像构建加速实战
ci/cd·gitlab
Lin_Aries_04214 天前
部署 GitLab 服务器
linux·运维·服务器·docker·gitlab·github
FreeBuf_4 天前
GitLab高危漏洞可致实例崩溃(CVE-2025-10858 和 CVE-2025-8014)
gitlab
恒雨田4 天前
Jenkins安装并与GitLab集成,实现dev、qa、uat、prod多分支持续集成的详细步骤
ci/cd·gitlab·jenkins
꧁༺摩༒西༻꧂4 天前
Windows Server 2022离线搭建Gitlab
gitlab
熙客5 天前
GitLab:代码管理
gitlab
Lin_Aries_04216 天前
通过配置 GitLab 自动触发项目自动化构建与部署
运维·docker·容器·自动化·云计算·gitlab
peihexian6 天前
gitlab runner 里面使用harbor私仓
gitlab