Day04-jenkins-docker
- 9. 案例06: 基于docker的案例实现静态代码
- 9.1 整体流程
- 9.2 步骤与环境
- 1) 步骤
- 2) 环境
- 9.3 详细步骤
- 1)代码准备
- 2)书写dockerfile
- 3)准备私有仓库
- 4)创建jenkins任务
- 5)web节点上启动对应的docker容器
9. 案例06: 基于docker的案例实现静态代码
9.1 整体流程
9.2 步骤与环境
1) 步骤
-
代码,上传到gitlab
-
书写测试dockerfile(只需要代码+docker环境即可)
-
jenkins创建任务
- 拉取代码
- 执行构建shell命令
- jk:docker build
- jk:docker push
- web:docker run + 私有仓库镜像
-
检查结果
2) 环境
角色 | 主机 | ip |
---|---|---|
gitlab/gitee | devops-oldboy-gitlab | 10.0.0.71/172.16.1.71 |
jenkins | devops-oldboy-jenkins | 10.0.0.72/172.16.1.72 |
web服务器 | web05 | 10.0.0.11/172.16.1.11 |
web服务器 | web06 | 10.0.0.12/172.16.1.12 |
负载均衡 | lb01+lb02 | 10.0.0.5/172.16.1.5 |
9.3 详细步骤
1)代码准备
- 上传代码
git init
git remote add origin git@gitlab.oldboylinux.cn:root/docker_bird_oldboy.git
git add .
git commit -m "刚刚写的代码"
git tag -a v1.0 -m "新建了一个标签"
git push -u origin master
git push -u origin --tags
2)书写dockerfile
- jenkins机器安装与启动docker
- 发送bird代码到jenkins的/app/code/bird/下面
- 准备开始书写dockerfile
cat Dockerfile
FROM nginx:1.22-alpine
LABEL author=lidao996 url=oldboyedu.com version=v1.0
COPY . /usr/share/nginx/html/
EXPOSE 80
#CMD 可以忽略,因为nginx镜像已有自动运行nginx服务的CMD了.
docker build -t web:ngx_bird_v1.0 .
docker run -d --name "ngx_bird_v1.0" -p 8848:80 --rm web:ngx_bird_v1.0
#--rm测试时候可以加上,如果不确定镜像稳定性可以不加上加上--restart=always.注意--restart和--rm冲突,二选一.
未来实际项目中:
前端代码一般需要编译(npm,cnpm,yarn),生成到指定的目录target/dist/…
通过dockefile COPY dist/* /usr/share/nginx/html/
3)准备私有仓库
- registry(docker02)启动docker私有仓库.
docker run -d --name "oldboy_registry" -p 5000:5000 -v registry:/var/lib/registry --restart=always registry:latest
- jenkins配置通过http方式访问私有仓库
[root@devops-oldboy-jenkins /app/code/bird]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://bjjtv7cs.mirror.aliyuncs.com"],
"insecure-registries": ["http://reg.oldboylinux.cn:5000"]
}
- 搭建完成私有仓库
docker build -t reg.oldboylinux.cn:5000/oldboyedu/web:ngx_bird_v2.0 .
#docker login -uxxx -pxxx
docker push reg.oldboylinux.cn:5000/oldboyedu/web:ngx_bird_v2.0
4)创建jenkins任务
#0.判断git_tag是否为默认
if [ "$git_tag" = "origin/master" ];then
git_tag=latest
fi
#1. 构建镜像
docker build -t reg.oldboylinux.cn:5000/oldboyedu/web:ngx_bird_${git_tag} .
#2. 推送到私有仓库
#docker login -uxxx -pxxx 私有仓库地址
docker push reg.oldboylinux.cn:5000/oldboyedu/web:ngx_bird_${git_tag}
#3. 部署web服务器
5)web节点上启动对应的docker容器
密钥认证
拉取镜像
启动容器
#vars
web_servers="172.16.1.82"
#0.判断git_tag是否为默认
if [ "$git_tag" = "origin/master" ];then
git_tag=latest
fi
#1. 构建镜像
docker build -t reg.oldboylinux.cn:5000/oldboyedu/web:ngx_bird_${git_tag} .
#2. 推送到私有仓库
#docker login -uxxx -pxxx 私有仓库地址
docker push reg.oldboylinux.cn:5000/oldboyedu/web:ngx_bird_${git_tag}
#3. 部署web服务器
for ip in ${web_servers}
do
ssh root@${ip} "
#0.未来可以加入判断判断端口是否占用
#端口冲突手动解决.未来可以ansible实现.
#if [ `docker ps |grep -w 80 |wc -l` -eq 1 ];then
#删除占用80端口的容器
# fi
docker ps |grep -w 80 |awk '{print $NF}'|xargs docker rm -f
#0.未来可以加入判断判断容器的名字是否有冲突.
if [ `docker ps -a |grep -w "ngx_bird_${git_tag}" |wc -l ` -eq 1 ];then
docker rm -f ngx_bird_${git_tag}
fi
#启动
docker run -d --name "ngx_bird_${git_tag}" \
-p 80:80 --restart=always \
reg.oldboylinux.cn:5000/oldboyedu/web:ngx_bird_${git_tag}"
done