swarm 学习笔记

《官方文档:https://docs.docker.com/engine/swarm/swarm-tutorial/#open-protocols-and-ports-between-the-hosts》

 

hostnamectl set-hostname manager

hostnamectl set-hostname worker1

hostnamectl set-hostname worker2
=============

创建集群:docker swarm init --advertise-addr 10.0.2.15
其中 10.0.2.15 是manager节点的ip

返回值告诉我们如何添加work 节点,如果忘记了添加work节点的命令,可以通过 docker swarm join-token worker 查看。
查看添加manager节点的命令:docker swarm join-token manager

查看当前swarm集群中的节点状态:docker node ls

默认配置下 manager node 也是 worker node,所以 swarm-manager 上也运行了副本。如果不希望在 manager 上运行 service,可以执行如下命令:
docker node update --availability drain swarm-manager

===============
检查防火墙状态:systemctl status firewalld.service 或 firewall-cmd --state
查看防火墙:firewall-cmd --list-all
更新防火墙规则:firewall-cmd --reload
启停防火墙:systemctl start firewalld.service
systemctl stop firewalld.service


临时增加:firewall-cmd --add-port=999/tcp
永久增加:firewall-cmd --permanent --add-port=999/tcp
firewall-cmd --reload

删除端口:firewall-cmd --remove-port=999/tcp
----
firewall-cmd --permanent --remove-port=999/tcp
firewall-cmd --reload


查询端口firewall-cmd --query-port=999/tcp
查看所有放行的端口:firewall-cmd --list-ports

 


添加端口:

 

 


firewall-cmd --permanent --add-port=2377/tcp

firewall-cmd --permanent --add-port=7946/tcp
firewall-cmd --permanent --add-port=7946/udp
firewall-cmd --permanent --add-port=4789/udp
firewall-cmd --reload
firewall-cmd --list-ports
============
如果开启防火墙,则需要在所有节点的防火墙上依次放行2377/tcp(管理端口)、7946/udp(节点间通信端口)、4789/udp(overlay 网络端口)端口。

查看部署的服务:docker service ls
查看服务每个副本的状态:docker service ps <service name>
查看 service 的当前配置:docker service inspect
删除服务:docker service rm <servicee name>

为了外部网络可以访问服务,需要使用--publish-add, 将容器的端口映射到主机的端口,这样外部网络就能访问到 service 了,这样访问任何一个节点的ip都能访问到服务

查看宿主机上的容器网络:docker network ls
通过服务发现,service 的使用者不需要知道 service 运行在哪里,IP 是多少,有多少个副本,就能与 service 通信。
要使用服务发现,需要相互通信的 service 必须属于同一个 overlay 网络,所以我们先得创建一个新的 overlay 网络
虽然ingress也是overlay 网络,但ingress 没有提供服务发现,必须创建自己的 overlay 网络


可以通过 --rollback 快速恢复到更新之前的状态,--rollback 只能回滚到上一次执行 docker service update 之前的状态,并不能无限制地回滚
docker service update --rollback <service name>

service提供了一个 global mode,其作用是强制在每个 node 上都运行一个且最多一个副本。即使之后有新的 node 加入,swarm 也会自动在新 node 上启动容器
docker service create \
--mode global \
--name logspout \
--mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock \
gliderlabs/logspout


可以通过给节点打标签和设置容器的constraint来控制容器运行在哪个节点上
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


通过--health-cmd 进行健康检查:
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 的副本

========
yaml官方文档:https://docs.docker.com/compose/compose-file/
创建应用:docker stack deploy ocr-system -c /export/system-install-offline/docker-compose.yaml
yaml修改后,也是通过docker stack deploy 命令来生效修改

为了不重名,所有资源都会加上 stack 名称作为前缀

查看应用列表:docker stack ls

查看所有的服务:docker service ls
删除应用
docker stack rm ocr-system
列出某个应用下面的服务
docker stack ps ocr-system
查看应用下的服务
docker stack services ocr-system
查看应用下的详细信息
docker stack ps ocr-system

docker service inspect tst2_flask-svc

docker service logs tst2_flask-svc

docker service ps tst2_flask-svc

如果需要从镜像仓库拉镜像,首先要在执行deploy的节点上docker login镜像仓库(其他节点不用login),然后在deploy时需要加上 --with-registry-auth

docker stack deploy -c tst.yaml tst --with-registry-auth 

 

docker stack deploy -c tst.yaml tst --with-registry-auth 

 

虽然manager节点上可以运行容器,但强烈不建议,因为若manager节点挂了,上面的服务也就挂了。如果服务是运行在worker节点,若worker节点挂了,服务可以迁移到其他节点

 排空一个节点:docker node update --availability drain worker1

恢复节点:docker node update --availability active worker1

posted on 2021-08-07 16:03  我和你并没有不同  阅读(72)  评论(0编辑  收藏  举报