docker - swarm

系统

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

本文就先把常用的内容,快速地过一遍,快速起一个 helloworld,细节以后补充。

初始化

执行 docker swarm init --advertise-addr 127.0.0.1,127.0.0.1要写主机的 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.

创建各个各节点

这些命令都可以在初始化步骤中直接复制,如果前面步骤忘记保存,执行 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

# 这些配置对应于 yml 中的 constraints 配置
  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.
    译:任务类似于调度任务放置容器的 “插槽”。

  2. Service:一个服务,负责安装一个镜像。

    A service is the definition of the tasks to execute on the manager or worker nodes.
    译:一个服务规定了任务在各个节点上的执行方式。(服务是对执行方式的一种声明、定义。)

  3. Node:字面意义上的节点,也就是 swarm 集群下每一个 docker。

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

Alt

运维常用命令

    
# 使用 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,写完就可以对文件进行整理归档。
运维人员也不会有太多学习压力,只要知道 deploy 命令,就可完成部署。

# 使用 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  疯狂的妞妞  阅读(19)  评论(0编辑  收藏  举报

导航