Docker - swarm

系统

docker 安装完即可使用 swarm,不需要安装什么软件,要说有什么优势,估计就是上手超快吧。

初始化

注意保存命令的执行结果。

    # 填固定 ip 地址
    docker swarm init --advertise-addr 127.0.0.1
    Swarm initialized: current node (qcjc4vkza2nr4uj2p1fwvpx4e) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join 
        --token SWMTKN-1-4kdb7ysckerhxc6gxc3bpltkxtm8o45yq1ikyv1kie825zibhh-bhwazb9y8i3s92v8mpv5c06so 
        127.0.0.1:2377
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

创建各个各节点

这些命令都可以在 init 步骤中直接复制,不过没记住也没事,执行 docker swarm join-token 查看。

    # 管理节点执行下面这个命令,之后根据提示进行操作
    docker swarm join-token manager

    # 普通节点执行下面这个命令
    docker swarm join 
    --token SWMTKN-1-4kdb7ysckerhxc6gxc3bpltkxtm8o45yq1ikyv1kie825zibhh-bhwazb9y8i3s92v8mpv5c06so 
    192.168.21.142:2377

查看节点信息

    docker node ls
启停节点
    # 节点下线,drain 状态下,node 节点会结束 task,且不再接受来自 manager 节点的任务分派
    docker node update --availability drain [id]
    # 节点上线,active 状态下,node 可以接受来自 manager 节点的任务分派;
    docker node update --availability active [id]
    # 让节点主动离开
    docker swarm leave
    # 移除一个节点,从 node 列表中完全清除
    docker node rm [id]

节点分配

部署程序的时候,每一台机子的职责不同,如何区分不同的机子呢?

  1. 给各个主机重命名,更方便进行查看(这个操作不是必要的,真实环境可能不允许修改)
    hostnamectl set-hostname  <newhostname>
  1. 给每个节点定义标签和角色
    # 重新确定 Leader,这个命令会清除所有 manager(转移 leader 节点的时候会用到)
    docker swarm init --force-new-cluster --advertise-addr 192.168.21.142
    
    # 设置一个角色
    docker node update --role manager node2
    
    # 设置一个标签
    docker node update --label-add mylabel=true node2
    # 移除一个标签
    docker node update --label-rm mylabel node2
  1. 查看各个节点的信息
  docker node inspect node2

需要用到的端口

The network ports required for a Docker Swarm to function properly are:

  1. TCP port 2376 for secure Docker client communication. This port is required for Docker Machine to work. Docker Machine is used to orchestrate Docker hosts.
  2. TCP port 2377. This port is used for communication between the nodes of a Docker Swarm or cluster. It only needs to be opened on manager nodes.
  3. TCP and UDP port 7946 for communication among nodes (container network discovery).
  4. UDP port 4789 for overlay network traffic (container ingress networking).

专有名词解释

前面涉及到的,都是通用的概念,了解集群的基本都能理解,后面这些是 swarm 下才有的。

  1. Task

    A task is analogous to a “slot” where the scheduler places a container.
    译:任务类似于调度任务放置容器的 “插槽”。
    task 是原子调度单元(最小单位),1 个 task 负责安装 1 个容器。

  2. Service

    A service is the definition of the tasks to execute on the manager or worker nodes.
    译:一个服务规定了任务在各个节点上的执行方式。(服务是对执行方式的一种声明、定义。)
    服务是镜像执行的最小单位,一个 service 负责一个镜像在整个集群环境上的部署。

  3. Node

    A node is an instance of the Docker engine participating in the swarm.
    译:node 是参与 swarm 集群的 docker 引擎的一个实例。
    说白了就是集群下的每一个 docker。

service

    
    # 使用 docker service ls 来查看当前 Swarm 集群运行的服务。
    docker service ls

    # 使用 docker service ps 来查看某个服务的详情。
    docker service ps nginx

    # 使用 docker service logs 来查看某个服务的日志。
    docker service logs nginx

    # 我们可以使用 docker service scale 对一个服务运行的容器数量进行伸缩。
    # 增加或者减少容器的数量。
    docker service scale nginx=5

    # 使用 docker service rm 来从 Swarm 集群移除某个服务。
    docker service rm nginx


    # 如果部署完成之后有配置文件的修改,则可以通过deploy来更新服务(与部署命令一致)
    docker stack deploy -c docker-compose.yml wordpress

    # 单个service更新
    docker service update kafka_kafka2

    # 要移除服务,使用 docker stack down
    # 该命令不会移除服务所使用的 数据卷,如果你想移除数据卷请使用 docker volume rm
    docker stack down wordpress
使用 yml 部署集群

利用 yml 文件开始创建 swarm 集群

    # 使用 yml 部署镜像,这个命令也用于更新部署
    docker stack deploy -c docker-compose.yml example

文件参考:

version: "3.7"
services:

  web:
    image: nginx:latest
    ports:
      - "80:80"
    networks:
      - webnet
    volumes:
      - "webdata:/usr/share/nginx/html"
    deploy:
      replicas: 3
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  visualizer:
    image: dockersamples/visualizer:latest
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
networks:
  webnet:

volumes:
  webdata:

posted on 2023-09-11 17:30  疯狂的妞妞  阅读(16)  评论(0编辑  收藏  举报

导航