个人用云计算学习笔记 --32 Docker和docker swarm

文章目录

Docker

一、容器生态系统

1. 容器技术基础

  • 定义:容器技术是继大数据、云计算后热门技术,通过 "集装箱" 思想将应用及依赖打包为轻量级、可移植、自包含的运行单元,实现 "Build Once, Run Anywhere",解决环境一致性问题。
  • 核心价值:降低部署复杂度、提升资源利用率、支持快速扩缩容与跨环境迁移,是 IT 从业者提升自我价值的关键技能。

2. 容器生态系统三层架构

(1)核心技术(容器运行基础)
技术类型 核心组件 作用与说明
容器规范 OCI(Open Container Initiative) 制定 runtime specimage format spec,保障不同容器(Docker、rkt、podman)兼容性与可移植性
容器 runtime lxc、runc、rkt 为容器提供运行环境,与 OS 内核协作;runc 是 Docker 默认 runtime(符合 OCI 规范),lxc 是老牌 runtime
容器管理工具 Docker Engine(daemon+CLI)、lxd、rkt cli 对内与 runtime 交互,对外提供用户接口(如 CLI),Docker Engine 即日常所说的 "Docker"
容器定义工具 Docker Image、Dockerfile、ACI 定义容器内容与属性;Docker Image 是容器模板,Dockerfile 是构建镜像的指令集,ACI 是 rkt 的镜像格式
Registry Docker Hub、Quay.io、私有 Registry 集中存储镜像;Docker Hub 是公有仓库,企业可自建私有 Registry
容器 OS CoreOS、Atomic、Ubuntu Core 专为容器优化,体积小、启动快、运行效率高,适配容器运行需求
(2)平台技术(容器集群化运行)
技术类型 核心组件 作用与说明
容器编排引擎 Docker Swarm、Kubernetes、Mesos+Marathon 管理容器集群,实现容器创建、调度、高可用;Kubernetes 是主流开源方案,支持多容器类型
容器管理平台 Rancher、ContainerShip 架构在编排引擎之上,支持多编排引擎,提供一键部署、应用目录等简化功能
基于容器的 PaaS Deis、Flynn、Dokku 为微服务开发提供全生命周期平台,用户无需关心底层基础设施,专注应用开发
(3)支持技术(容器基础设施保障)
技术类型 核心组件 作用与说明
容器网络 Docker Network、flannel、weave、calico 管理容器间及容器与外部的连通性和隔离性;Docker Network 是原生方案,第三方方案各有适配场景
服务发现 etcd、consul、zookeeper 解决微服务动态环境下服务定位,保存服务 IP / 端口,提供查询 API
监控 docker ps/top/stats、sysdig、cAdvisor/Heapster、Weave Scope 监控容器资源与状态;docker stats 是原生命令,cAdvisor 支持指标收集与第三方集成
数据管理 Flocker 保障容器跨主机迁移时,持久化数据动态迁移
日志管理 docker logs、logspout 收集、路由容器日志;logspout 支持日志转发至其他工具后处理
安全性 OpenSCAP 扫描容器镜像漏洞,保障容器运行安全

3. Docker 安装

Docker 支持几乎所有的 Linux 发行版,也支持 Mac 和 Windows。各操作系统的安装方法可以访问:https://docs.docker.com/engine/installation/

卸载旧版本(可选)

bash 复制代码
[root@docker ~]# yum remove docker-ce

安装必要工具

bash 复制代码
# devicemapper 存储驱动已经在 docker 18.09 版本中被废弃,所以在后续的安Docker装中无需安装devicemapper支持。
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 vim      
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@localhost ~]# yum makecache
Docker CE Stable - x86_64                                                                             57 kB/s |  66 kB     00:01
CentOS Stream 8 - BaseOS                                                                             8.3 kB/s | 3.9 kB     00:00
CentOS Stream 8 - AppStream                                                                          9.8 kB/s | 4.4 kB     00:00
Metadata cache created.

allinone部署

安装软件

bash 复制代码
[root@docker ~]# yum install -y docker-ce

