compose yml的reference:https://docs.docker.com/compose/compose-file/
官方例子: version: "3.3" services: wordpress: image: wordpress ports: - "8080:80" networks: - overlay deploy: mode: replicated replicas: 2 endpoint_mode: vip #vip指service互访的时候,往外暴露的是虚拟的ip,底层通过lvs,负载均衡到后端服务器。默认为vip模式。 mysql: image: mysql volumes: - db-data:/var/lib/mysql/data networks: - overlay deploy: mode: replicated replicas: 2 endpoint_mode: dnsrr #dnsrr,直接使用service的ip地址,当横向扩展了以后,可能有三个或者四个IP地址,循环调用。 volumes: db-data: networks: overlay:
还有labels:打标签
mode:global和replicated,global代表全cluster只有一个,不能做横向扩展。replicated,mode的默认值,可以通过docker service scale做横向扩展。
placement:设定service的限定条件。比如:
version: '3.3' services: db: image: postgres deploy: placement: constraints: - node.role == manager #db这个service一定会部署到manager这个节点,并且系统环境一定是ubuntu 14.04 - engine.labels.operatingsystem == ubuntu 14.04 preferences: - spread: node.labels.zone
replicas:如果设置了模式为replicted,可以设置这个值
resources:资源占用和保留。
restart_policy: 重启条件,延迟,重启次数
update_config: 配置更新时的参数,比如可以同时更新2个,要等10秒才更新第二个
cat docker-compose.yml
version: '3' services: web: #这个service叫web image: wordpress ports: - 8080:80 environment: WORDPRESS_DB_HOST: mysql WORDPRESS_DB_PASSWORD: root networks: - my-network depends_on: - mysql deploy: mode: replicated replicas: 3 restart_policy: condition: on-failure delay: 5s max_attempts: 3 update_config: parallelism: 1 delay: 10s mysql: #这个service叫mysql image: mysql environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: wordpress volumes: - mysql-data:/var/lib/mysql networks: - my-network deploy: mode: global #指能创建一台,不允许replicated placement: constraints: - node.role == manager volumes: mysql-data: networks: my-network: driver: overlay #默认为bridge,但是我们在多机集群里,要改成overlay。
发布:
docker stack deploy wordpress --compose-file=docker-compose.yml #stack的名字为wordpress
查看:
docker stack ls docker stack ps wordpress docker stack services wordpress #显示services replicas的情况。
访问:随便挑一台node的ip 8080端口
注意:docker swarm不能使用上面投票系统中的build,所以要自己build image
投票系统,使用docker swarm部署:
cat docker-compose.yml
version: "3" services: redis: image: redis:alpine ports: - "6379" networks: - frontend deploy: replicas: 2 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure db: image: postgres:9.4 volumes: - db-data:/var/lib/postgresql/data networks: - backend deploy: placement: constraints: [node.role == manager] vote: image: dockersamples/examplevotingapp_vote:before ports: - 5000:80 networks: - frontend depends_on: - redis deploy: replicas: 2 update_config: parallelism: 2 restart_policy: condition: on-failure result: image: dockersamples/examplevotingapp_result:before ports: - 5001:80 networks: - backend depends_on: - db deploy: replicas: 1 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure worker: image: dockersamples/examplevotingapp_worker networks: - frontend - backend deploy: mode: replicated replicas: 1 labels: [APP=VOTING] restart_policy: condition: on-failure delay: 10s max_attempts: 3 window: 120s placement: constraints: [node.role == manager] visualizer: image: dockersamples/visualizer:stable ports: - "8080:8080" stop_grace_period: 1m30s volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: placement: constraints: [node.role == manager] networks: frontend: #在swarm模式下默认是overlay的 backend: volumes: db-data:
启动:
docker stack deploy voteapp --compose-file=docker-compose.yml