docker node ls
docker service create --name web_server --replicas=2 httpd
docker service ls
docker service ps web_server
docker service scale web_server=5 # 扩容
docker service scale web_server=3 # 缩容
docker service rm web_server
要将 service 暴露到外部: docker service update --publish-add 8080:80 web_server
如果是新建 service,可以直接用使用 --publish 参数: docker service create --name web_server --publish 8080:80 --replicas=2 httpd
为什么 curl 集群中任何一个节点的 8080 端口,都能够访问到 web_server?
无论访问哪个节点,即使该节点上没有运行 service 的副本,最终都能访问到 service。
要使用服务发现,需要相互通信的 service 必须属于同一个 overlay 网络,所以我们先得创建一个新的 overlay 网络。
docker network create --driver overlay myapp_net
部署 service 到 overlay:
docker service create --name my_web --replicas=3 --network myapp_net httpd
查看每个副本的 IP:
docker exec util.1.bpon0vvbgve6lz3fp08sgana6 nslookup tasks.my_web
将 service 更新到 httpd:2.2.32:docker service update --image httpd:2.2.32 my_web
查看 service 的当前配置:docker service inspect --pretty my_web
回滚:docker service update --rollback my_web
请注意:--rollback 只能回滚到上一次执行 docker service update 之前的状态,并不能无限制地回滚。
ex-Ray 是开源的容器存储管理解决方案
globalmode:其作用是强制在每个 node 上都运行一个且最多一个副本。即使之后有新的 node 加入,swarm 也会自动在新 node 上启动一个 gliderlabs/logspout 副本。
docker service create
--mode global
--name logspout
--mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock
gliderlabs/logspout
给节点打标签:docker node update --label-add env=test swarm-worker1
通过标签部署服务:docker service create
--constraint node.labels.env==test
--replicas 3
--name my_web
--publish 8080:80
httpd
通过标签迁移服务:
docker service update --constraint-rm node.labels.env==test my_web
docker service update --constraint-add node.labels.env==prod my_web
label 还可以跟 global 模式配合起来使用:
docker service create
--mode global
--constraint node.labels.env==prod
--name logspout
--mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock
gliderlabs/logspout
Health Check 可以是任何一个单独的命令:
docker service create --name my_db
--health-cmd "curl --fail http://localhost:8091/pools || exit 1"
couchbase
--health-cmd Health Check 的命令,还有几个相关的参数:
--timeout 命令超时的时间,默认 30s。
--interval 命令执行的间隔时间,默认 30s。
--retries 命令失败重试的次数,默认为 3,如果 3 次都失败了则会将容器标记为 unhealthy。swarm 会销毁并重建 unhealthy 的副本。
使用 secret 启动 MySQL 容器:
1)在 swarm manager 中创建 secret my_secret_data,将密码保存其中。
echo "my-secret-pw" | docker secret create my_secret_data -
2)启动 MySQL service,并指定使用 secret my_secret_data。
docker service create
--name mysql
--secret source=my_secret_data,target=mysql_root_password
-e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password"
mysql:latest
注意:解密后的内容保存到容器 /run/secrets/mysql_root_password 文件中,文件名称 mysql_root_password 由 target 指定
secret 只能在 swarm service 中使用。普通容器想使用 secret,可以将其包装成副本数为 1 的 service。
Docker 提供了 config 子命令来管理不需要加密的数据。config 与 secret 命令的使用方法完全一致。
secret 创建后,即使是 swarm manager 也无法查看 secret 的明文数据,只能通过 docker secret inspect 查看 secret 的一般信息。
stack 将应用所包含的 service,依赖的 secret、voluem 等资源,以及它们之间的关系定义在一个 YAML 文件中。
通过stack(yaml)定义服务之间的依赖关系: https://docs.docker.com/compose/compose-file/
部署stack:docker stack deploy -c wordpress.yml wpstack
注意:为了不重名,所有资源都会加上 stack 名称作为前缀,我们这里是 wpstack_*。
如果想更新 stack 的某些属性,直接修改 YAML 文件,然后重新部署:docker stack deploy -c wordpress.yml wpstack
查看应用中的服务:docker stack service wpstack
docker stack ps wpstack
删除应用:docker stack rm wpstack