NipGeihou's blog NipGeihou's blog
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档

NipGeihou

我见青山多妩媚,料青山见我应如是
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档
  • Linux

  • Docker

    • 基本命令
    • Docker Compose Specification快速开始
    • Docker Swarm
      • 场景
      • 概念
        • Nodes 节点
        • Docker node
        • Manager node
        • Worker node
        • Services and tasks 服务和任务
        • Load balancing 负载均衡
      • 常见命令
      • 最佳实践
        • 所有节点 - 安装Docker
        • 管理节点 - 创建集群
        • 工作节点 - 加入集群
        • 管理节点 - 部署服务
        • 管理节点 - 扩展服务
        • 管理节点 - 删除服务
        • 管理节点 - 滚动更新服务
        • 管理节点 - 指定节点部署
      • 可视化面板 - Portainer
        • 安装
    • Docker容器默认时区导致MySQL时区问题错误
    • Docker - 概述
    • Docker - 基本概念
    • Docker - 自定义镜像(Dockerfile)
    • Docker Compose
    • Docker镜像仓库
    • 常用容器

  • 云原生

  • Kubernetes

  • KubeSphere

  • K3S

  • 笔记

  • PVE

  • 维修

  • DevOps

  • 云服务

  • 路由器

  • Hyper-V

  • Windows

  • macOS

  • 运维
  • Docker
NipGeihou
2025-04-18
目录

Docker Swarm

# 场景

需求在众多 Docker 主机中运行独立程序,程序直接无需通信。

# 概念

# Nodes 节点

# Docker node

一个 Docker 主机即为一个节点

# Manager node

  • 用于管理这些 Docker 主机(节点)的节点,称作管理节点。
  • 管理节点还执行维持集群所需状态所需的编排和集群管理功能。管理节点会选择一个领导者来执行编排任务。

# Worker node

工作节点接收并执行管理节点调度的任务。 默认情况下,管理器节点也作为工作节点运行服务,但可以将它们配置为仅运行管理器任务并且仅供管理器使用节点。

# Services and tasks 服务和任务

# Load balancing 负载均衡

# 常见命令

# 查看节点列表
docker node ls

# 查看节点详情
docker node inspect <node-name>

# 最佳实践

# 所有节点 - 安装 Docker

# todo

# 管理节点 - 创建集群

docker swarm init --advertise-addr <MANAGER-IP>
# docker swarm init --advertise-addr 192.168.99.100

--advertise-addr  标志将管理节点配置为将其地址发布为  192.168.99.100  。Swarm 中的其他节点必须能够通过该 IP 地址访问管理节点。

执行命令后的输出中,包含工作节点加入集群的命令。工作节点将根据  --token  的值以管理节点或工作节点的身份加入。

# 查看集群信息
docker info

# output
Containers: 2
Running: 0
Paused: 0
Stopped: 2
  ...snip...
Swarm: active # swarm信息
  NodeID: dxn1zf6l61qsb1josjja83ngz
  Is Manager: true
  Managers: 1
  Nodes: 1
  ...snip...

# 查看节点信息;节点 ID 旁边的 `*` 表示当前已连接到该节点。
docker node ls

# output
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
dxn1zf6l61qsb1josjja83ngz *  manager1  Ready   Active        Leader
# Swarm会根据主机名(host name)来命名节点

# 工作节点 - 加入集群

将上面创建集群时输出的加入集群的命令,粘贴到工作节点

docker swarm join \
  --token  SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
  192.168.99.100:2377
  
# 如果提示This node is already part of a swarm.则需要先退出:
# docker swarm leave

如果丢失了加入命令,可在管理节点输入以下命令,查找:

docker swarm join-token worker

# 管理节点 - 部署服务

docker service create --replicas 1 --name helloworld alpine ping docker.com
  • docker service create  命令创建服务。
  • --name  标志将服务命名为  helloworld  。
  • --replicas  标志指定 1 个正在运行的实例的所需状态。
  • 参数  alpine ping docker.com  将服务定义为执行命令  ping docker.com  Alpine Linux 容器。

正在运行的服务列表

docker service ls

查看服务详细信息

docker service inspect --pretty <SERVICE-ID>
# docker service inspect --pretty helloworld
# docker service inspect helloworld # 去除--pretty,以JSON格式返回

查看哪些节点正在运行该服务

docker service ps <SERVICE-ID>
# docker service ps helloworld

# 管理节点 - 扩展服务

docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>
# docker service scale helloworld=5 # 扩展helloworld到5个实例

# 管理节点 - 删除服务

docker service rm helloworld

# 检查是否已删除
docker service inspect helloworld

# 管理节点 - 滚动更新服务

创建一个 redis 服务

docker service create \
  --replicas 3 \
  --name redis \
  --update-delay 10s \
  redis:7.4.0

0u6a4s31ybk7yw2wyvtikmu50
  • --update-delay  标志配置服务任务或任务集更新之间的时间延迟。您可以将时间  T  描述为秒数  Ts  、分钟数  Tm  或小时数  Th  的组合。因此  10m30s  表示延迟 10 分钟 30 秒。
  • 默认情况下,调度程序每次更新 1 个任务。你可以传递  --update-parallelism  标志用于配置调度程序同时更新的最大服务任务数。
  • 默认情况下,当对单个任务的更新返回  RUNNING  ,调度程序会安排另一个任务进行更新,直到所有任务都更新完毕。如果在更新过程中,任何任务返回  FAILED  ,则 调度程序暂停更新。您可以使用  docker service create --update-failure-action  标志或  docker service update  。

升级 redis 服务

docker service update --image redis:7.4.1 redis

查看滚动更新的情况

docker service ps <SERVICE-ID>
# docker service ps redis

# 管理节点 - 指定节点部署

向节点添加标签

docker node update --label-add <key>=<value> <node-name>
# docker node update --label-add role=webserver node1

# 查看节点信息
docker node inspect <node-name>
# docker node inspect node1

部署服务

docker service create --name my-service --constraint 'node.labels.role==webserver' my-image

扩展:传递模板字符串 https://docs.docker.com/reference/cli/docker/service/create/#create-services-using-templates

# 可视化面板 - Portainer

# 安装

docker volume create portainer_data

docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:lts
上次更新: 2025/04/24, 22:30:33
Docker Compose Specification快速开始
Docker容器默认时区导致MySQL时区问题错误

← Docker Compose Specification快速开始 Docker容器默认时区导致MySQL时区问题错误→

最近更新
01
磁盘管理与文件系统
05-02
02
网络测试 - iperf3
05-02
03
安全隧道 - gost
04-17
更多文章>
Theme by Vdoing | Copyright © 2018-2025 NipGeihou | 友情链接
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式