创建
# 启动Manager节点
docker swarm init --advertise-addr=ip

# 添加worker(另一个docker中运行,成功提示This node joined a swarm as a worker.)
docker swarm join --token SWMTKN-1-43yyxfb3b0cc64vzy7t8pvxulizm3p9v5kr83su66bbbph7e77-clv5mylfl2z9dnouxm659jnt7 192.168.205.10:2377
# 查询节点
docker node ls
# 创建网络
docker network create -d overlay test
# 查看网络
docker network ls
# 创建服务
docker service create --name test --replicas 2 --network test busybox sh -c "while true;do sleep3600;done"
worker2中将没有test网络,manager和worker1有

# 拓展服务,docker rm -f 容器id删除后,会自动创建一个保证有5个
docker service scale test=5
# 查询服务
docker service ps test
# 删除服务
docker service rm test
集群服务间通信
- Internal:Container和Container之间通过overlay网络进行通信
- Ingress:如果有服务绑定接口,则此服务可以通过任意swarm节点的相应接口访问
请求的大致过程:通过服务名请求->DNS解析->转化为VIP->路由转发和负载均衡->某个服务进行响应
Docker Stack
version: '3'
services:
# 服务name
web:
# 服务Image
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
# 决定重新启动是否成功之前要等待的时间
window: 120s
update_config:
# 一次更新的容器数
parallelism: 1
# 在更新一组容器之间等待的时间
delay: 10s
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
# 数据卷
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-network
deploy:
mode: global
placement:
constraints:
# 在manager节点运行
- node.role == manager
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8081:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
volumes:
mysql-data:
networks:
my-network:
driver: overlay
# 运行
docker stack deploy wordpress --compose-file=docker-compose.yml
# 查看服务
docker stack services wordpress
# 删除服务
docker stack rm wordpress
Docker Secret
概念
存在Swarm Manager节点的Raft database里,通过assign给一个sevice,使其可以看到
方式
- 命令
# 内容为明文密码
vim password
# 创建secret
docker secret create my-pw password
# 查看
docker secret ls
# 运行
docker service create --name mysql1 --secret my-pw -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/my-pw mysql
# 进入容器内部
docker exec -it 9468004ddab5 sh
# 到指定目录
cd /run/secrets/
# 查看密码
more my-pw
- yml(通过这种方式避免明文直接暴露)
...
secrets:
- my-pw
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/my-pw
...