13.docker-statck --- demo
通过docker-stack部署项目到docker的swarm集群,部署完成后,提交代码自动更新swarm集群上面的springboot镜像。
==环境=========================
准备四台docker host
* 192.168.100.100 jenkins
* 192.168.100.62(manager62) registry
* 192.168.100.63(node63)
* 192.168.100.64(node64)
==说明========================
上面四台都是docker host,docker私有仓库位于manager62上面
各个机器间配置好域名映射
各个机器都要在/etc/docker/daemon.json中配置私有registry的地址
jenkins构建好构件,(通过shell)推送镜像到manager62
jenkins通过ssh执行manager62上的脚本更新swarm上的springboot镜像
==流程==========================
maven使用dockerfile-maven-plugin插件把构件打包成docker image
jenkins 构建post steps中执行脚本推送镜像到registry
docker push manager62:7000/docker-test:1.0.0

到manager62上执行
mkdir -p /data/project/docker_test cd /data/project/docker_test
上传配置文件和脚本到manager62
scp docker-compose.yml root@192.168.100.62:/data/project/docker_test scp update_springboot.sh root@192.168.100.62:/data/project/docker_test
到manager62上执行第一次部署
cd /data/project/docker_test
docker-compose stack deploy -c docker-compose.yml docker_test
修改jenkins配置,添加post steps *send files or execute commands over ssh*
sh /data/project/docker_test/update_springboot.sh

之后提交代码到git,会触发swarm上面的docker 镜像更新
dockerfile文件
FROM java:8 MAINTAINER lhnonline 0376lhn@gmail.com COPY target/docker-test-1.0.0.jar /app.jar EXPOSE 8080 ENV CE=$CE ENV JAVA_OPTS=$JAVA_OPTS ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar --spring.profiles.active=$CE" ]
docker-compse.yml文件
version: '3'
services:
redis:
image: redis:6.0
deploy:
placement:
constraints: [node.hostname == manager62]
restart_policy:
condition: on-failure
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- backend
restart: always
mysql:
image: mysql:5.6
deploy:
restart_policy:
condition: on-failure
placement:
constraints: [node.hostname == node63]
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
networks:
- backend
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: docker_test
MYSQL_USER: foo
MYSQL_PASSWORD: foo
docker_test:
image: manager62:7000/docker-test:1.0.0
deploy:
placement:
constraints: [node.hostname == node64]
replicas: 1
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.8"
memory: 500M
depends_on:
- mysql
- redis
ports:
- "8080:8080"
volumes:
- docker_test:/logs
networks:
- backend
links:
- mysql
restart: always
environment:
CE: test
volumes:
mysql_data: {}
docker_test: {}
redis_data: {}
networks:
backend:
update_springboot.sh文件
#!/bin/bash project_name=docker_test work_dir=/data/project/$project_name docker_mirror_name=manager62:7000/docker-test:1.0.0 echo "`echo $(date +%F%n%T)` update docker service ..." >> $work_dir/log.txt docker service update --image $docker_mirror_name docker_test_docker_test
manager62的/etc/hosts文件
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.100.62 docker-registry 192.168.100.62 manager62 192.168.100.63 node63 192.168.100.64 node64
manager62的/etc/docker/daemon.json文件
{ "registry-mirrors": ["https://xuq3p1fy.mirror.aliyuncs.com"], "insecure-registries": ["manager62:7000"] }
浙公网安备 33010602011771号