[2.1 创建容器但不启动](#2.1 创建容器但不启动)
[2.2 启动容器](#2.2 启动容器)
[2.3 创建并运行容器](#2.3 创建并运行容器)
[2.4 查看容器状态](#2.4 查看容器状态)
[2.5 停止与重启容器](#2.5 停止与重启容器)
[2.6 删除容器](#2.6 删除容器)
[3.1 进入容器交互模式](#3.1 进入容器交互模式)
[3.2 查看容器日志](#3.2 查看容器日志)
[3.3 容器内部执行命令](#3.3 容器内部执行命令)
[3.4 暂停与恢复容器](#3.4 暂停与恢复容器)
[4.1 查看容器详细信息](#4.1 查看容器详细信息)
[4.2 实时监控容器资源](#4.2 实时监控容器资源)
[4.3 查看容器内运行的进程](#4.3 查看容器内运行的进程)
[4.4 容器文件系统变化追踪](#4.4 容器文件系统变化追踪)
[5.1 导出容器](#5.1 导出容器)
[5.2 导入容器](#5.2 导入容器)
[5.3 区别说明](#5.3 区别说明)
[6.1 开机自启配置](#6.1 开机自启配置)
[6.2 查看重启策略](#6.2 查看重启策略)
[6.3 批量启动所有容器](#6.3 批量启动所有容器)
[7.1 提交容器为新镜像](#7.1 提交容器为新镜像)
[7.2 快照后重新运行](#7.2 快照后重新运行)
[7.3 实战示例](#7.3 实战示例)
前言
在前一章中,我们学习了 Docker 的安装与基础命令,成功运行了第一个容器。 但在生产环境中,我们需要对容器进行更精细的控制,比如:
-
如何批量创建或删除容器?
-
如何让容器开机自启?
-
如何查看容器日志与状态?
-
如何导出容器、迁移容器或创建快照?
本篇将深入剖析 容器生命周期与管理策略,并提供实战命令演练。
一、容器生命周期概述
Docker 容器的生命周期一般分为以下阶段:
创建(create) → 启动(start) → 运行中(running)
↓ ↓
停止(stop) ← 暂停(pause)
↓
删除(rm)
💡 理解关键: Docker 容器本质上是运行在宿主机上的一个进程(PID),因此容器的生命周期与进程生命周期紧密相关。
二、容器创建与启动
2.1 创建容器但不启动
docker create --name webtest nginx
创建容器后不会立即运行,可用
docker start
启动。
2.2 启动容器
docker start webtest
💡 若容器已经存在,可直接启动;否则需使用
docker run
新建。
2.3 创建并运行容器
docker run -d --name web1 -p 8080:80 nginx
参数说明:
参数 | 含义 |
---|---|
-d |
后台运行 |
--name |
指定容器名称 |
-p |
端口映射 |
nginx |
镜像名称 |
2.4 查看容器状态
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器(含已停止)
2.5 停止与重启容器
docker stop web1
docker restart web1
2.6 删除容器
docker rm web1
强制删除正在运行的容器:
docker rm -f web1
⚠️ 注意: 删除操作不可逆,删除后容器中的数据将丢失(除非挂载数据卷)。
三、容器交互与控制
3.1 进入容器交互模式
docker exec -it web1 /bin/bash
与
docker attach
不同,exec
不会干扰主进程。
3.2 查看容器日志
docker logs -f web1
参数说明:
参数 | 说明 |
---|---|
-f |
实时查看日志输出 |
--tail 100 |
仅查看最后 100 行 |
-t |
显示时间戳 |
示例:
docker logs -t --tail 50 web1
3.3 容器内部执行命令
在不进入容器的情况下执行命令:
docker exec web1 cat /etc/os-release
3.4 暂停与恢复容器
暂停容器(冻结进程):
docker pause web1
恢复容器:
docker unpause web1
✅ 实用场景: 暂时冻结容器以减少 CPU 消耗,适用于维护或测试。
四、容器信息查看与监控
4.1 查看容器详细信息
docker inspect web1
输出包含容器 ID、IP、挂载卷、环境变量等完整元数据。
快速查看容器 IP 地址:
docker inspect -f '{{.NetworkSettings.IPAddress}}' web1
4.2 实时监控容器资源
docker stats
输出:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT NET I/O BLOCK I/O PIDS
2a7f... web1 0.34% 64MiB / 2GiB 5MB / 4MB 0B / 0B 10
💡 相当于容器版
top
命令。
4.3 查看容器内运行的进程
docker top web1
显示容器中所有正在运行的进程。
4.4 容器文件系统变化追踪
docker diff web1
显示容器文件系统相对镜像的修改内容。
输出示例:
C /etc/nginx/nginx.conf
A /var/www/html/index.html
五、容器导出、导入与迁移
5.1 导出容器
docker export web1 > web1.tar
导出容器的文件系统(不包含元信息和层结构)。
5.2 导入容器
cat web1.tar | docker import - web1:v1
将导出的容器打包为新的镜像。
5.3 区别说明
命令 | 导出对象 | 是否包含镜像历史层 | 适用场景 |
---|---|---|---|
docker save |
镜像 | ✅ 是 | 迁移镜像 |
docker export |
容器 | ❌ 否 | 迁移容器文件系统 |
六、容器自动启动与自恢复
6.1 开机自启配置
在运行容器时添加:
docker run -d --restart=always --name redis redis:latest
可选参数说明:
参数 | 说明 |
---|---|
no |
默认,不自动重启 |
on-failure |
非 0 退出码时重启 |
always |
无论如何都重启 |
unless-stopped |
手动停止后不重启 |
6.2 查看重启策略
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' redis
6.3 批量启动所有容器
docker start $(docker ps -aq)
批量停止所有容器:
docker stop $(docker ps -aq)
七、容器快照与备份
7.1 提交容器为新镜像
docker commit web1 web1:v2
💡 作用: 将当前容器的修改保存成新的镜像版本。
7.2 快照后重新运行
docker run -d -p 8081:80 web1:v2
这样你就创建了一个基于修改后状态的新容器。
7.3 实战示例
1️⃣ 进入容器修改网页文件:
docker exec -it web1 bash
echo "Hello Docker v2" > /usr/share/nginx/html/index.html
exit
2️⃣ 提交修改:
docker commit web1 nginx:v2
3️⃣ 创建新容器验证:
docker run -d -p 8081:80 nginx:v2
访问 http://宿主机:8081
即可看到更新后的页面。
八、容器批量管理技巧
操作 | 命令 | 说明 |
---|---|---|
停止全部容器 | docker stop $(docker ps -aq) |
批量停止 |
删除全部容器 | docker rm $(docker ps -aq) |
批量删除 |
删除全部镜像 | docker rmi $(docker images -q) |
清空镜像 |
清理未使用资源 | docker system prune -a |
清理系统缓存 |
⚠️ 谨慎使用!
prune -a
会清除未被使用的镜像、容器、网络与缓存。
九、容器故障排查命令
命令 | 用途 |
---|---|
docker logs <容器名> |
查看日志 |
docker inspect <容器名> |
查看容器元数据 |
docker events |
查看 Docker 实时事件 |
docker ps -a |
查看容器状态 |
docker stats |
查看性能监控信息 |
💡 建议: 故障排查时依次检查:日志 → 状态 → 资源占用 → 网络连接。
十、总结
通过本篇学习,你应掌握以下内容:
✅ 容器的完整生命周期管理流程
✅ 容器创建、停止、删除、导出导入命令
✅ 日志查看、资源监控与快照创建
✅ 自动重启策略与批量操作技巧
✅ 容器迁移与版本化实战