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...

相关推荐
梁萌21 小时前
docker部署gitlab和gitlab runner
docker·eureka·gitlab
johnnyAndCode1 天前
Idea 设置GitLab时使用账密,而不是token的配置方法
gitlab·idea
天外飞雨1 天前
Gitlab使用
gitlab
BUTCHER52 天前
GitLab SSH 密钥配置
运维·ssh·gitlab
明月心9522 天前
GitLab使用
gitlab
明月心9523 天前
gitlab pull requets
gitlab
BUTCHER53 天前
GitLab基本设置
gitlab
张小凡vip3 天前
Kubernetes---gitlab的ci/cd发布基于k8s的项目示例参考
ci/cd·kubernetes·gitlab
cuijiecheng20184 天前
GitLab创建项目
gitlab
_运维那些事儿6 天前
GitLabCI/CD语法
linux·服务器·git·ci/cd·gitlab·运维开发·devops