04. 容器管理
1. 容器概述
容器是镜像的运行实例,是 Docker 的核心操作对象。掌握容器的创建、运行、管理是使用 Docker 的核心技能。
┌─────────────────────────────────────────────────────────────┐ │ 容器管理全景 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 创建容器 │ │ ├── docker create # 创建不启动 │ │ └── docker run # 创建并启动 │ │ │ │ 生命周期管理 │ │ ├── docker start/stop/restart # 启停控制 │ │ ├── docker pause/unpause # 暂停恢复 │ │ ├── docker kill # 强制终止 │ │ └── docker rm # 删除容器 │ │ │ │ 监控与调试 │ │ ├── docker ps # 查看状态 │ │ ├── docker logs # 查看日志 │ │ ├── docker exec # 进入容器 │ │ ├── docker top # 查看进程 │ │ └── docker stats # 资源监控 │ │ │ └─────────────────────────────────────────────────────────────┘2. 创建与运行容器
2.1 Docker run 详解
# 基础运行dockerrun nginx# 后台运行(detached)dockerrun-dnginx# 交互式运行dockerrun-itubuntubash# 指定容器名称dockerrun-d--nameweb-server nginx# 端口映射dockerrun-d-p8080:80 nginx# 宿主机:容器dockerrun-d-p8080-8082:80 nginx# 端口范围dockerrun-d-p80:80/tcp nginx# 指定协议dockerrun-d-Pnginx# 随机端口# 环境变量dockerrun-d-eMYSQL_ROOT_PASSWORD=123mysqldockerrun-d--env-file .env nginx# 从文件加载# 卷挂载dockerrun-d-v/host/data:/container/data nginxdockerrun-d--mounttype=bind,source=/host,target=/container nginx# 资源限制dockerrun-d--cpus=0.5--memory=512m nginxdockerrun-d--memory-swap=1g nginx# 网络配置dockerrun-d--networkhostnginxdockerrun-d--networkbridge nginxdockerrun-d--networknone nginx# 重启策略dockerrun-d--restart=always nginx# 总是重启dockerrun-d--restart=unless-stopped nginx# 除非手动停止dockerrun-d--restart=on-failure:3 nginx# 失败时重启3次# 完整示例dockerrun-d\--namemyapp\-p8080:8080\-eAPP_ENV=production\-v/app/logs:/var/log/app\--restart=always\--cpus=1\--memory=1g\myapp:latest2.2 容器创建(不启动)
# 创建容器但不启动dockercreate--namemynginx nginx# 创建时指定配置dockercreate\--namemyapp\-p8080:8080\-eENV=prod\myapp:latest# 查看创建的容器dockerps-a|grepmynginx# 启动已创建的容器dockerstart mynginx3. 容器生命周期管理
3.1 启停控制
# 启动容器dockerstart mynginx# 停止容器(优雅关闭,发送 SIGTERM)dockerstop mynginxdockerstop-t30mynginx# 30秒后强制关闭# 重启容器dockerrestart mynginxdockerrestart-t10mynginx# 暂停容器(冻结进程)dockerpause mynginx# 恢复容器dockerunpause mynginx# 强制终止(发送 SIGKILL)dockerkillmynginxdockerkill-sHUP mynginx# 发送指定信号# 等待容器停止dockerwaitmynginx# 容器退出码# 0: 正常退出# 1: 应用错误# 137: 被强制终止(OOM 或 kill)# 255: 退出状态未知3.2 删除容器
# 删除已停止的容器dockerrmmynginx# 强制删除运行中的容器dockerrm-fmynginx# 删除多个容器dockerrmcontainer1 container2 container3# 删除所有停止的容器dockercontainer prunedockerrm$(dockerps-a-q)# 删除所有容器# 删除所有容器(包括运行中的)dockerrm-f$(dockerps-a-q)# 退出时自动删除dockerrun--rm-itubuntubash# 删除并清理卷dockerrm-vmynginx4. 容器查看与监控
4.1 查看容器列表
# 查看运行中的容器dockerps# 查看所有容器dockerps-adockercontainerls-a# 查看最后创建的容器dockerps-l# 查看容器 ID(只显示 ID)dockerps-qdockerps-aq# 查看更多信息dockerps-a--format"table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Image}}"dockerps--format"{{.Names}} is {{.Status}}"# 按条件过滤dockerps--filter"status=exited"dockerps--filter"name=mynginx"dockerps--filter"ancestor=nginx"dockerps--filter"label=version=1.0"# 查看容器大小dockerps-sdockerps-a-s# 查看容器网络信息dockerps--format"table {{.Names}}\t{{.Ports}}"4.2 资源监控
# 查看容器资源使用dockerstatsdockerstats --no-stream# 只显示当前dockerstats mynginx# 指定容器dockerstats--format"table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"# 查看容器进程dockertopmynginxdockertopmynginx aux# 带完整参数# 查看容器详细信息dockerinspect mynginxdockerinspect--format='{{.State.Status}}'mynginxdockerinspect--format='{{.NetworkSettings.IPAddress}}'mynginx# 查看容器日志dockerlogs mynginxdockerlogs-fmynginx# 实时跟踪dockerlogs--tail100mynginxdockerlogs--since2024-01-01 mynginxdockerlogs--until2024-01-02 mynginxdockerlogs--timestampsmynginx5. 容器交互
5.1 进入容器
# 使用 exec(推荐)dockerexec-itmynginxbashdockerexec-itmynginxshdockerexec-itmynginx /bin/sh# 以特定用户进入dockerexec-it--userroot mynginxbash# 设置工作目录dockerexec-it--workdir/app mynginxbash# 设置环境变量dockerexec-it-eMY_VAR=value mynginxbash# 在容器中执行命令dockerexecmynginxls-ladockerexecmynginxcat/etc/nginx/nginx.conf# 使用 attach(附加到主进程)dockerattach mynginx# 注意:attach 会直接连接到容器主进程,Ctrl+C 会停止容器5.2 文件传输
# 从宿主机复制到容器dockercpfile.txt mynginx:/tmp/dockercp/host/path mynginx:/container/path# 从容器复制到宿主机dockercpmynginx:/etc/nginx/nginx.conf ./dockercpmynginx:/var/log/nginx/access.log ./# 复制目录dockercp./local_dir mynginx:/app/# 复制时保持权限dockercp-amynginx:/app ./backup/6. 容器网络配置
6.1 端口映射
# 查看端口映射dockerport mynginxdockerport mynginx80# 映射到指定端口dockerrun-d-p8080:80 nginx# 映射到随机端口dockerrun-d-Pnginx# 映射到指定 IPdockerrun-d-p127.0.0.1:8080:80 nginx# 映射 UDP 端口dockerrun-d-p53:53/udp nginx# 多个端口映射dockerrun-d-p8080:80-p8443:443 nginx6.2 网络模式
# 查看容器网络dockerinspect mynginx|grep-A10Networks# 连接网络dockernetwork connect mynetwork mynginx# 断开网络dockernetwork disconnect mynetwork mynginx# 创建时指定网络dockerrun-d--networkmynetwork--namemynginx nginx7. 容器资源限制
7.1 CPU 限制
# 限制 CPU 核心数dockerrun-d--cpus=0.5nginxdockerrun-d--cpus=2nginx# CPU 份额(相对权重)dockerrun-d--cpu-shares=1024nginx# 指定 CPU 核心dockerrun-d--cpuset-cpus=0,1nginxdockerrun-d--cpuset-cpus=0-3 nginx# CPU 周期限制dockerrun-d--cpu-period=100000--cpu-quota=50000nginx7.2 内存限制
# 内存限制dockerrun-d--memory=512m nginxdockerrun-d--memory=1g nginx# 内存 + Swap 限制dockerrun-d--memory=512m --memory-swap=1g nginx# 预留内存(软限制)dockerrun-d--memory-reservation=256m nginx# 禁用 OOM Killerdockerrun-d--memory=512m --oom-kill-disable nginx7.3 IO 限制
# IO 权重(相对)dockerrun-d--blkio-weight=500nginx# IO 读写速率限制dockerrun-d--device-read-bps=/dev/sda:10mb nginxdockerrun-d--device-write-bps=/dev/sda:10mb nginx# IO IOPS 限制dockerrun-d--device-read-iops=/dev/sda:1000 nginxdockerrun-d--device-write-iops=/dev/sda:1000 nginx8. 实战示例
8.1 完整容器生命周期
# 1. 创建并运行容器dockerrun-d--nameweb-p80:80 nginx# 2. 查看容器状态dockerps# 3. 查看日志dockerlogs-fweb&# 4. 进入容器修改dockerexec-itwebbashecho"<h1>Hello Docker</h1>">/usr/share/nginx/html/index.htmlexit# 5. 测试访问curlhttp://localhost# 6. 查看资源使用dockerstats web --no-stream# 7. 停止容器dockerstop web# 8. 查看状态dockerps-a|grepweb# 9. 启动容器dockerstart web# 10. 清理dockerstop webdockerrmweb8.2 多容器管理
# 启动多个 Web 容器dockerrun-d--nameweb1-p8081:80 nginxdockerrun-d--nameweb2-p8082:80 nginxdockerrun-d--nameweb3-p8083:80 nginx# 批量操作# 批量停止dockerstop web1 web2 web3# 批量删除dockerrmweb1 web2 web3# 查找并清理dockerrm-f$(dockerps-a|grepweb|awk'{print $1}')8.3 调试容器
# 容器无法启动时查看日志dockerlogs--tail50faulty-container# 检查容器配置dockerinspect faulty-container# 进入停止的容器(需要启动)dockerstart faulty-containerdockerexec-itfaulty-containerbash# 导出容器文件系统用于分析dockerexportfaulty-container>container.tarmkdirdebug&&tar-xfcontainer.tar-Cdebug# 复制日志文件到宿主机dockercpfaulty-container:/var/log/app.log ./9. 常用命令速查
| 操作 | 命令 |
|---|---|
| 运行容器 | docker run |
| 列表查看 | docker ps |
| 停止容器 | docker stop |
| 启动容器 | docker start |
| 重启容器 | docker restart |
| 暂停容器 | docker pause |
| 恢复容器 | docker unpause |
| 强制停止 | docker kill |
| 删除容器 | docker rm |
| 进入容器 | docker exec |
| 查看日志 | docker logs |
| 资源监控 | docker stats |
| 查看进程 | docker top |
| 查看详情 | docker inspect |
| 文件拷贝 | docker cp |
| 端口查看 | docker port |
10. 常见问题
Q1: 容器退出后如何重新进入?
# 启动已停止的容器dockerstart container_name# 进入容器dockerexec-itcontainer_namebashQ2: 如何查看容器退出原因?
dockerinspect--format='{{.State.ExitCode}}'container_namedockerlogs container_nameQ3: 容器日志太大怎么办?
# 限制日志大小dockerrun-d--log-opt max-size=10m --log-opt max-file=3nginx# 清空日志truncate-s0$(dockerinspect--format='{{.LogPath}}'container_name)11. 小结
- 掌握容器的创建、运行、停止、删除
- 学会使用 docker run 的各种参数
- 熟练使用 exec 进入容器调试
- 监控容器资源和日志
- 合理配置资源限制
- 注意清理无用容器释放资源