迁移gitlab至docker容器过程与一些坑!
以下操作皆在root用户下, 话不多说, 直接开干
第一步: 备份原gitlab
进入gitlab目录下, 我这边是: /home/git/gitlab
执行命令: sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production
备份完成后会在: /home/git/gitlab/tmp/backups 下产生一个备份的压缩文件, 如: 1566977804_2019_08_28_9.5.3_gitlab_backup.tar (其中 9.5.3 代表gitlab的版本, 备份文件只能恢复到相同版本的gitlab服务中)
如果备份命令不起作用(可能是gitlab安装方式的区别), 请参考: http://blog.sina.com.cn/s/blog_6ff7a3b50102w3oj.html
第二步: 安装docker
centos7安装方式: yum install docker (centos6请自行搜索安装docker方式)
启动docker服务: service docker start
第三步: 寻找合适的gitlab镜像
进入docker镜像官网搜索gitlab: https://hub.docker.com/r/gitlab/gitlab-ce/tags
根据刚才备份文件名中的版本号, 在tag列表中找到对应的镜像版本
记下tag名字, 我这里是: 9.5.3-ce.0 (一会拉取镜像时有用)
第四步: 拉取镜像
执行命令: docker pull docker.io/gitlab/gitlab-ce:9.5.3-ce.0 (冒号后面就是刚刚找到的对应版本号)
拉取完成后, 执行命令: docker images (查看本地镜像列表, 正常的话列表中出现gitlab镜像)
第五步: 在宿主机上准备3个挂载目录
mkdir -p /home/docker/gitlab/config
mkdir -p /home/docker/gitlab/data
mkdir -p /home/docker/gitlab/logs
开放挂载目录权限: chmod -R 777 /home/docker/gitlab
第六步: 使用gitlab镜像启动容器
几个坑:
1.如果宿主机的ssh远程登入端口为22的话, 最好将其修改为其他端口, 如: 2200 (否则gitlab安装完成后, 无法正常使用项目中的ssh地址进行clone/pull/push等操作) , 修改ssh端口的方案参考: https://www.cnblogs.com/rwxwsblog/p/5756894.html
2.启动容器时使用的映射端口需要确保没有被占用, 否则将无法正常访问, 查看当前服务器监听的端口列表命令: netstat -lnpt
3.确保映射的宿主机端口是开放的(1.服务器防火墙 2.阿里云安全组策略), 修改防火墙参考: https://www.linuxidc.com/Linux/2019-06/159104.htm
执行命令: docker run --name='gitlab' -d --publish 22:22 --publish 1443:443 --publish 18080:80 --restart always --privileged=true --volume /home/docker/gitlab/config:/etc/gitlab --volume /home/docker/gitlab/logs:/var/log/gitlab --volume /home/docker/gitlab/data:/var/opt/gitlab <本地gitlab镜像id>
执行命令: docker ps -a (查看docker当前容器列表, 正常的话可以看到一个 gitlab 容器, 并且状态为 Up)
第七步: 测试gitlab服务运行状态
回到线下环境使用浏览器访问: http://宿主机ip:18080 , 看到如下界面代表服务启动正常 (如果无法访问或者显示 502, 可能还在启动过程中, 稍等1分钟再刷新试试)
第八步: 使用在gitlab容器中恢复备份文件
首先将备份文件上传至宿主机 /home/docker/gitlab 目录下
执行命令: cp /home/docker/gitlab/备份文件名 /home/docker/gitlab/data/backups/
查看gitlab容器id: docker ps -a
进入容器: docker exec -it <容器id> /bin/bash
执行恢复: gitlab-rake gitlab:backup:restore BACKUP=1566977804_2019_08_28_9.5.3 force=yes (其中橙色字体部分为备份文件名前缀, 这里文件名为: 1566977804_2019_08_28_9.5.3_gitlab_backup.tar)
简直不敢信, 竟然没有报错...
第九步: 查看恢复数据
回到线下浏览器, 再次访问 http://宿主机ip:18080
使用原有的git账号登入
登入成功, 看到了所有项目! 太感动了...
但是问题随之而来:
进入项目首页时, 看到 clone 地址中的hostname变成了一串 随机字符, 如: git@s4fad15gs1a:xxxxxx/xxxxx.git (理想中应该是: git@git.xxx.com:xxxxx/xxxx.git), 并且无法使用此链接 clone 代码
处理方案:
进入容器: docker exec -it <容器id> /bin/bash
编辑配置文件: vi /etc/gitlab/gitlab.rb
找到 external_url , 取消注释, 并修改为 external_url 'http://服务器的ip或域名'
找到 gitlab_rails['gitlab_ssh_host'], 取消注释, 并修改为 gitlab_rails['gitlab_ssh_host'] = '服务器的ip或域名'
保存
更新配置: gitlab-ctl reconfigure
重新启动: gitlab-ctl restart
等待1分钟启动完成后, 再次回到线下查看, 发现地址对了
第十步: 测试clone项目
在本地机器上新建一个文件夹, 进入文件夹, 右键调出 Git Bash
执行: git clone git@git.flow360.cn:cardmee/page_pc.git
结果报错..
由于服务器的更改, 原有的 ssh 授权信息已经失效了, 需要 找到 known_hosts 文件, 将里面原来的 授权记录一行删除, 保存
保存后再次执行 git clone git@git.flow360.cn:cardmee/page_pc.git
询问授权输入 yes , 回车
正常下载代码中....
最后2个坑:
1. 我刚刚为了修改clone地址, 改了gitlab.rb文件, 然而当我重启容器后, 修改的配置又回到了默认状态, 这就很操蛋了...
解决方案:
在宿主机下进入目录: cd /home/docker/gitlab/config
以同样的方式修改 gitlab.rb 文件, 保存
重启gitlab容器: docker restart <容器id>
测试通过
2.gitlab占用内存过高的优化
解决方案:
在宿主机下进入目录: cd /home/docker/gitlab/config
修改 gitlab.rb 文件
找到 unicorn['worker_processes'] , 取消注释, 修改为 unicorn['worker_processes'] = 2
找到 unicorn['worker_memory_limit_min'] , 取消注释, 修改为 unicorn['worker_memory_limit_min'] = "200 * 1 << 20"
找到 unicorn['worker_memory_limit_max'], 取消注释, 修改为 unicorn['worker_memory_limit_max'] = "300 * 1 << 20"
找到 sidekiq['concurrency'] , 取消注释, 修改为 sidekiq['concurrency'] = 5
找到 postgresql['shared_buffers'] , 取消注释, 修改为 postgresql['shared_buffers'] = "128MB"
保存
重启容器: docker restart <容器id>