迁移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列表中找到对应的镜像版本

迁移gitlab至docker容器过程与一些坑!_第1张图片

记下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至docker容器过程与一些坑!_第2张图片

 

 

第八步: 使用在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 (理想中应该是: [email protected]: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 [email protected]:cardmee/page_pc.git

结果报错..

迁移gitlab至docker容器过程与一些坑!_第3张图片

由于服务器的更改, 原有的 ssh 授权信息已经失效了, 需要 找到 known_hosts 文件, 将里面原来的 授权记录一行删除, 保存

迁移gitlab至docker容器过程与一些坑!_第4张图片

保存后再次执行 git clone [email protected]: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>

转载于:https://www.cnblogs.com/imyjy/p/11425457.html

你可能感兴趣的:(迁移gitlab至docker容器过程与一些坑!)