前言
7月份开始进入导师的实验室学习,在看初次接触项目代码时看的头晕目眩,云里雾里。这时学长说给我布置个”小任务“,在Linux平台上使用Docker安装Gitlab,将实验室的gitlab数据迁移到另外一台服务器上,并且完成升级。经过一个多星期的学习和尝试,终于完成,现将过程记录如下。
一.学习基础
刚开始我对Linux的了解仅限于它和windows不同。在学长的指导下,我开始学习基础。
1. Linux基础
工欲善其事,必先利其器。如今在Windows系统下使用Linux系统可以选择不安装VM虚拟机,而是使用Windows自带的WSL功能,其具体介绍这里不再指出。下面给出安装过程。
(1)在控制面板->程序和功能->启用或关闭Windows功能->勾选 “适用于Linux的Windows子系统”
(2)进入Windows自带的应用商店,搜索Ubuntu,然后安装。
这里安装第一个。完成后进入“开始”菜单,打开安装好的Ubuntu。第一次进入系统可能需要一段时间,之后按照提示注册用户,密码。
(3)学习linux的操作基础
我是在C语言中文网http://c.biancheng.net/cpp/html/2726.html上学习了Linux系统的基础知识。一边看一边在Ubuntu上练习,比较简单,因为只用知道如何操作即可。
2. Docker基础
Docker单从功能上来说,跟虚拟机很类似。比如我可以在docker上再安装一个utunbu系统,然后进入这个系统操作。使用docker部署web应用更轻巧,快速。
在docker中,有几个基础概念需要了解。
(1)镜像-image
对于一个纯净的windows,需要你自己下载应用程序。docker也是一样,需要自己安装镜像。镜像就像C++中的class,他提供了一个模板给你使用,你需要用这个镜像来构建自己的容器,你也可以自己修改镜像,然后生成自己的镜像,并提交给官方的镜像仓库中。
(2)容器-container
容器就是使用镜像创建的具体的应用,就像C++中使用class创建的一个具体的实例。可以将其启动、开始、停止删除,而这些容器都是相互隔离、互不可见的。简单地说,容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层。
(3)数据卷-volume
使用容器时的数据会在删除容器后一起删除,想要存放数据,就需要给容器挂载一个数据卷,卷是绕过Union文件系统的一个或多个容器中的特殊指定目录。卷旨在保留数据,与容器的生命周期无关。
具体的介绍和操作语句可以到Docker官网文档查询,下面写几个常用的语句:
查看已安装镜像:
docker image ls
浏览镜像仓库:
docker image search
下载镜像:
docker pull xxx
创建容器:
docker run <选项> <镜像名称> <命令语句>
选项:
-i :以交互模式运行容器,通常与 -t同时使用
-t:为容器重新分配一个伪输入终端。-it则可实现创建后即可持续输入命令
-d:后台运行,返回容器ID
-p:指定端口映射,格式为:主机(宿主)端口:容器端口
--name:为容器指定一个名称
-v: 绑定一个卷
命令语句:/bin/bash :交互模式
查看全部容器:
docker container ls -a
停止容器:
docker stop <容器名称或ID>
移除容器(必须先停止):
docker rm <容器名称或ID>
进入容器:
docker exec -it <名称或ID> bash
详细的教程和实例练习可以参考https://yeasy.gitbooks.io/docker_practice/
3. Docker-compose
使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。
安装:安装 Docker Compose 可以通过下面命令自动下载适应版本的 Compose二进制文件,并为安装脚本添加执行权限
# sudo curl -L https://github.com/docker/compose/releases/download/1.22.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose#下载
# sudo chmod +x /usr/local/bin/docker-compose#添加权限
或者:
apt install docker-compose
具体实例可以apt install docker-compose参考这篇文档:https://yeasy.gitbooks.io/docker_practice/compose/introduction.html
二.迁移Gitlab的服务器
1. 备份
1.0 进入旧服务器的gitlab容器,查找备份设定的备份路径
# cat /etc/gitlab/gitlab.rb | grep'backup_path‘
默认在/var/opt/gitlab/backups
1.1 备份(建议与开发约定时间,停止使用的情况下备份)
(1).停止相关数据连接服务
# gitlab-ctl stop unicorn
ok: down: unicorn: 0s, normally up
# gitlab-ctl stop sidekiq
ok: down: sidekiq: 0s, normally up
(2).备份数据
# gitlab-rake gitlab:backup:creat
需要一点时间,最后生成的文件1552531259_2019_03_14_11.3.0_gitlab_backup.tar其中1552531259_2019_03_14_11.3.0为备份的编号,恢复的时候用到。
(3).备份安全密钥文件(重要)
查找密钥文件目录
# find / gitlab-secrets.json
找到后也需要备份,否则会出现问题:https://gitlab.com/gitlab-org/gitlab-ce/issues/53465
(4)备份配置文件
在与gitlab-secrets.json文件同一目录下的gitlab.rb文件储存着gitlab的配置信息,如邮箱,网址,端口,内存等,可以备份此文件,从而不需要再次修改。
1.2 下载备份文件
使用WinSCP下载备份文件(数据+密钥+配置文件)到本地windows里
winscp的使用可以参考https://winscp.net/eng/docs/lang:chs
2 恢复
0. 安装docker
0.1 如果你过去安装过 docker,先删掉:
sudo apt-get remove docker docker-engine docker.io
0.2 首先安装依赖:
sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
0.3 信任 Docker 的 GPG 公钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
0.4 添加软件仓库(使用清华大学的):
sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
0.5 最后安装DOCKER
sudo apt-get update
sudo apt-get install docker-ce
0.6 安装docker-compose
sudo apt install docker-compose
1. 安装gitlab
1.0 在新服务器上下载和旧服务器版本相同的Gitlab镜像,旧的版本可以在gitlab网页的管理员控制中心中查看。
然后下载相应的镜像:
# docker pull gitlab/gitlab-ce:11.4.4-ce.0 #注意要在11.4.4后加上-ce.0才是完整的tag
1.1 使用docker-compose搭建旧版本的git服务器
(1) 编写docker-compose
新建一个空目录,在空目录里新建gitlab.yml文件并编辑
# mkdir git-compose
# cd git-compose
# touch gitlab.yml
# vim gitlab.yml
这是我的compose文件:
```
web:
image: 'gitlab/gitlab-ce'
restart: always
hostname: 'git.ahusmart.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://git.xxxxx.com'
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
#https相关设置
nginx['enable'] = true
nginx['client_max_body_size'] = '250m'
nginx['ssl_client_certificate'] = "/etc/gitlab/ssl/ca.cer"
nginx['ssl_certificate'] = "/etc/gitlab/ssl/fullchain.cer"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/git.ahusmart.com.key"
nginx['ssl_ciphers'] = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
nginx['ssl_prefer_server_ciphers'] = "on"
ports:
- '80:80'
- '22:22'
- '443:443'
volumes:
- '/mnt/sdc/gitlab/config:/etc/gitlab'
- '/mnt/sdc/gitlab/logs:/var/log/gitlab'
- '/mnt/sdc/gitlab/data:/var/opt/gitlab'
- '/mnt/hdd/gitlab/backups:/var/opt/gitlab/backups'
```
(2)启动容器
在与gitlab-yml同一个目录下运行:
# docker-compose up -d
等待完成即可。
我在这一步犯了几次错误.1:数据卷路径输入错误,虽然不影响,但是强迫症还是让我删掉重新安装
2:在安装完成之后,测试克隆功能时发现,虽然我在账户设置里添加了ssh密钥,但是还是不能通过ssh的方式克隆,一直提示我输入密码,但无论输入什么密码都不对,在输入3次后提升克隆失败。如图
百度了很多方法都没有用,后来才发现启动时我修改了容器的ssh端口为2222,但是启动时没有加上这一句:
# gitlab_rails['gitlab_shell_ssh_port'] = 2222 #修改ssh端口
而且在后续的配置时也忘记了在/etc/gitlab下的gitlab.rb文件中修改,导致ssh的端口一直是22,理所应当的失败了。所以一定要细心。另外,在服务器的控制台中也要把相应的端口开放,否则无法访问。
安装完成之后即可测试网站功能是否正常,比如clone,push,pull等。
在正常之后,即可开始恢复文件。
1.2 使用winscp将Windows里的数据备份上传的新服务器的/mnt/sdc/gitlab/backups里,将gitlab-secrets.json上传到/mnt/sdc/gitlab/config里覆盖,
然后进入容器内:
# docker exec -it <容器名> bash
停止相关服务:
# gitlab-ctl stop unicorn
ok: down: unicorn:0s, normally up
# gitlab-ctl stop sidekiq
ok: down: sidekiq:0s, normally up
恢复文件:
# ls /etc/gitlab/backups
1563006825_2019_07_13_11.4.4_gitlab_backup.tar
把文件名复制下来:注意:复制到11.4.4即可,后面不用,即复制1563006825_2019_07_13_11.4.4
# gitlab-rake gitlab:backup:restore BACKUP=1563006825_2019_07_13_11.4.4
按照提示,都输入yes即可。
刷新配置文件:
# gitlab-ctl reconfigure
重新启动相关服务
# gitlab-ctl start unicorn
ok: run: unicorn: (pid2711)0s
# gitlab-ctl start sidekiq
ok: run: sidekiq: (pid2803)0s
重启服务:
# gitlab-ctl restart
ok: run: alertmanager: (pid4983)1s
ok: run: crond: (pid4993)0s
ok: run: gitaly: (pid5001)1s
ok: run: gitlab-monitor: (pid5014)0s
......
ok: run: gitlab-workhorse: (pid5027)0sok: run: unicorn: (pid5188)0s
登陆WEB页面查看代码是否存在
我因为种种原因,反复移除、创建了几次。注意:在重装时,需要把/mnt/sdc目录下的文件都删除,确保重装的纯净。
这时就可以登上网页查看旧服务器上的仓库是否存在了。
验证(可选):
# gitlab-rake gitlab:check SANITIZE=true
Checking GitLab Shell ...
GitLab Shell version >= 8.3.3 ? ... OK (8.3.3)
Repo base directory exists?
default... yes
Repo storage directories are symlinks?
default... noRepo
....................
Git user has default SSH configuration?
... yes
Active users: ... 17
Checking GitLab
.. Finished
3 升级gitlab版本
停止容器:
# docker container stop gitlab
移除容器:
# docker rm gitlab
把compose文件gitlab.yml中的
# image: gitlab/gitlab-ce:11.4.4-ce.0
修改为
# image: gitlab/gitlab-ce
在镜像名称后不加tags,系统会默认使用最新版的官方镜像,如果没有则会自动先下载。
启动:
# docker-compose up-d
Creating gitlab ... done
到此,完成了迁移升级的全过程。
三. 总结
这个任务其实感觉很容易,但是对我这个纯小白来说完全是从零开始。感谢学长对我的全程的指导,使我在这次的学习实践中收获很多。很多东西必须亲手敲出来才能遇到问题并解决问题。一定要仔细,否则就会有各种bug和问题。以后可能还会有更多的坑要遇到。