为何使用docker-compose进行GitLab的部署安装
原因:docker-compose便于对GitLab 容器进行资源控制进行(如优化节省服务器资源、便捷删除等)
GitLab本身是一个笨重的应用服务,一般来说,需要4核CPU和8GB内存才能正常运行,再低一些也行,不过需要把gitlab自带的一些功能服务给进行优化,比如有:
-
Puma Worker Processes
(处理HTTP请求,网页访问、API调用等)调低一些
-
Sidekiq Max Concurrency
(后台任务并发)也调低一些
-
Prometheus Monitoring
(监控系统)直接关掉------监控系统方案有很多,不用也无妨,甚至可以直接使用命令行查看监控
-
- 数据库优化(减少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...