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"] }