7.Docker容器化代码上线
[toc]
代码上线图示
传统代码上线

容器化代码上线

容器化代码上线示例
- 使用docker-compose启动gitlab和jenkins
- 部署harbor私有镜像仓库
- Jenkins从Gitlab上拉代码
- 使用docker部署web页面
环境准备
| 主机 | 内网IP | 外网IP | 应用 | 环境 | 
|---|---|---|---|---|
| docker01 | 172.16.1.81 | 10.0.0.81 | Gitlab Jenkins | docker部署容器 | 
| docker02 | 172.16.1.82 | 10.0.0.82 | Harbor | 私有镜像仓库 | 
| docker03 | 172.16.1.83 | 10.0.0.83 | web | 部署代码 | 
部署harbor私有镜像仓库
| 1 | # 下载Harbor | 
登陆Harbor页面

新建Jenkins项目

使用docker部署gitlab
| 1 | # 连接私有镜像仓库 | 
- 创建项目  
优化gitlab(docker-compose不用编辑)
| 1 | # 配置文件优化 | 
使用docker部署jenkins
| 1 | # 拉取jenkins的镜像 | 
- 登陆Jenkins  
- 修改Jenkins密码  
- 编辑密码并保存  
| 1 | # 查看Jenkins密码 | 
优化Jenkins
| 1 | # 安装Jenkins插件包 | 
模拟开发人员上传代码
- 新建代码文件  
- 写入代码  
Jenkins从Gitlab拉取代码并部署
拉取代码
- 获取代码仓库地址  
| 1 | # 进入Jenkins服务器 | 
web服务器连接私有镜像仓库
| 1 | # 连接私有镜像仓库 | 
部署到容器中并制作成镜像上传到Harbor
手动部署
- Jenkins制作镜像并上传到Harbor - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14- # 编辑Dockerfile 
 cat > /var/jenkins_home/workspace/docker/Dockerfile <<EOF
 FROM nginx:alpine
 ADD index.html /usr/share/nginx/html/
 EOF
 # 进入代码存放目录
 cd /var/jenkins_home/workspace/docker/
 # 构建镜像
 docker build -t 10.0.0.82/jenkins/web:1 .
 # 将镜像推送到私有仓库
 docker push 10.0.0.82/jenkins/web:1
- 在web服务器部署docker镜像 - 1 
 2
 3
 4
 5- # 远程连接web设备运行镜像 
 ssh 10.0.0.83 'docker stop web'
 ssh 10.0.0.83 'docker rm web'
 ssh 10.0.0.83 "docker pull 10.0.0.82/jenkins/web:1"
 ssh 10.0.0.83 "docker run --name web -p80:80 -d 10.0.0.82/jenkins/web:1"
Jenkins自动化代码上线
- 新建一个项目  
- 配置项目  
- 填写代码仓库地址  
- 配置Jenkins容器的私钥  
- 编写Jenkins的job  - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24- # 编辑Dockerfile 
 cat > $WORKSPACE/Dockerfile <<EOF
 FROM nginx:alpine
 ADD index.html /usr/share/nginx/html/
 EOF
 # 进入代码存放目录构建镜像
 cd $WORKSPACE && docker build -t 10.0.0.82/jenkins/web:$GIT_COMMIT .
 # 将镜像推送到私有仓库
 docker push 10.0.0.82/jenkins/web:$GIT_COMMIT
 # 远程连接到web服务器
 ## 停止当前"web"容器
 ssh 10.0.0.83 'docker stop web'
 ## 删除当前"web"容器
 ssh 10.0.0.83 'docker rm web'
 ## 拉取web镜像
 ssh 10.0.0.83 "docker pull 10.0.0.82/jenkins/web:$GIT_COMMIT"
 ## 运行web容器
 ssh 10.0.0.83 "docker run --name web -p80:80 -d 10.0.0.82/jenkins/web:$GIT_COMMIT"
- 立刻构建项目  
使用docker-compose自动化部署CICD
- 编辑docker-compose文件 - 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- # vim docker-compose.yml 
 version: '3.3'
 services:
 gitlab:
 image: 'gitlab/gitlab-ce:latest'
 container_name: gitlab
 restart: always
 environment:
 GITLAB_OMNIBUS_CONFIG: |
 external_url 'http://10.0.0.81'
 gitlab_rails['gitlab_shell_ssh_port'] = '2222'
 prometheus['enable'] = false
 prometheus['monitor_kubernetes'] = false
 prometheus_monitoring['enable'] = false
 alertmanager['enable'] = false
 node_exporter['enable'] = false
 redis_exporter['enable'] = false
 postgres_exporter['enable'] = false
 grafana['enable'] = false
 ports:
 - '80:80'
 - '443:443'
 - '2222:22'
 volumes:
 - '/data/gitlab/config:/etc/gitlab'
 - '/data/gitlab/logs:/var/log/gitlab'
 - '/data/gitlab/data:/var/opt/gitlab'
 shm_size: '256m'
 jenkins:
 image: jenkins/jenkins
 container_name: jenkins
 restart: always
 ports:
 - '8080:8080'
 - '50000:50000'
 volumes:
 - /etc/docker/daemon.json:/etc/docker/daemon.json
 - /data/jenkins:/var/jenkins_home
 - /usr/bin/docker:/usr/bin/docker
 - /var/run/docker.sock:/var/run/docker.sock
 - /root/.docker/:/root/.docker/
 - /root/.ssh/:/root/.ssh/
 user: root
 privileged: true
 links:
 - gitlab
- 运行 - 1 
 2- # 运行docker-compose 
 docker-compose up
- 总结 - 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- # gitlab使用非22端口拉代码 
 gitlab_rails['gitlab_shell_ssh_port'] = '2222'
 # gitlab代码地址根据docker容器的id(固定)
 external_url 'http://10.0.0.81'
 # gitlab启动慢,配置文件优化
 prometheus['enable'] = false
 prometheus['monitor_kubernetes'] = false
 prometheus_monitoring['enable'] = false
 alertmanager['enable'] = false
 node_exporter['enable'] = false
 redis_exporter['enable'] = false
 postgres_exporter['enable'] = false
 grafana['enable'] = false
 # Jenkins想要拉取gitlab代码,固定公钥
 -v /root/.ssh/:/root/.ssh/
 # Jenkins要使用docker in docker
 docker run --privileged
 docker-compose privileged: true
 -v /var/run/docker.sock:/var/run/docker.sock
 -v /usr/bin/docker:/usr/bin/docker
 # Jenkins要永久登录harbor
 -v /etc/docker/daemon.json:/etc/docker/daemon.json
 -v /root/.docker/:/root/.docker/ ## config.json 主要记录harbor的登录信息
 {
 "auths": {
 "10.0.0.82": {
 "auth": "YWRtaW46MTIz"
 }
 }
 }
 # Jenkins需要使用root用户启动
 docker run --user root
 或者 docker-compose user: root
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 奥利奥の麦旋风!




