彻底搞懂容器启动、停止、调试的每一个细节!

开篇导读

许多刚接触 Docker 的开发者都有一个误区:

"镜像构建完就万事大吉,run 一下就部署成功了。"

实际上,在生产环境中,我们面对的是:

  • 容器突然崩了?
  • 容器内怎么调试?
  • 怎么优雅重启?
  • 怎么持久化数据、防止配置丢失?

本讲就是为了解决这些现实问题而来!

我们将从容器的生命周期出发,结合常用命令、实战技巧,带你完整掌握 Docker 容器的管理与调试方式。


一、容器生命周期全景图

Docker 容器的典型生命周期如下:

bash 复制代码
CREATE → START → RUNNING → STOP → EXIT → REMOVE

关键命令一览

命令 作用
docker create 创建容器但不运行
docker start 启动已创建容器
docker run 创建并启动容器(最常用)
docker stop 优雅停止容器
docker kill 强制终止容器
docker rm 删除容器实例

二、容器创建与启动详解

✅ 推荐的标准运行格式

bash 复制代码
docker run -d --name my-nginx -p 8080:80 nginx

解释:

  • -d:后台运行
  • --name:自定义容器名
  • -p:端口映射

⏸️ 暂停与恢复容器

bash 复制代码
docker pause <container>
docker unpause <container>

这对于短暂停止计算资源的容器(例如跑批)很有帮助。


三、如何查看容器状态与日志?

状态查看

bash 复制代码
docker ps -a
  • STATUS 字段显示当前容器状态
  • 如 Exited (0) 5 minutes ago 表示已退出

日志查看

bash 复制代码
docker logs my-nginx
docker logs -f my-nginx  # 实时追踪

常见问题排查

  • 应用未启动 → logs 查看错误信息
  • 容器一闪而过 → 可能没有 CMD 或 ENTRYPOINT
  • 使用 docker inspect 查看详细元信息:
bash 复制代码
docker inspect my-nginx

四、进入容器内部调试

方法一:exec

bash 复制代码
docker exec -it my-nginx /bin/bash
  • -it 表示交互模式
  • 如果容器是基于 Alpine 的,可能只支持 /bin/sh

方法二:attach

bash 复制代码
docker attach my-nginx

⚠️ 注意:attach 会直接接管容器主进程,退出可能会终止容器。建议用 exec。


️ 五、数据与配置持久化管理

Docker 容器默认是无状态的,重启就可能丢失数据。

✅ 挂载数据卷(volume)

bash 复制代码
docker run -d -v /my/local/dir:/app/data my-image
  • 左边是宿主机路径,右边是容器内部路径
  • 推荐使用命名卷:
bash 复制代码
docker volume create mydata
docker run -v mydata:/app/data my-image

✅ 挂载配置文件

bash 复制代码
docker run -v $(pwd)/config/nginx.conf:/etc/nginx/nginx.conf nginx

这在测试不同配置时非常高效!


六、容器自动清理与资源管理

清理退出的容器

bash 复制代码
docker container prune

限制资源(CPU/内存)

bash 复制代码
docker run -m 512m --cpus="1.0" my-image

这对于防止容器抢占资源至关重要,尤其是在多租户场景下。


七、常用容器管理命令表

操作 命令
创建并运行容器 docker run
列出容器 docker ps -a
启动/停止容器 docker start/stop
删除容器 docker rm
查看日志 docker logs
进入容器 docker exec -it
查看元数据 docker inspect
清理垃圾 docker system prune

八、总结

  • 容器的生命周期管理和调试技巧,是开发者迈入容器化的第一道大门。
  • 掌握容器的运行状态、进入调试、日志查看、数据挂载,是提升 DevOps 水平的基础。
  • 推荐大家多多练习 exec、logs、volume 的使用,打牢容器操作的根基。
相关推荐
IT_陈寒34 分钟前
Redis持久化这个坑,我爬了一整天才出来
前端·人工智能·后端
无风听海34 分钟前
多租户系统中的 OIDC:Discovery 端点与联合登录的深度实践
后端·python·flask
鹤落晴春1 小时前
【K8s】Pod调度、configMaps
云原生·容器·kubernetes
小小前端仔LC1 小时前
Node.js + LangChain + React:搭建个人知识库(六)- “吃什么”项目实战:从700+菜谱入库到Taro H5端JSON渲染
前端·后端
程序员黑豆2 小时前
AI全栈开发之Java:怎么配置Java环境变量
前端·后端·ai编程
苍何2 小时前
一手实测 Claude Fable 5,手搓了个 Obsidian 的 Codex 插件
后端
极客先躯2 小时前
高级java每日一道面试题-2026年02月02日-实战篇[Docker]-如何实现容器的持久化存储?
docker·容器·面试宝典·持久化·存储·韵味·java高级面试题
swipe3 小时前
做多轮对话 Agent,为什么我建议把短期记忆放到 Redis
后端·面试·llm
程序员黑豆3 小时前
AI全栈开发之Java:什么是JDK
前端·后端·ai编程
My is 李豆3 小时前
CentOS 7 安装 Docker 完整教程(含 docker-compose 插件)
docker·eureka·centos