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

createh510小时前技术教程3

开篇导读

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

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

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

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

本讲就是为了解决这些现实问题而来!
我们将从容器的生命周期出发,结合常用命令、实战技巧,带你完整掌握 Docker 容器的管理与调试方式。


一、容器生命周期全景图

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

CREATE → START → RUNNING → STOP → EXIT → REMOVE

关键命令一览:

命令

作用

docker create

创建容器但不运行

docker start

启动已创建容器

docker run

创建并启动容器(最常用)

docker stop

优雅停止容器

docker kill

强制终止容器

docker rm

删除容器实例


二、容器创建与启动详解

推荐的标准运行格式

docker run -d --name my-nginx -p 8080:80 nginx

解释:

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

暂停与恢复容器

docker pause <container>
docker unpause <container>

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


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

状态查看

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

日志查看

docker logs my-nginx
docker logs -f my-nginx  # 实时追踪

常见问题排查

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

四、进入容器内部调试

方法一:exec

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

方法二:attach

docker attach my-nginx

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


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

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

挂载数据卷(volume)

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

挂载配置文件

docker run -v $(pwd)/config/nginx.conf:/etc/nginx/nginx.conf nginx

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


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

清理退出的容器

docker container prune

限制资源(CPU/内存)

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 的使用,打牢容器操作的根基。

相关文章

代码调试,教给你

昨天我和一些朋友一起调试代码,他们做程序员这一行都不太久,我向他们展示了一些代码调试技巧。今天早上我在想,我应该如何教授他们学习代码调试?我在Twitter上发了一条推文说,我从来没有见过任何好的调试...

使用VS Code调试PhpStudy环境里的代码

最近几个月把所有项目都迁过来 VS Code 了(除了因为Unity调试问题反而用回了 Visual Studio),PHP也就抛弃了最强的 PhpStorm 。这段时间抽空在帮朋友处理PHP项目,然...

容器网络调试怎么办?一条命令就搞定!

nsenter 命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于 util-linux 包中。用途一个最典型的用途就是进入容器的网络命令空间。相当多的容器为了轻量级,是不包含较为基础的命...

线上项目CPU,内存都跑满了,怎么调试?

记得第一次当整个电商项目负责人的时候,在使用量高峰期时,运维的同事突然跑过来说,xx服务的某台机器的CPU,内存暴了(OOM了),赶紧想办法怎么做。当时的心情既高兴,又紧张。高兴的是产品真的有使用在使...

手把手教你nginx解决前端本地跨域问题

收到很多私信,有许多同学遇到本地开发静态文件,想要调试远程接口的问题,教大家一个解决跨域调试常用的方法。有什么其他问题也欢迎大家关注私信我,看到的会一一解答。先下载nginx,因为大部分人是windo...