文章目录
- Docker
-
- 一、容器生态系统
-
- [1. 容器技术基础](#1. 容器技术基础)
- [2. 容器生态系统三层架构](#2. 容器生态系统三层架构)
- [3. Docker 安装](#3. Docker 安装)
- 二、容器架构
-
- [1. 容器发展史](#1. 容器发展史)
- [2. 容器 3W 核心理论](#2. 容器 3W 核心理论)
- [3. 容器与虚拟机对比](#3. 容器与虚拟机对比)
- [4. Docker 架构(C/S 架构)](#4. Docker 架构(C/S 架构))
- 三、镜像
-
- [1. 镜像核心概念](#1. 镜像核心概念)
- [2. 镜像构建方式](#2. 镜像构建方式)
-
- [(1)docker commit(不推荐)](#(1)docker commit(不推荐))
- (2)Dockerfile(推荐)
- 补充说明(关键指令核心区别)
- [3. 镜像仓库与分发](#3. 镜像仓库与分发)
- 四、容器
-
- [1. 容器核心概念](#1. 容器核心概念)
- [2. 容器运行与进入方式](#2. 容器运行与进入方式)
- [3. 容器常用操作命令](#3. 容器常用操作命令)
- [4. 容器资源限制(基于 cgroup)](#4. 容器资源限制(基于 cgroup))
-
- (1)内存限制
- [(2)CPU 限制](#(2)CPU 限制)
- [5. 容器底层技术](#5. 容器底层技术)
- [6. 容器导出与导入](#6. 容器导出与导入)
- 五、网络
-
- [1. Docker 原生网络类型](#1. Docker 原生网络类型)
- [2. 自定义网络](#2. 自定义网络)
- [3. 容器通信方式](#3. 容器通信方式)
- [4. 端口映射](#4. 端口映射)
- 六、存储
-
- [1. Docker 存储资源类型](#1. Docker 存储资源类型)
-
- [(1)storage driver](#(1)storage driver)
- [(2)Data Volume(数据持久化)](#(2)Data Volume(数据持久化))
- [2. 数据共享方式](#2. 数据共享方式)
- [3. Data Volume 生命周期管理](#3. Data Volume 生命周期管理)
- 七、容器监控
-
- [1. Docker 原生监控命令](#1. Docker 原生监控命令)
- [2. 第三方监控工具](#2. 第三方监控工具)
- 八、容器日志
-
- [1. 日志核心价值](#1. 日志核心价值)
- [2. Docker 日志工具](#2. Docker 日志工具)
- 九、Docker-compose
-
- [1. 核心概念](#1. 核心概念)
- [2. 核心命令](#2. 核心命令)
- [3. docker-compose.yml模板文件](#3. docker-compose.yml模板文件)
- [十、Docker 图形界面管理](#十、Docker 图形界面管理)
-
- [1. DockerUI](#1. DockerUI)
- [2. Portainer](#2. Portainer)
- 十一、综合实验核心理论
-
- [1. WordPress 部署](#1. WordPress 部署)
- [2. Ghost 部署](#2. Ghost 部署)
- [Docker Swarm](#Docker Swarm)
-
- 一、核心概念
-
- [1. 集群化(Clustering)](#1. 集群化(Clustering))
- [2. Docker Swarm Mode](#2. Docker Swarm Mode)
- [3. 关键组件](#3. 关键组件)
- [二、Swarm 集群部署(三节点示例)](#二、Swarm 集群部署(三节点示例))
-
- [1. 环境准备](#1. 环境准备)
- [2. 集群创建步骤](#2. 集群创建步骤)
- [三、Service 操作](#三、Service 操作)
-
- [1. 部署 Service](#1. 部署 Service)
- [2. Service 伸缩(Scale Up/Down)](#2. Service 伸缩(Scale Up/Down))
- [3. 故障切换(Failover)](#3. 故障切换(Failover))
- [4. Service 访问](#4. Service 访问)
- [5. Routing Mesh 与网络](#5. Routing Mesh 与网络)
- [6. Service 删除](#6. Service 删除)
- [5. Routing Mesh 与网络](#5. Routing Mesh 与网络)
- [6. Service 删除](#6. Service 删除)
Docker
一、容器生态系统
1. 容器技术基础
- 定义:容器技术是继大数据、云计算后热门技术,通过 "集装箱" 思想将应用及依赖打包为轻量级、可移植、自包含的运行单元,实现 "Build Once, Run Anywhere",解决环境一致性问题。
- 核心价值:降低部署复杂度、提升资源利用率、支持快速扩缩容与跨环境迁移,是 IT 从业者提升自我价值的关键技能。
2. 容器生态系统三层架构
(1)核心技术(容器运行基础)
| 技术类型 | 核心组件 | 作用与说明 |
|---|---|---|
| 容器规范 | OCI(Open Container Initiative) | 制定 runtime spec 和 image 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)组件协作流程
-
Client 发送
docker run命令 -
Daemon 检查本地是否有目标镜像,无则从 Registry 下载
-
Daemon 基于镜像创建容器并启动
-
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 |
补充说明(关键指令核心区别)
- COPY vs ADD :COPY 仅实现本地文件复制,更轻量、易维护,优先推荐;ADD 支持解压
.tar归档文件、下载http/https网络文件,适合需自动解压的场景。 - CMD vs ENTRYPOINT:
- CMD 是 "默认命令",运行容器时输入
docker run 镜像名 新命令即可覆盖; - ENTRYPOINT 是 "固定命令",需通过
--entrypoint参数才能修改,常与 CMD 配合(CMD 作为 ENTRYPOINT 的默认参数)。
- CMD 是 "默认命令",运行容器时输入
- 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 部署)
- 简易版:Docker Registry(
(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
-
特点:功能强大,支持集群管理、镜像扫描,社区版免费,企业级适用。
-
安装命令:
bashdocker 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_ENV、url),实现博客系统持久化运行。
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. 集群创建步骤
-
初始化 swarm(在 manager node 执行):
bashdocker swarm init --advertise-addr 192.168.108.30输出包含添加 worker 和 manager 节点的命令,当前节点成为 manager node。
-
添加 worker node:在 worker1 和 worker2 执行初始化输出的 join 命令:
bashdocker swarm join --token SWMTKN-1-xxx 192.168.108.30:2377 -
查看节点状态(manager node 执行):
bashdocker node ls -
找回 join 命令(若未记录,manager node 执行):
bashdocker 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)外部网络访问
- 发布端口(两种方式):
- 新建 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。
- 新建 Service 时发布:
- 访问方式: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)外部网络访问
- 发布端口(两种方式):
- 新建 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。
- 新建 Service 时发布:
- 访问方式: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 同时删除其所有副本容器。