配置服务

bash 复制代码
[root@docker ~]# systemctl enable docker.service --now

验证安装

查看docker版本

bash 复制代码
[root@docker ~]# docker --version
Docker version 26.1.3, build b72abbb

验证docker状态

bash 复制代码
[root@docker ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2025-09-03 13:51:07 CST; 36s ago
     Docs: https://docs.docker.com
 Main PID: 1813 (dockerd)
    Tasks: 10
   Memory: 135.7M
   CGroup: /system.slice/docker.service
           └─1813 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
配置镜像加速器(阿里云)
bash 复制代码
[root@docker ~]# sudo mkdir -p /etc/docker

[root@docker ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://spcqvmfn.mirror.aliyuncs.com"]
}
EOF

[root@docker ~]# sudo systemctl daemon-reload
[root@docker ~]# sudo systemctl restart docker

#检查镜像加速器配置
[root@docker ~]# docker info
Client: Docker Engine - Community
 Version:    26.1.3
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.14.0
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.27.0
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 26.1.3
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 8b3b7ca2e5ce38e8f31a34f35b2b68ceb8470d89
 runc version: v1.1.12-0-g51d5e94
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
 Kernel Version: 4.18.0-553.6.1.el8.x86_64
 Operating System: CentOS Stream 8
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 7.486GiB
 Name: docker
 ID: 96160847-9a97-40f4-997c-d12efaaef738
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  `https://spcqvmfn.mirror.aliyuncs.com/               <---看这
 Live Restore Enabled: false

配置镜像加速器(华为云)

同上(容器镜像服务SWR)

二、容器架构

1. 容器发展史

  • 1979 年:Unix V7 引入 Chroot Jail,最早容器化技术
  • 2000 年:FreeBSD Jail,增强文件隔离安全性
  • 2001 年:Linux VServer,实现操作系统级虚拟化
  • 2006 年:Google 推出 Process Containers,后演进为 cgroups
  • 2008 年:LXC 发布,首个 Linux 容器管理器
  • 2013 年:Docker 推出,基于 LXC 优化,后替换为 libcontainer
  • 2014 年:CoreOS 发布 rkt,Google 开源 LMCTFY

2. 容器 3W 核心理论

(1)What(什么是容器)
  • 轻量级、可移植、自包含的软件打包技术,包含应用程序及依赖,在 Host OS 用户空间运行,与其他进程隔离。
(2)Why(为什么需要容器)
  • 解决软件开发中的 "环境矩阵" 问题:多服务、多部署环境导致的环境不一致,容器通过标准化打包,实现跨环境无缝运行。
(3)How(容器如何工作)
  • 基于 Linux 内核技术(cgroup+namespace),实现资源限制与隔离,通过镜像快速启动运行。

3. 容器与虚拟机对比

特性 容器 虚拟机
启动速度 秒级 分钟级
性能 接近原生(共享宿主内核) 较弱(虚拟化层开销)
内存代价 极小(MB 级) 较大(GB 级)
硬盘使用 MB 级 GB 级
运行密度 单主机上千个 单主机几十个
隔离性 资源级隔离 系统级完全隔离
移植性 优秀(不依赖硬件) 一般(绑定虚拟化平台)

4. Docker 架构(C/S 架构)

(1)核心组件
  • Docker Client:用户交互入口(CLI/API),发送命令至 Daemon
  • Docker Daemon:核心服务,管理镜像、容器、网络、存储,监听 API 请求
  • 镜像(Image):只读模板,容器的构建基础
  • 容器(Container):镜像的可运行实例
  • Registry:镜像仓库(公有 / 私有)
  • 网络(Network):容器通信的网络环境
  • 数据卷(Volume):容器数据持久化存储
(2)组件协作流程
  1. Client 发送docker run命令

  2. Daemon 检查本地是否有目标镜像,无则从 Registry 下载

  3. Daemon 基于镜像创建容器并启动

  4. Daemon 将容器输出流式传输至 Client

三、镜像

1. 镜像核心概念

  • 定义:只读模板,包含应用及依赖,是创建容器的基础,采用分层文件系统(Copy-on-Write 机制)。
  • 分层结构:由基础镜像层(base 镜像)和叠加层组成,每层不可修改,修改仅发生在容器可写层,支持层共享。
  • base 镜像:不依赖其他镜像(从 scratch 构建),提供最小化 rootfs,共享宿主内核,如 Ubuntu、CentOS 镜像。

2. 镜像构建方式

(1)docker commit(不推荐)
  • 流程:运行容器→修改容器→docker commit生成新镜像
  • 缺点:可重复性差、无法审计,仅用于理解镜像构建原理
(2)Dockerfile(推荐)
指令 核心作用 示例代码
FROM 指定构建镜像的基础镜像(必需指令,需放在首行) FROM centos:8.4.2105
RUN 执行镜像构建阶段的命令(如安装软件、配置环境) RUN apt-get update && apt-get install -y vim
COPY/ADD 复制文件到镜像内(ADD 额外支持自动解压归档文件、下载网络文件) COPY index.html /var/www/html/
ENV 设置环境变量(可被后续指令引用,容器运行时也可读取) ENV JAVA_HOME /usr/local/java
EXPOSE 声明容器运行时暴露的端口(仅文档说明,不实际映射端口) EXPOSE 80 22
CMD 定义容器启动的默认命令(运行容器时可被命令行参数覆盖) CMD ["/usr/sbin/sshd", "-D"]
ENTRYPOINT 定义容器启动的固定核心命令(不可被覆盖,可接收 CMD 或运行参数作为参数) ENTRYPOINT ["/bin/echo", "Hello"]
WORKDIR 设置后续指令的工作目录(不存在则自动创建,推荐使用绝对路径) WORKDIR /usr/local
VOLUME 声明容器的数据卷(用于数据持久化,独立于容器生命周期) VOLUME /data
MAINTAINER 声明镜像的作者信息(已被 LABEL 替代,仅作兼容保留) MAINTAINER gaoqiaodong

补充说明(关键指令核心区别)

  1. COPY vs ADD :COPY 仅实现本地文件复制,更轻量、易维护,优先推荐;ADD 支持解压 .tar 归档文件、下载 http/https 网络文件,适合需自动解压的场景。
  2. CMD vs ENTRYPOINT:
    • CMD 是 "默认命令",运行容器时输入 docker run 镜像名 新命令 即可覆盖;
    • ENTRYPOINT 是 "固定命令",需通过 --entrypoint 参数才能修改,常与 CMD 配合(CMD 作为 ENTRYPOINT 的默认参数)。
  3. EXPOSE 注意点 :仅声明端口用途,实际对外暴露需在 docker run 时加 -p 参数(如 -p 8080:80)完成端口映射。
  • 构建命令docker build -t 镜像名:标签 -f Dockerfile路径 构建上下文路径
  • 缓存特性 :Docker 缓存已有镜像层,某层变化则上层缓存失效,可通过--no-cache禁用缓存

3. 镜像仓库与分发

(1)镜像命名规范
  • 格式:[仓库地址]/[命名空间]/[镜像名]:[标签](如swr.cn-east-3.myhuaweicloud.com/gaoqiaodong/centos_httpd:v1
  • Tag 最佳实践:使用版本号(1.9.1、1.9、1),避免依赖latest(仅默认标签,非最新稳定版)
(2)仓库类型
  • 公有仓库:Docker Hub(默认)、华为云 SWR、阿里云 ACR,支持镜像公开下载
  • 私有仓库:
    • 简易版:Docker Registry(docker run -d -p 5000:5000 registry:2
    • 企业级:Harbor(支持权限管理、镜像扫描、高可用,需 docker-compose 部署)
(3)镜像操作核心命令
命令 作用
docker images 查看本地镜像列表
docker pull 镜像名 从仓库下载镜像
docker push 镜像名 上传镜像到仓库
docker rmi 镜像名 删除本地镜像(需先删依赖容器)
docker tag 原镜像名 新镜像名 给镜像打标签
docker history 镜像名 查看镜像构建历史
docker save -o 文件名.tar 镜像名 导出镜像为 tar 文件
docker load -i 文件名.tar 从 tar 文件导入镜像

四、容器

1. 容器核心概念

  • 定义:镜像的可运行实例,类比 "沙箱",独立隔离运行,生命周期依赖启动命令,支持启动、停止、删除等操作。
  • 状态转换:创建(created)→启动(running)→暂停(paused)→停止(exited)→删除(removed)

2. 容器运行与进入方式

(1)运行容器
  • 核心命令:docker run [选项] 镜像名 [命令]
  • 关键选项:
    • -d:后台运行
    • -it:交互模式 + 打开终端
    • --name:指定容器名
    • -p 宿主机端口:容器端口:端口映射
    • -v 宿主机路径:容器路径:挂载数据卷
    • --restart=always:异常退出自动重启
(2)进入容器
方式 命令 特点
attach docker attach 容器ID 附着到容器启动命令终端,退出可能停止容器
exec docker exec -it 容器ID bash 启动新终端,不影响主进程,推荐使用

3. 容器常用操作命令

命令 作用
docker start/stop/restart 容器 ID 启动 / 停止 / 重启容器
docker kill 容器 ID 快速停止容器(发送 SIGKILL 信号)
docker pause/unpause 容器 ID 暂停 / 恢复容器
docker rm 容器 ID 删除容器(需先停止或加-f强制删除)
docker logs [-f] 容器 ID 查看容器日志(-f持续输出)
docker ps [-a] 查看运行中容器(-a显示所有状态)
docker stats 实时监控容器资源使用率
docker top 容器 ID 查看容器内进程

4. 容器资源限制(基于 cgroup)

(1)内存限制
  • 选项:-m 200M --memory-swap=300M(200M 物理内存 + 100M 交换空间)
  • 说明:--memory-swap-m的 2 倍(默认),设为-1则交换空间无限制
(2)CPU 限制
  • 选项:--cpu-shares 512(权重值,默认 1024,资源紧张时生效)
  • 说明:仅为资源分配权重,非固定 CPU 占比,空闲时可占用全部 CPU

5. 容器底层技术

(1)cgroup(资源限额)
  • 定义:Linux 内核功能,限制进程组的 CPU、内存、IO 等资源,Docker 通过 cgroup 实现容器资源控制。
  • 核心子系统:cpu(CPU 配额)、memory(内存限制)、blkio(块设备 IO 限制)等。
(2)namespace(资源隔离)
namespace 类型 隔离资源 作用
Mount 文件系统 容器拥有独立的文件系统目录
UTS 主机名 / 域名 容器有独立 hostname
IPC 共享内存 / 信号量 容器间 IPC 隔离
PID 进程 ID 容器有独立 PID 命名空间
Network 网络设备 / IP / 端口 容器有独立网络栈
User 用户 / 组 ID 容器内用户与宿主机隔离

6. 容器导出与导入

  • 导出(export)docker export -o 文件名.tar 容器ID,导出容器文件系统(丢失元数据)
  • 导入(import)docker import 文件名.tar 镜像名:标签,将 tar 文件导入为镜像
  • save/load区别:save/load保存镜像元数据,export/import仅保存文件系统

五、网络

1. Docker 原生网络类型

网络类型 特点 适用场景
none 仅 lo 网卡,无网络连接 无需联网的安全场景(如生成随机密码)
host 共享宿主机网络栈 对网络性能要求高,无需端口映射
bridge(默认) 基于 docker0 网桥,容器分配 172.17.0.0/16 网段 IP 单宿主机容器通信

2. 自定义网络

  • 创建命令docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 网络名
  • 优势:支持静态 IP 分配、DNS 解析(容器名通信)、网络隔离,比默认 bridge 更灵活

3. 容器通信方式

通信场景 实现方式 说明
容器间通信 IP 通信 同一网络内通过容器 IP 直接访问
容器间通信 Docker DNS Server user-defined 网络中,通过容器名通信(默认 bridge 不支持)
容器间通信 Joined 容器 --network=container:容器名,共享网络栈,127.0.0.1 通信
容器与外部通信 NAT 容器通过宿主机 NAT 转换访问外网
外部访问容器 端口映射 -p 宿主机端口:容器端口,docker-proxy 转发流量

4. 端口映射

  • 命令格式:docker run -d -p 宿主机端口:容器端口 镜像名
  • 原理:宿主机启动 docker-proxy 进程,监听宿主机端口,转发流量至容器对应端口

六、存储

1. Docker 存储资源类型

(1)storage driver
  • 定义:管理镜像层和容器层的驱动,实现分层文件系统与 Copy-on-Write 机制。

  • 主流驱动:overlay2(默认,CentOS Stream8 使用),其他如 AUFS、Device Mapper 等。

  • 适用场景:无状态应用,容器删除后数据不保留。

(2)Data Volume(数据持久化)
  • 定义:宿主机文件系统中的目录 / 文件,直接挂载到容器,数据独立于容器生命周期。

  • 两种类型:

    | 类型 | 定义 | 优势 | 适用场景 |

    | bind mount | 挂载宿主机已有目录 / 文件到容器 | 灵活,宿主机直接访问 | 开发环境代码共享、配置文件挂载 |

    | docker managed volume | Docker 自动在/var/lib/docker/volumes创建目录 | 可移植性强,无需指定宿主机路径 | 生产环境数据持久化(如数据库) |

2. 数据共享方式

  • 容器与宿主机共享 :bind mount 直接挂载宿主机目录;docker managed volume 通过宿主机/var/lib/docker/volumes目录访问。
  • 容器间共享:
    • 挂载同一数据卷
    • volume container(专门提供数据卷的容器,通过--volumes-from引用)
    • data-packed volume container(数据打包进镜像,通过 VOLUME 指令共享)

3. Data Volume 生命周期管理

  • 备份:备份宿主机挂载目录或 volume 目录
  • 恢复:将备份数据复制回挂载目录或 volume 目录
  • 迁移:容器迁移时,挂载原有数据卷
  • 销毁docker rm -v 容器ID(删除容器时删除关联 volume);docker volume rm 卷名(删除孤儿 volume)

七、容器监控

1. Docker 原生监控命令

命令 作用
docker ps 查看运行中容器
docker top 容器 ID 查看容器内进程
docker stats 实时监控容器 CPU、内存、IO 等资源使用率

2. 第三方监控工具

  • cAdvisor:Google 开源,收集容器指标,支持可视化展示和第三方工具集成。

    python 复制代码
    [root@docker ~]# docker run \
    --volume=/:/rootfs:ro \
    --volume=/var/run:/var/run:rw \
    --volume=/sys:/sys:ro \
    --volume=/var/lib/docker/:/var/lib/docker:ro \
    --publish=8080:8080 \
    --detach=true \
    --name=cadvisor \
    google/cadvisor:latest

八、容器日志

1. 日志核心价值

  • 为问题排查、事件追溯提供依据,容器动态生命周期下需确保日志持久化。

2. Docker 日志工具

  • docker logs :原生日志命令,支持-f(持续输出)、--tail(查看末尾日志)等选项。
  • logspout:第三方工具,收集多个容器日志并转发至其他工具(如 ELK)处理。

九、Docker-compose

1. 核心概念

  • 定义 :多容器应用编排工具,通过docker-compose.yml配置文件定义服务、网络、数据卷,支持批量生命周期管理。
  • 核心术语:
    • 服务(service):一个应用的容器实例(可多个)
    • 项目(project):一组关联的应用容器组成的业务单元

2. 核心命令

命令 作用
docker compose up -d 构建并启动服务(后台运行)
docker compose down 停止并删除容器、网络(保留数据卷)
docker compose ps 查看服务状态
docker compose logs -f 服务名 查看服务日志
docker compose build 构建服务镜像
docker compose restart 重启服务

3. docker-compose.yml模板文件

  • 核心结构:版本声明(version)、服务配置(services)、网络配置(networks)、数据卷配置(volumes)
  • 示例(WordPress 部署):
yaml 复制代码
services:
  blog:
    image: wordpress:latest
    restart: always
    ports:
      - "80:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: huawei
      WORDPRESS_DB_NAME: wordpress
  db:
    image: mysql:latest
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=huawei
      - MYSQL_DATABASE=wordpress

十、Docker 图形界面管理

1. DockerUI

  • 特点:轻量级,支持容器、镜像、网络、数据卷可视化管理。
  • 安装命令:docker run -d --name docker.ui --restart always -v /var/run/docker.sock:/var/run/docker.sock -p 8999:8999 joinsunsoft/docker.ui
  • 默认账号密码:ginghan/123456

2. Portainer

  • 特点:功能强大,支持集群管理、镜像扫描,社区版免费,企业级适用。

  • 安装命令:

    bash 复制代码
    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:latest
  • 访问方式:https://[宿主机IP]:9443(首次访问创建管理员账号)

十一、综合实验核心理论

1. WordPress 部署

  • 核心原理:通过 Docker-compose 整合 WordPress 和 MySQL 镜像,实现数据持久化(数据卷挂载)、端口映射、环境变量配置。

2. Ghost 部署

  • 核心原理:Ghost 镜像 + 数据卷挂载(/data/ghost:/var/lib/ghost/content),配置环境变量(NODE_ENVurl),实现博客系统持久化运行。

Docker Swarm

一、核心概念

1. 集群化(Clustering)

  • 由网络互联的服务器组成,协同工作且像单个系统运行,提供高可用、负载均衡和并行处理能力。
  • 优势:提升资源利用率,适配应用资源需求波动,具备业务弹性,无需手动迁移故障应用。

2. Docker Swarm Mode

  • 自 Docker v1.12 起集成于 Docker Engine,无需额外安装软件或外部数据库(如 Consul、etcd),内置服务发现功能。
  • 对比 Kubernetes,创建集群更简单,适合作为容器编排引擎学习起点。
  • 支持同一 Docker 主机同时运行 swarm service 和独立容器。

3. 关键组件

  • swarm:运行 Docker Engine 的多个主机组成的集群,启动 swarm mode 后开启集群管理和编排功能。
  • node:swarm 中的每个 Docker Engine,分两类:
    • manager node:执行编排和集群管理,维护集群期望状态,多节点时自动选举 leader;默认同时为 worker node,可配置为 manager-only node。
    • worker node:接收并执行 manager 派发的任务,定期上报自身及任务状态。
  • service:定义 worker node 需执行的任务,swarm 核心编排目标是保证 service 处于期望状态(如指定副本数)。

二、Swarm 集群部署(三节点示例)

1. 环境准备

  • 节点配置:swarm-manager(192.168.108.30,manager node)、swarm-worker1(192.168.108.31,worker node)、swarm-worker2(192.168.108.32,worker node)。
  • 基础要求:所有节点 Docker 版本 ≥ v1.12,操作系统为 CentOS Stream 8 或其他 Linux 系统,防火墙 zone 设为 trusted(firewall-cmd --set-default-zone=trusted)。

2. 集群创建步骤

  1. 初始化 swarm(在 manager node 执行):

    bash 复制代码
    docker swarm init --advertise-addr 192.168.108.30

    输出包含添加 worker 和 manager 节点的命令,当前节点成为 manager node。

  2. 添加 worker node:在 worker1 和 worker2 执行初始化输出的 join 命令:

    bash 复制代码
    docker swarm join --token SWMTKN-1-xxx 192.168.108.30:2377
  3. 查看节点状态(manager node 执行):

    bash 复制代码
    docker node ls
  4. 找回 join 命令(若未记录,manager node 执行):

    bash 复制代码
    docker swarm join-token worker  # 查看添加 worker 的命令

三、Service 操作

1. 部署 Service

  • 命令格式(类似docker run):

docker service create --name web_server httpd

  • 查看 Service 列表:docker service ls(显示副本数、镜像等信息)。

  • 查看副本状态:docker service ps web_server(显示副本所在节点、运行状态等)。

2. Service 伸缩(Scale Up/Down)

  • 扩展副本数:docker service scale web_server=5(将 web_server 副本数调整为 5)。
  • 缩减副本数:docker service scale web_server=3(将副本数调整为 3)。
  • 排除 manager 运行 Service:docker node update --availability drain swarm-manager,原 manager 上的副本会被关闭并在 worker 节点重建。

3. 故障切换(Failover)

  • 核心特性:swarm 自动维护 Service 期望状态,节点故障时自动迁移副本。
  • 示例:关闭 swarm-worker1(shutdown now),swarm 检测到节点 Down 后,将该节点上的副本调度到其他可用节点(如 worker2),故障节点上的副本标记为 Shutdown。

4. Service 访问

(1)容器内部访问
  • 未暴露端口时,仅能通过容器 IP 访问(需通过 docker inspect 容器名 查看容器 IP),仅支持 Docker 主机内部访问。
(2)外部网络访问
  1. 发布端口(两种方式):
    • 新建 Service 时发布:docker service create --name web_server --publish 8080:80 --replicas=2 httpd(将容器 80 端口映射到主机 8080 端口)。
    • 已存在 Service 追加发布:docker service update --publish-add 8080:80 web_server
  2. 访问方式:curl 集群任意节点的 8080 端口(如 curl http://192.168.108.30:8080),均能访问到 Service。

5. Routing Mesh 与网络

  • routing mesh 功能:swarm 内置负载均衡,外部请求访问集群任意节点的发布端口时,自动转发到 Service 的任意副本(即使该节点无此副本)。
  • 核心网络:
    • ingress 网络:swarm 自动创建的 overlay 网络,实现不同主机容器间通信,支撑 routing mesh。
    • docker_gwbridge:实现容器访问外网。
  • 外部负载均衡配置:可搭配 HAProxy,将请求分发到集群各节点的 8080 端口,提升可用性。

6. Service 删除

时,仅能通过容器 IP 访问(需通过 docker inspect 容器名 查看容器 IP),仅支持 Docker 主机内部访问。

(2)外部网络访问
  1. 发布端口(两种方式):
    • 新建 Service 时发布:docker service create --name web_server --publish 8080:80 --replicas=2 httpd(将容器 80 端口映射到主机 8080 端口)。
    • 已存在 Service 追加发布:docker service update --publish-add 8080:80 web_server
  2. 访问方式:curl 集群任意节点的 8080 端口(如 curl http://192.168.108.30:8080),均能访问到 Service。

5. Routing Mesh 与网络

  • routing mesh 功能:swarm 内置负载均衡,外部请求访问集群任意节点的发布端口时,自动转发到 Service 的任意副本(即使该节点无此副本)。
  • 核心网络:
    • ingress 网络:swarm 自动创建的 overlay 网络,实现不同主机容器间通信,支撑 routing mesh。
    • docker_gwbridge:实现容器访问外网。
  • 外部负载均衡配置:可搭配 HAProxy,将请求分发到集群各节点的 8080 端口,提升可用性。

6. Service 删除

  • 命令:docker service rm web_server,删除 Service 同时删除其所有副本容器。
相关推荐
小徐不会敲代码~2 小时前
Vue3 学习 5
前端·学习·vue
秋深枫叶红2 小时前
嵌入式第四十篇——网络编程
linux·网络·学习
m0_555762902 小时前
linux开发——网络配置(含VM网络配置)
linux·运维·网络
QT 小鲜肉2 小时前
【Linux命令大全】001.文件管理之mdir命令(实操篇)
linux·运维·服务器·chrome·笔记
三块可乐两块冰2 小时前
【第二十五周】机器学习笔记二十四
人工智能·笔记·机器学习
摇滚侠2 小时前
镜像容器相关命令,docker export/import/save/load/commit,导出容器给别人使用
运维·docker·容器
摇滚侠2 小时前
Java 零基础全套视频教程,日期时间 API,笔记147-148
java·开发语言·笔记
无所事事的程序员2 小时前
2025年终总结
学习