Skip to content

docker swarm使用

注意:docker swarm没有内置支持各个容器副本独立的数据存储卷功能,似乎mesos支持这个特性。

docker swarm环境搭建

注意:公司环境和google环境在centOS8.5centOS stream 8上搭建swarmoverlay网络都无法正常工作;公司环境ubuntu20.4上搭建swarmoverlay网络也是无法正常工作;只有centOS7搭建swarmoverlay网络能够正常工作。

建议:因为k8s能够实现swarm的所有功能,所以建议使用k8s作为swarm的替代方案。

centOS7搭建

https://docs.docker.com/engine/swarm/swarm-tutorial/

使用dcli安装docker

bash
# 设置dcli工具
sudo rm -f /usr/bin/dcli && sudo curl https://fut001.oss-cn-hangzhou.aliyuncs.com/dcli/dcli-linux-x86_64 --output /usr/bin/dcli && sudo chmod +x /usr/bin/dcli

# 安装docker,版本26.1.1-1
sudo dcli docker install

分别设置managerworker1worker2节点主机名称

bash
hostnamectl set-hostname manager
hostnamectl set-hostname worker1
hostnamectl set-hostname worker2

manager节点上执行下面命令初始化manager节点

bash
docker swarm init --advertise-addr 192.168.1.203

manager节点上执行下面命令获取worker节点加入manager节点的命令

bash
docker swarm join-token worker

worker节点中执行上面的docker swarm join命令加入manager节点

bash
docker swarm join --token SWMTKN-1-23k8qyy8z3ljysi615rt6ytx7r2vmk5js4e9sg1h5nopiop08e-anddk72iojfkkc5mkm8haq9m9 192.168.1.203:2377

manager节点上执行下面命令查看swarm集群节点信息

bash
docker node ls

当前节点退出集群

bash
docker swarm leave

创建服务测试swarm集群overlay网络是否正常

bash
docker service create --detach=true --replicas 1 --name test-nginx --publish published=80,target=80 nginx

打开浏览器随机访问一个swarm节点都能够查看到nginx欢迎页面表示overlay网络正常运行 http://192.168.1.203http://192.168.1.204http://192.168.1.205

service的使用

创建service

bash
docker service create --detach=true --replicas 1 --name helloworld alpine ping www.baidu.com

查看service列表

bash
docker service ls

查看指定service的详细信息

bash
docker service inspect --pretty helloworld

查看service在哪个节点运行

bash
docker service ps helloworld

删除service

bash
docker service rm helloworld

动态缩放service

bash
docker service scale helloworld=5

查看service日志

bash
docker service logs -f helloworld

进入某个容器的cli

进入service某个容器cli,获取helloworld service在哪个节点运行信息

bash
docker service ps helloworld

找到运行helloworld service节点,查找容器id,使用docker exec -it进入容器cli

bash
docker ps -a
docker exec -it containerId /bin/sh

使worker节点进入drain模式,进行维护

https://docs.docker.com/engine/swarm/swarm-tutorial/drain-node/

routing mesh,使用routing mesh配置好overlay网络,否则请求响应缓慢

https://docs.docker.com/engine/swarm/ingress/

bash
# 创建nginx service,使用routing mesh
docker service create --name nginx --publish 80:8080 nginx

# 增加nginx负载实例
docker service scale nginx=10

配置docker swarm节点间跨主机通讯

https://blog.csdn.net/lixuanshengchao/article/details/82707249

manger节点创建overlay网络

sh
docker network create --driver=overlay --subnet=10.0.9.0/24 --gateway=10.0.9.1 --attachable=true overlaynet1

分别在三台docker主机上面创建docker容器

sh
docker run --rm --detach -it --network=overlaynet1 --name=test1 centos:7
docker run --rm --detach -it --network=overlaynet1 --name=test2 centos:7
docker run --rm --detach -it --network=overlaynet1 --name=test3 centos:7

在容器中相互ping对方(例如:ping test2)、ping 192.168.1.123ping www.baidu.com都成功

docker service使用overlay网络通讯,创建名为h1服务,使用overlay网络通讯

sh
docker service create --detach=true --network=overlaynet1 --replicas 1 --name h1 alpine ping www.baidu.com

docker stack用法

docker compose文件的deploy设置参考

创建docker-compose.yaml

yaml
version: '3.8'  
  
services:  
  nginx:  
    image: nginx
    ports:
      - "80:80"
    # 只启动一个nginx实例
    deploy:
      replicas: 1

根据docker-compose.yaml部署stack,其中-c表示--compose-file

sh
docker stack deploy test1 -c docker-compose.yaml

查看已部署的堆栈

sh
docker stack ls

查看stackservice的容器实例状态

sh
docker stack ps test1

删除stack

sh
docker stack rm test1

查看stack中所有服务

sh
docker stack services test1

查看指定服务日志

sh
docker service logs test1_web
docker service logs -f --tail 10 test1_web

指定service运行的节点

指定标签

查询swarm集群所有节点

sh
docker node ls

给节点打标签

sh
docker node update --label-add mylabel=ml1 worker1

删除节点标签

sh
docker node update --label-rm mylabel worker1

查看节点标签

sh
docker node inspect worker1

指定service部署的节点

yaml
version: '3.8'  
  
services:  
  db:  
    image: mariadb:10.4.19
    ports:
      - "3306:3306"
    environment:
      - MARIADB_ROOT_PASSWORD="123456"
    deploy: 
      replicas: 1 
      placement:  
        constraints:
          - node.labels.mylabel==ml1

部署service

sh
docker stack deploy test1 --compose-file docker-compose.yaml

指定节点名称

查询swarm集群所有节点

sh
docker node ls

指定service部署的节点

yaml
version: '3.8'  
  
services:  
  db:  
    image: mariadb:10.4.19
    ports:
      - "3306:3306"
    environment:
      - MARIADB_ROOT_PASSWORD="123456"
    deploy: 
      replicas: 1 
      placement:  
        constraints:
          - node.hostname==worker1

部署service

sh
docker stack deploy test1 --compose-file docker-compose.yaml

使用基于spring-cloud的微服务测试swarm集群

参考文档运行 辅助示例

docker swarm管理

删除指定节点

https://docs.docker.com/reference/cli/docker/node/rm/

bash
# nodeid通过docker node ls获取
docker node rm <nodeid>

查看stack中所有服务

sh
docker stack services test1

删除stack中的service

查看stack test1中的service列表

bash
docker stack services test1

删除service

bash
docker service rm test1_creator