容器化代码上线

1、容器化gitlab

环境准备 先检查可以内存Avail(最少还有10G)比较多的机器,去拉取gitlab,不然会拉取失败

主机名 ip 角色 内存
docker03 10.0.0.102 / 172.16.1.102 部署容器化gitlab 8G
1
2
3
4
5
6
7
# 容器化代码上线坑:
1.gitlab如何使用非22端口拉代码
2.jenkins容器如何使用docker命令
3.jenkins的密钥上传到gitlab
4.jenkins如何登录 harbor

开发把代码提交到gitlab,jekins去拉取代码到容器里面

容器化代码上线流程图

image-20240905093733661

1、去官网查找运行容器的代码 https://about.gitlab.com/

image-20240907130711368

往下滑 找到容器安装

image-20240907130745739

image-20240907131037286

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
1、拉取镜像   Git-ce 是社区版,gitlab-ee是企业版,收费的。
[root@docker02 ~]# docker pull gitlab/gitlab-ce:latest

2、运行镜像
docker run \
--hostname 10.0.0.102 \
--env GITLAB_OMNIBUS_CONFIG="external_url 'http://10.0.0.102'" \
-p 443:443 -p 80:80 -p 2222:22 \
--name gitlab \
--restart always \
-v /data/gitlab/config:/etc/gitlab \
-v /data/gitlab/logs:/var/log/gitlab \
-v /data/gitlab/data:/var/opt/gitlab \
-d gitlab/gitlab-ce

-p 2222:22 宿主机的22端口被占用了,所有使用宿主机的2222端口
--detach=-d

3、运行之后,执行
[root@docker02 ~]# docker ps
可能一开始看不到运行结果,因为镜像比较大,运行起来比较慢,后面还要做优化,先进入容器里面,查看启动状态
[root@docker02 ~]# docker exec -it gitlab /bin/bash
root@10:/# gitlab-ctl status
run: alertmanager: (pid 1281) 314s; run: log: (pid 1008) 429s
run: gitaly: (pid 1231) 318s; run: log: (pid 559) 642s
run: gitlab-exporter: (pid 1219) 319s; run: log: (pid 939) 448s
run: gitlab-kas: (pid 751) 626s; run: log: (pid 768) 623s
run: gitlab-workhorse: (pid 1155) 321s; run: log: (pid 885) 461s
run: logrotate: (pid 502) 655s; run: log: (pid 514) 653s
run: nginx: (pid 1169) 320s; run: log: (pid 917) 455s
run: postgres-exporter: (pid 1289) 314s; run: log: (pid 1032) 420s
run: postgresql: (pid 583) 632s; run: log: (pid 594) 631s
run: prometheus: (pid 1238) 318s; run: log: (pid 984) 437s
run: puma: (pid 835) 474s; run: log: (pid 842) 473s
run: redis: (pid 519) 649s; run: log: (pid 532) 647s
run: redis-exporter: (pid 1221) 319s; run: log: (pid 968) 441s
run: sidekiq: (pid 852) 468s; run: log: (pid 860) 467s
run: sshd: (pid 37) 676s; run: log: (pid 36) 676s

4、看到nginx服务起来了,就可以访问网页
10.0.0.102

image-20240907152247060

1
2
3
4
5
登录的用户名是root

5、查看gitlab的初始密码
[root@docker02 ~]# docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
Password: dUs0tOCn+nDOkWoShlwCvYYWlnIZUwaiBujL9BkO2TU=

6、创建一个项目

image-20240907153032437

image-20240907153123588

image-20240907155134996

7、拉取代码:目前项目创建完成后,使用其他机器拉取代码,无法拉取

1
2
3
4
5
6
7
1、拉取代码的机器需要安装git
[root@docker01 ~]# yum -y install git

2、生成密钥对,配置到gitlab仓库
[root@docker01 ~]# ssh-keygen
[root@docker01 ~]# cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQrHuOoZahkYpkUthbzbVLMH3ijST4TSPGuKWm77QBIredxGGKpoq2TN71pysOPUiGUKpBQnttyfo5AOealp0knNFuxqiShcRa8IlJQMX6mJfVFrY6jI5g/AnDvIayurVVBsf6T7h6sQNV8Pj4bzGpO8PXi8Z8GGslZ2LbmqA+LsfLLX/KR3BJce4JC/0PsK4DqAVO/WVYd7H0qeSUK5arrnpt7ncYVx02k63KI47Tb4W+nyqhlChwxD55V3ArzbvVpQy3BnRoOQQ5cr7le6HP+kl27jHTxCNJ7bf5uU1O4Polc3ODBkq2gZC9JaN6O8RuyB2UeCe5odVYOmxb5IKJ root@docker01

image-20240907154118623

image-20240907154153334

image-20240907154228630

