容器化代码上线
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去拉取代码到容器里面
|
容器化代码上线流程图
1、去官网查找运行容器的代码 https://about.gitlab.com/
往下滑 找到容器安装
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
|
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、创建一个项目
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
|
修改为中文字体,再刷新
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、由于每次拉取代码都要输入协议和端口,效率不高,可以修改配置文件设置自动出现协议和端口,直接复制
由于配置文件已经映射出来了,直接修改 [root@docker02 ~]# vim /data/gitlab/config/gitlab.rb
external_url 'http://10.0.0.102'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
alertmanager['enable'] = false
node_exporter['enable'] = false
redis_exporter['enable'] = false
postgres_exporter['enable'] = false
4、重新加载gitlab配置文件,需要等待3分钟左右 [root@docker02 ~]# docker exec -it gitlab gitlab-ctl reconfigure reconfigure相当于nginx的reload,还是可以正常访问网页的
5、再次访问网页,刷新页面,可以看到提供的地址是直接可以使用的地址
|
2、容器化jenkins
访问官网,找到启动容器的命令:https://www.jenkins.io/
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 \ --publish 2376:2376 \ docker:dind \ --storage-driver overlay2
|
到docker官网,找到jenkins镜像 https://hub.docker.com/
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命令会报错
[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
|
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
|
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: ...... Login Succeeded
6、宿主机正常推送 推送成功 [root@docker02 ~]# docker push 172.16.1.76/wordpress/wordpress-jenkins-harbor:v7
|
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=" } }
|
4、jenkins容器构建代码上线——自由风格
1、测试构建
复制代码地址
执行构建,构建成功
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 .
docker push ${harbor_ip}/wordpress/web-frestlye:v1
ssh root@${web_ip} "docker pull ${harbor_ip}/wordpress/web-frestlye:v1"
ssh root@${web_ip} "docker rm -f web"
ssh root@${web_ip} "docker run --name web -p 80:80 -d ${harbor_ip}/wordpress/web-frestlye:v1"
|
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
代码不需要软连接了。已经容器部署了,代码可以随便删除
|
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} .
docker push $pkg_name}/web-frestlye:${git_tag}
deploy () { for n in $@ ;do
ssh root@172.16.1.${n} "docker pull ${harbor_ip}/wordpress/web-frestlye:${git_tag}"
ssh root@172.16.1.${n} "docker rm -f web"
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)
deploy 101 ;; prod) deploy 103 ;; esac
|
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做代理,代理这个目录
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 起宿主机把maven映射进去
Jenkins时区不对,差8个小时,解决方案
docker exec -it -u root jenkins bash
echo 'Asia/Shanghai' > /etc/timezone
cat /etc/timezone exit
docker restart jenkins
|
1 2 3 4 5 6 7
|
docker update jenkins -m 3g --memory-swap -1
--memory 或-m 限制容器的内存使用量 --memory-swap 限制内存和swap的总和,不设置的话默认为--memory的两倍
|