社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
以前写的代码更新后,都是在本地(Windows)重新编译后通过远程连接复制到服务器,然后再双击运行,以达到更新的目的。后来学长指导用Gitlab-CI来自动更新,于是就趁着寒假在家期间,尝试用之。
7月份开始进入导师的实验室学习,在Linux平台上使用Docker安装Gitlab,将实验室的gitlab数据迁移到另外一台服务器上,并且完成升级。
刚开始我对Linux的了解仅限于它和windows不同。在学长的指导下,我开始学习基础。
镜像-image
对于一个纯净的windows,需要你自己下载应用程序。docker也是一样,需要自己安装镜像。镜像就像C++中的class,他提供了一个模板给你使用,你需要用这个镜像来构建自己的容器,你也可以自己修改镜像,然后生成自己的镜像,并提交给官方的镜像仓库中。
容器-container
容器就是使用镜像创建的具体的应用,就像C++中使用class创建的一个具体的实例。可以将其启动、开始、停止删除,而这些容器都是相互隔离、互不可见的。简单地说,容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层。
数据卷-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/
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备份
cat /etc/gitlab/gitlab.rb | grep'backup_path‘
默认在/var/opt/gitlab/backupsgitlab-ctl stop unicorn
ok: down: unicorn: 0s, normally up
gitlab-ctl stop sidekiq
ok: down: sidekiq: 0s, normally up
gitlab-rake gitlab:backup:creat
需要一点时间,最后生成的文件1552531259_2019_03_14_11.3.0_gitlab_backup.tar其中1552531259_2019_03_14_11.3.0为备份的编号,恢复的时候用到。find / gitlab-secrets.json
找到后也需要备份,否则会出现问题:https://gitlab.com/gitlab-org/gitlab-ce/issues/53465恢复
安装docker
sudo apt-get remove docker docker-engine docker.io
sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository
"deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu
$(lsb_release -cs)
stable"
sudo apt-get update
sudo apt-get install docker-ce
安装docker-compose
sudo apt install docker-compose
安装gitlab
docker pull gitlab/gitlab-ce:11.4.4-ce.0 #注意要在11.4.4后加上-ce.0才是完整的tag
使用docker-compose搭建旧版本的git服务器
编写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' #注意,22端口原本为ssh登录端口,需要更改ssh登录端口。
- '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'
启动容器
在与gitlab-yml同一个目录下运行:
docker-compose up -d
等待完成即可。
安装完成之后即可测试网站功能是否正常,比如clone,push,pull等。
在正常之后,即可开始恢复文件。
使用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
升级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
到此,完成了迁移升级的全过程。
3. 安装HTTPS证书启用HTTPS
新的风暴已经出现,开哥要用HTTPS!于是,又一轮填坑之旅开始了。
acme
curl https://get.acme.sh | sh
alias acme.sh=~/.acme.sh/acme.sh
acme.sh --issue -d git.ahusmart.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
acme.sh --issue -d git.ahusmart.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please --renew
acme.sh --installcert -d git.ahusmart.com --key-file /mnt/sdc/gitlab/config/ssl/git.ahusmart.com.key --fullchain-file /mnt/sdc/gitlab/config/ssl/fullchain.cer --cert-file /mnt/sdc/gitlab/config/ssl/git.ahusmart.com.cer --ca-file /mnt/sdc/gitlab/config/ssl/ca.cer --reloadcmd "docker restart gitlabcompose_web_1"
注意安装的路径要与你docker-compose文件中挂载的宿主机的路径相同。警告!手动模式无法自动更新,所以证书到期后需要再次执行4-3-4,待优化。
之前都是Windows平台运行,现在采用微服务+docker,所以将应用部署到Docker中
指令(Instruction)
,每一条指令构建一层
,因此每一条指令的内容,就是描述该层应当如何构建。# 使用定制的golang版本作为基础镜像
FROM kesu/gochina:latest
#设置环境变量
ENV GO111MODULE on
# 工作目录设置成/opt/aplus
WORKDIR /opt/n2/
# 拷贝所有源代码到工作目录
COPY . /opt/n2/
# 设置log文件夹为挂载点
VOLUME /opt/n2/log
# 下载go mod文件
RUN go mod download
&& CGO_ENABLE=0 go build -o n2
# 暴露6060端口
EXPOSE 6060
# 运行程序
ENTRYPOINT ["./n2"]
FROM
基础镜像
,必备且在第一行。官方镜像很多,如mysql,gitlab,ubuntu等。其中的特殊镜像为scratch
,空镜像,只包含linux内核。当运行静态程序时,可以直接运行,带来了一个巨大的好处:镜像体积很小,自有几M到十几M。具体下文介绍。ENV
WORKDIR
工作目录
,并进入。以后各层
的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。COPY
拷贝文件
,格式:COPY [--chown=<user>:<group>] <源路径>... <目标路径>
因为Dockerfile在整个项目的根目录下,因此COPY . <target>就是讲整个目录复制到目标文件夹里。会自动建立。源路径可以是通配符,如./*.txt表示当前目录下的所有txt文件。VOLUME
定义匿名卷
,格式为:VOLUME <路径>
对于数据库类需要保存动态数据
的应用,其数据库文件应该保存于卷(volume)中,才能持久保存。RUN
执行命令
,并创建新的镜像层
。一个命令创建一层,因此,为了镜像体积小,尽量将RUN要执行的命令通过&&
连接在一起执行。EXPOSE
声明
运行时容器提供服务端口
,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务,还是要用 -p <宿主端口>:<容器端口>
指定,才能实际开放。ENTRYPOINT
入口点
,作用和CMD、RUN类似,都是执行一条指令。Alpine
镜像中,就可以执行了。多阶段构建
:允许一个Dockerfile 中出现多个 FROM 指令。能够将前置阶段中的文件拷贝到后边的阶段中
,就是他最大的意义。# 一阶段构建编译
# 使用定制的golang版本作为基础镜像
FROM kesu/gochina:latest AS build-env
#设置环境变量
ENV GO111MODULE on
# 工作目录设置成/opt/aplus
WORKDIR /opt/n2/
# 拷贝所有源代码到工作目录
COPY . /opt/n2/
# 下载go mod文件
RUN go mod download
&& CGO_ENABLE=0 go build -o N2Go
# 二阶段构建运行
FROM alpine:latest AS run-env
# 设置时区
RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
&& echo "Asia/Shanghai" > /etc/timezone
&& apk del tzdata
# 设置工作区
WORKDIR /root/N2Go
# 从上个镜像中复制可执行文件
COPY --from=build-env /opt/n2/N2Go ./N2Go
# 设置log文件夹为挂载点
VOLUME ./log
# 暴露6060端口
EXPOSE 6060
# 运行程序
ENTRYPOINT ["./N2Go"]
先看第一行的FROM kesu/gochina:latest AS build-env
,对比Dockerfile 1.0,多了 AS build-env
,就是讲当前阶段起个名字叫build-env。COPY --from=build-env /opt/n2/N2Go ./N2Go
这一行中,我们用build-env来指代第一阶段产生的镜像,从中复制出可执行文件到第二阶段中来。也可以用--from=0
来指代上一个
镜像。docker build -t n2go .
的结果:镜像大小只有15.7M,用docker run ......
启动一个容器,完美运行。极大的缓解了我的空间不足恐惧症和强迫症
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!