修改为中文字体,再刷新

image-20240907154846257

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
1、使用这个命令拉取代码时,还需要输入密码,所以配置的ssh密钥对到gitlab时是不太行的
[root@docker01 ~]# git clone git@10.0.0.102:root/web.git


2、#gitlab使用非22端口拉代码
[root@docker01 ~]# git clone ssh://git@10.0.0.102:2222/root/web.git


3、由于每次拉取代码都要输入协议和端口,效率不高,可以修改配置文件设置自动出现协议和端口,直接复制
#修改配置文件和做gitlab的优化
由于配置文件已经映射出来了,直接修改
[root@docker02 ~]# vim /data/gitlab/config/gitlab.rb
#32行:url的配置
external_url 'http://10.0.0.102'
# 698行:端口的配置
gitlab_rails['gitlab_shell_ssh_port'] = 2222
###优化内容 把这几行加入配置文件
#告警关闭
alertmanager['enable'] = false
#关闭前端的node功能
node_exporter['enable'] = false
#关闭redis功能
redis_exporter['enable'] = false
#关闭postgre功能
postgres_exporter['enable'] = false


4、重新加载gitlab配置文件,需要等待3分钟左右
[root@docker02 ~]# docker exec -it gitlab gitlab-ctl reconfigure
reconfigure相当于nginx的reload,还是可以正常访问网页的

5、再次访问网页,刷新页面,可以看到提供的地址是直接可以使用的地址

image-20240907162925699

2、容器化jenkins

访问官网,找到启动容器的命令:https://www.jenkins.io/

image-20240907163455778

image-20240907163613722

1
2
3
4
5
6
7
8
9
10
11
12
13
docker run \
--name jenkins-docker \
--rm \
--detach \
--privileged \
--network jenkins \ #网络没有配置,需要删除
--network-alias docker \ #网络没有配置,需要删除
--env DOCKER_TLS_CERTDIR=/certs \ #没有证书,需要删除
--volume jenkins-docker-certs:/certs/client \ #没有证书,需要删除
--volume jenkins-data:/var/jenkins_home \ #映射的jenkins目录
--publish 2376:2376 \
docker:dind \
--storage-driver overlay2

到docker官网,找到jenkins镜像 https://hub.docker.com/

image-20240907164947184

image-20240907165448303

image-20240907165642490

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
1、拉取2.422版本的镜像
[root@docker02 ~]# docker pull jenkins/jenkins:2.422

2、运行jenkins容器
docker run \
--name jenkins \
--privileged \
--user=root \
--restart=always \
-v /data/jenkins/:/var/jenkins_home \
-v /usr/bin/docker:/usr/bin/docker \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /root/.ssh/:/root/.ssh/ \
-v /root/.docker/config.json:/root/.docker/config.json \
-p 8080:8080 \
-p 5000:5000 \
-d jenkins/jenkins:2.422

--rm:只要容器停止就会删掉
--user=root:jenkins需要root用户去启动,不然运行之后docker log -f jenkins查看日志都会没有权限
--privileged:相当于zabbix需要监控宿主机,想要有权限就需要这个参数,还可以让容器有权限能使用宿主机上的docker命令
docker容器想要使用宿主机的命令就是docker in docker
-v /usr/bin/docker:将宿主机的docker命令映射,容器里面就可以执行docker ps..
-v /var/run/docker.sock:docker的命令通过sockt连接的,需要映射sock文件,由于容器里面没有sock文件,不然执行docker命令会报错
#解决jenkins生成密钥到gitlab,如果在容器里面生成密钥对,万一jenkins宕机了,在重新生成密钥对,之前放到gitlab里面的密钥对就不能使用了,为了密钥对持久化,需要在宿主机上生成密钥对,映射到容器
[root@docker02 ~]# ssh-keygen
-v /root/.ssh:将宿主机的密钥对映射到容器
-v /root/.docker/config.json:将登录harbor的认证信息映射,容器就可以推送镜像到harbor

3、上传插件

4、解压插件
[root@docker02 ~]# tar xf jenkins_plugins_2.422.tgz -C /data/jenkins/

5、再重新启动jenkins
[root@docker02 ~]# docker restart jenkins


6、浏览器访问网页
10.0.0.102:8080

7、查看密码
[root@docker02 ~]# docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
3766efc193fe418f9256897f39840929

由于/var/jenkins_home目录已经映射出来在宿主机上已经持久化了,还可以这样查看密码文件
[root@docker02 ~]# cat /data/jenkins/secrets/initialAdminPassword
3766efc193fe418f9256897f39840929

然后出现安装jenkins插件的页面之间,不要安装插件,直接点击右上角的×——>点击开始使用jenkins

image-20240907175615967

