前言
需要提前安装 docker,docker安装
请参考 docker 官网或者本站的 docker 安装文章。也请提前熟悉 docker 的基本操作。
一、拉取 gitlab 镜像
# lastest 版本
docker pull gitlab/gitlab-ce
# 我所在公司使用版本, 此处记录一下
docker pull gitlab/gitlab-ce:10.0.0-ce.0
二、创建挂载目录/卷 volume
docker run 会自动创建,此步意义不大。
列出来只是想强调,挂载最好分三个目录:data、config、logs。
mkdir -p /volume/gitlab/config
mkdir -p /volume/gitlab/logs
mkdir -p /volume/gitlab/data
三、创建容器
# gitlab 在我司使用两年后日志膨胀到 30G+, 故增加了日志大小的限定
# 另一种方案 —— 全局日志配置,请看本站另一篇文章 "docker常用命令指南"
docker run --detach \
--publish 9091:9091 \
--publish 9092:22 \
--name gitlab \
--volume /volume/gitlab/config:/etc/gitlab \
--volume /volume/gitlab/logs:/var/log/gitlab \
--volume /volume/gitlab/data:/var/opt/gitlab \
--volume /etc/localtime:/etc/localtime:ro \
--privileged=true \
--restart always \
--log-opt max-size=10m --log-opt max-file=1 \
-e TZ="Asia/Shanghai" \
gitlab/gitlab-ce:10.0.0-ce.0
四、配置
我的虚拟机 ip 是 192.168.109.133,按道理启动后 http://192.168.109.133:9091 就能跑,结果访问不了。原因是没有配置 external_url,external_url 默认是 80 端口,docker run 改了容器端口,需要修改配置:
# vi /volume/gitlab/config/gitlab.rb, 加入以下两行
# external_url 一般填写服务器的域名或者 ip, 加上容器端口
external_url 'http://192.168.109.133:9091/'
gitlab_rails['gitlab_shell_ssh_port'] = 9092
# 重启
systemctl restart docker
另:docker run,http端口,请保持宿主机和容器的端口一致。
查看默认密码:
进入容器,执行 cat /etc/gitlab/initial_root_password
。此目录也就是 config volume,容器外也能看。此文件除了密码,还写了这个文件会在 24 小时后删除,因此我们要尽快修改密码。
账号默认 root
五、关闭用户注册功能(可选)
如果是企业内部用,该操作必备。另外不同版本操作可能不同,以下操作仅针对gitlab-ce:10.0.0-ce.0:
登录 Gitlab,Admin area(扳手图标)》弹出左菜单,选中 Setting》Sign-up enabled 取消勾选》划到底部,点击保存。
六、备份与恢复
1、进入容器
docker exec -it gitlab bash
2、查看 gitlab 版本
gitlab-rake gitlab:env:info
3、手动备份
# 容器内, RAILS_ENV 貌似没用
gitlab-rake gitlab:backup:create RAILS_ENV=production
# 容器外
docker exec -it gitlab gitlab-rake gitlab:backup:create
备份文件目录: /var/opt/gitlab/backups/,获得备份文件:1718070964_2024_06_11_14.6.1_gitlab_backup.tar(示例)。
此目录也就是宿主机的 /volume/gitlab/data/backups 目录。
4、恢复
安装好同样版本的 gitlab,将备份文件放到新的 gitlab 的挂载目录:/volume/gitlab/data/backups
容器内执行:
gitlab-rake gitlab:backup:restore RAILS_ENV=production BACKUP=1718070964_2024_06_11_14.6.1
如果遇到权限不足提示,则:
chmod 777 ./filename
七、内存占用优化
gitlab 在我司 32G 内存的服务器上经常性占用 4G+ 的内存,但是 gitlab 使用频率低,内存严重浪费;另外,在我 4G 的虚拟机上,内存也占用差不多 3G。
根据内存排序ps aux | sort -nk 4 | tail -n 20
,可以看到有多个 gitlab 的worker_processes,每一个都占用一定的内存。查看资料可知,GitLab 社区版默认启动核心数 + 1个 worker_processes 导致大量的内存消耗。
docker stats
也可以看到 gitlab 占用的内存。
# 1、vi gitlab 配置文件
vi /volume/gitlab/config/gitlab.rb
# 2、找到 puma['worker_processes'] = 2 (14.6)
# 或者 unicorn['worker_processes'] = 2 (10.0)
# 放开注释, 不同版本叫法不一样。然后看服务器配置来决定使用 1、2 或更高。
# 3、重启 gitlab
docker restart gitlab
docker stats
确认占用内存是否减少了。
经测试,10.0 版本 processes 改为 2,4G+ 内存降到 2G 左右;改为 1,降到 1.3G。运行一段时间后发现内存稳定在 1.93G 左右。
14.6 版本改为 1 仍占用 2.4G 内存,看来新版内存占用是更高的。
八、日志大小优化
日志在/var/lib/docker/containers/{container_id}
下,日志文件*-json.log
,做了全局日志配置和docker run
指定日志配置 不用考虑日志大小优化问题。此处介绍已经创建了容器且创建时没有指定日志配置的情况要怎么做?
1、备份数据,docker rm gitlab,重新创建 docker run(推荐)
备份数据是以防万一,实际应该用不上。docker rm 之后不会删除挂载卷,因此重新 docker run 后不用做任何配置,马上能用。
2、临时删除(不推荐、临时补救用)
用于日志过大,服务器异常的情况,马上清空文件让系统恢复运作。
cat /dev/null > xxx.log
九、定期备份(crontab)
遇到因修改配置导致 gitlab 启动失败的问题,启动失败也意味着不能手动备份数据,幸好后来通过替换配置解决了。
但这也让我意识到备份的重要性 —— 如果有一个一周前的备份,加入本地的最新代码,马上就能拉起一个新的 gitlab,恢复到最新的数据。
容器内安装 cron 跑定时任务巨坑,设置不了 cron 自启,接受不了每次重启 docker 都要进入容器启动 cron!除非用 dockerfile 设置 cron 启动,不然建议容器外跑定时任务!
# 1、/volume/gitlab/data/backups, 编写备份脚本
[root@jenkins ~]$ vi auto_backup.sh
#!/bin/bash
echo "$(date): " > /var/opt/gitlab/backups/backup.log 2>&1
#/usr/bin/gitlab-rake gitlab:backup:create >> /var/opt/gitlab/backups/backup.log 2>&1
/usr/bin/gitlab-rake gitlab:backup:create
echo "备份结束 $(date)" >> /var/opt/gitlab/backups/backup.log
# 删除一天前创建的 tar 文件
find "/var/opt/gitlab/backups" -name "*.tar" -ctime +0 -type f -exec rm -rf {} \;
# 2、增加可执行权限, 容器内也会获得同等权限
chmod +x /volume/gitlab/data/backups/auto_backup.sh
# 3、宿主机, crontab -e 加入定时任务。crontab -l 查看任务。
# crontab -e 默认使用 nano, 可使用命令行执行 select-editor 切换成 vim.basic
0 2 * * * /usr/bin/docker exec gitlab /bin/bash -c '/var/opt/gitlab/backups/auto_backup.sh'
创建定时任务,每天 2 点备份一次并删除一天前创建的备份(只保留一份)。