1
2
3
8、将搭建了jenkins服务器的公钥放到gitlab服务器
[root@docker02 ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDPOMkDhGerkcJCwv55/6B4vTtzY0gxDKDYibzGUHX18AKgN8eZUBQVyub/mLmhBYlPWBIlb8x1xzNqH6N+kt/aIp03KheYAJBk26Npc8vtVEh009kf9DU3q4QopDrbKOmaF21/0LZ+ZVsAT0AmPKVH8pWodOv9O8aoXoVZe+uxAD+nItopJ6bnDzalKLEeVadtGZqm4k+AZRY2W7bZFUlss6WEKB2DLWfnf4FkIkDBQqLTPOS8ovB4U9gEBqN0vRFGI9qa1dDE4I9bK3ISKWBLR1yzV5wA4ARszXuj4t/nEP71qWfdi3vi9xdYvWStGdWa487nIFgi7s96ix9g8QBD root@docker02

image-20240907182329531

1
2
3
4
5
6
7
9、jenkins机器拉取gitlab里面的代码
进入jenkins容器
[root@docker02 ~]# docker exec -it jenkins /bin/bash

10、拉取代码
root@126b61b9d225:/# git clone ssh://git@10.0.0.102:2222/root/web.git
输入yes,不需要输入密码,直接免密拉取代码

3、测试将jenkins里面的镜像推送到Harbor图形化镜像仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1、进入jenkins容器
[root@docker02 ~]# docker exec -it jenkins /bin/bash
root@126b61b9d225:/# docker images


2、将镜像改名
root@126b61b9d225:/# docker tag wordpress:v7 172.16.1.76/wordpress/wordpress-jenkins-harbor:v7


3、推送镜像 报错,是因为需要登录,但是每次重启都需要登录
root@126b61b9d225:/# docker push 172.16.1.76/wordpress/wordpress-jenkins-harbor:v7
unauthorized: unauthorized to access repository: wordpress/wordpress-jenkins-harbor, action: push: unauthorized to access repository: wordpress/wordpress-jenkins-harbor, action: push

4、检查宿主机是否能够推送
[root@docker02 ~]# docker push 172.16.1.76/wordpress/wordpress-jenkins-harbor:v7
unauthorized: unauthorized to access repository: wordpress/wordpress-jenkins-harbor, action: push: unauthorized to access repository: wordpress/wordpress-jenkins-harbor, action: push

5、宿主机不能推送,需要登录harbor
[root@docker01 ~]# docker login 172.16.1.76
Username: admin
Password: #密码:Harbor12345
......
Login Succeeded

6、宿主机正常推送 推送成功
[root@docker02 ~]# docker push 172.16.1.76/wordpress/wordpress-jenkins-harbor:v7

image-20240907210452739

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
7、宿主机能够推送镜像,但是容器不一定能推,因为容器也是需要login登录的,但是这里不需要容器登录
宿主机登录了之后,会有一个认证信息做出一个文件保存到~/.docker/config.json
[root@docker02 ~]# ll -a ~/.docker/config.json
-rw------- 1 root root 139 Sep 7 21:02 /root/.docker/config.json
[root@docker02 ~]# cat ~/.docker/config.json
{
"auths": {
"10.0.0.76": {
"auth": "YWRtaW46SGFyYm9yMTIzNDU="
},
"172.16.1.76": {
"auth": "YWRtaW46SGFyYm9yMTIzNDU="
}
}

#所以,是需要在启动jenkins的时候,将认证信息的文件映射,这样jenkins容器就可以推送镜像到Harbor从库,在运行的时候我已经加上这个文件映射了的,只要我的宿主机登录过,我的jenkins容器可以推送

4、jenkins容器构建代码上线——自由风格

1、测试构建

image-20240907230455222

image-20240907234349843

复制代码地址

image-20240907234446792

image-20240907234558247

image-20240908000318150

执行构建,构建成功

image-20240908000821406

1
2
3
4
5
6
7
8
9
10
1、#拉取后代码存放的目录
[root@docker02 ~]# ll /data/jenkins/workspace/web-frestlye/
-rw-r--r-- 1 root root 7 Sep 8 00:06 index.html
-rw-r--r-- 1 root root 6141 Sep 8 00:06 README.md

2、#免密web服务器
[root@docker02 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.101

echo ${WORKSPACE}
/var/jenkins_home/workspace/web-frestlye

2、写脚本构建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
harbor_ip=172.16.1.76
web_ip=172.16.1.101
cat > ${WORKSPACE}/Dockerfile << EOF
FROM nginx:alpine
#将网页代码复制到nginx的站点目录下
COPY index.html /usr/share/nginx/html/
EOF
#进入工作目录构建镜像
cd ${WORKSPACE} && \
docker build -t ${harbor_ip}/wordpress/web-frestlye:v1 .
#打完镜像后推送到Harbor仓库
docker push ${harbor_ip}/wordpress/web-frestlye:v1
#连接到web服务器把镜像从harbor拉下来,注意jenkins机器要和web免密
ssh root@${web_ip} "docker pull ${harbor_ip}/wordpress/web-frestlye:v1"
#删除之前旧的web镜像
ssh root@${web_ip} "docker rm -f web"
#在web服务器部署nginx网页代码
ssh root@${web_ip} "docker run --name web -p 80:80 -d ${harbor_ip}/wordpress/web-frestlye:v1"

image-20240908230050715

image-20240908230246558

5、jenkins容器构建代码上线——参数化构建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1、第一版
[root@docker02 ~]# mkdir /web
[root@docker02 ~]# cd /web
[root@docker02 web]# git init /web
[root@docker02 web]# vim index.html
[root@docker02 web]# vim src.js
[root@docker02 web]# git add .
[root@docker02 web]# git config --global user.email "you@example.com"
[root@docker02 web]# git config --global user.name "Your Name"
[root@docker02 web]# git commit -m '官网v1.0'
[root@docker02 web]# git tag -a 'v1' -m "官网v1.0"
[root@docker02 web]# git remote add origin ssh://git@10.0.0.102:2222/root/web-website.git
[root@docker02 web]# git push --all
[root@docker02 web]# git push --tag


2、第二版
[root@docker02 web]# vim src.js
[root@docker02 web]# git add .
[root@docker02 web]# git commit -m '官网v2.0'
[root@docker02 web]# git tag -a 'v2' -m "官网v2.0"
[root@docker02 web]# git push --all
[root@docker02 web]# git push --tag


代码不需要软连接了。已经容器部署了,代码可以随便删除

image-20240909172701792

image-20240909224852871

image-20240909224914742

image-20240909224936189

image-20240909225006620

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
harbor_ip=172.16.1.76
project_name='wordpress'
pkg_name='${harbor_ip}/${project_name}'

cat > ${WORKSPACE}/Dockerfile << EOF
FROM nginx:alpine
#将网页代码复制到nginx的站点目录下
COPY ./* /usr/share/nginx/html/
EOF

#进入工作目录构建镜像
cd ${WORKSPACE} && \
docker build -t ${pkg_name}/web-frestlye:${git_tag} .
#打完镜像后推送到Harbor仓库
docker push $pkg_name}/web-frestlye:${git_tag}


deploy () {
for n in $@ ;do
#连接到web服务器把镜像从harbor拉下来,注意jenkins机器要和web免密
ssh root@172.16.1.${n} "docker pull ${harbor_ip}/wordpress/web-frestlye:${git_tag}"
#删除之前旧的web镜像
ssh root@172.16.1.${n} "docker rm -f web"
#在web服务器部署nginx网页代码
ssh root@172.16.1.${n} "docker run --name web -p 80:80 -d ${harbor_ip}/wordpress/web-frestlye:${git_tag}"
}

case $env in
dev)
#给函数传参数 传递机器的ip
deploy 101
;;
prod)
deploy 103
;;
esac

image-20240909225041225

6、jenkins容器构建代码上线——MAVEN项目构建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1、哪台机器需要部署java代码,到docker官网拉取tomcat
docker pull tomcat:alpine
需要先手动编译代码,下载maven
yum -y install maven

2、下载java代码helloword

3、运行tmocat
docker run -p 8080:8080 -d tomcat:alpine

改Maven源。换成阿里云的源
vim

构建 构建完成之后会生成一个target目录
maven pakage
cd target/hellowrd
tar zcf hello-1.0.0.tgz

vim Dockerfile
FROM tomcat:alpine
RUN rm -rf /usr/local/tomcat/webapps/ROOT/*
ADD hello-1.0.0.tgz /usr/local/tomcat/webapps/ROOT


docker build -t 172.16.1.76/wordpress/hello:v1 .
docker run -p 8080:8080 -d 172.16.1.76/wordpress/hello:v1

目前访问的时候要加上目录,tomcat前面会加上nginx做代理,代理这个目录

image-20240909092954321

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#jenkins机器
起宿主机把maven映射进去



Jenkins时区不对,差8个小时,解决方案
# 进入容器
docker exec -it -u root jenkins bash

#修改容器时区
echo 'Asia/Shanghai' > /etc/timezone

# 查看修改后的容器时区
cat /etc/timezone
exit

# 重启jenkins容器
docker restart jenkins
1
2
3
4
5
6
7
#如果觉得Jenkins占用内存过大,我们可以采用下面的方式限制ienkins占用内存大小

# docker限制内存大小
docker update jenkins -m 3g --memory-swap -1

--memory 或-m 限制容器的内存使用量
--memory-swap 限制内存和swap的总和,不设置的话默认为--memory的两倍