3、Docker容器管理:容器的创建与启动、容器的生命周期管理、容器的资源限制、容器的日志与监控

容器管理,说白了就是Docker最核心的日常操作。我刚开始接触Docker那会儿,觉得它就是个轻量级虚拟机,后来踩了不少坑才明白——容器和虚拟机完全是两码事。今天咱们就把容器管理的几个关键点掰开揉碎了讲清楚。

3.1 容器的创建与启动

创建容器,最常用的就是docker run命令。我个人习惯先想清楚几个问题:用什么镜像?要不要交互式运行?端口怎么映射?数据要不要持久化?

# 最简单的创建并启动
docker run nginx

# 交互式运行,进入容器内部
docker run -it ubuntu /bin/bash

# 后台运行,映射端口
docker run -d -p 8080:80 nginx

# 带名字和重启策略
docker run --name myapp -d --restart=always nginx

这里有个细节很多人会忽略——docker run其实是docker createdocker start的组合。如果你只想创建容器但不启动,可以用docker create。我在项目中遇到过这样的情况:需要提前准备好一批容器,等流量高峰时再批量启动,这时候create就派上用场了。

小技巧:创建容器时加上--rm参数,容器停止后自动删除。开发环境强烈推荐,避免一堆废弃容器占着磁盘空间。

3.2 容器的生命周期管理

容器的生命周期,说白了就是「创建→运行→暂停/停止→删除」这几个状态。你想想看,一个容器从生到死,其实就这几个命令:

操作 命令 说明
启动 docker start <容器名> 启动已存在的停止状态容器
停止 docker stop <容器名> 优雅停止,给进程10秒清理时间
强制停止 docker kill <容器名> 直接发送SIGKILL信号
暂停 docker pause <容器名> 冻结容器进程,不释放资源
恢复 docker unpause <容器名> 解冻暂停的容器
重启 docker restart <容器名> 先停止再启动
删除 docker rm <容器名> 删除已停止的容器

嗯,这里要注意——docker stopdocker kill的区别。我曾经在生产环境上犯过傻,直接用kill停了一个数据库容器,结果数据没来得及刷盘,重启后出了点小问题。从那以后,我都是先用stop,实在停不下来再用kill

避坑指南:我曾经遇到过容器状态卡在「Removal In Progress」的情况,怎么删都删不掉。后来发现是存储驱动的问题,重启Docker守护进程才解决。遇到这种问题别慌,先查查Docker日志。

3.3 容器的资源限制

为什么要做资源限制?说白了就是防止某个容器把宿主机资源吃光。我记得有一次线上事故,一个Java应用内存泄漏,直接把宿主机16G内存撑爆了,其他容器全部挂掉。从那以后,资源限制就成了我部署容器的标配。

# 限制CPU使用
docker run --cpus=1.5 nginx

# 限制内存
docker run -m 512m nginx

# 同时限制CPU和内存
docker run --cpus=1 -m 256m --memory-swap=512m nginx

# 限制磁盘IO
docker run --device-read-bps=/dev/sda:1mb --device-write-bps=/dev/sda:1mb nginx

这里有个容易混淆的点——--memory--memory-swap的关系。简单说,-m 256m --memory-swap=512m的意思是:容器最多用256M物理内存,当物理内存不够时,可以用最多256M的交换空间(512-256=256)。如果你不设置--memory-swap,默认是物理内存的两倍。

核心要点:生产环境一定要做资源限制!建议给每个容器预留20%的缓冲空间。比如你的应用实际需要200M内存,那就设置-m 256m

3.4 容器的日志与监控

日志管理,是运维中最头疼的事之一。Docker默认的日志驱动是json-file,所有日志都写在宿主机上。时间一长,磁盘空间就报警了。

# 查看容器日志
docker logs myapp

# 实时跟踪日志
docker logs -f myapp

# 只显示最近100行
docker logs --tail 100 myapp

# 带时间戳
docker logs -t myapp

我个人习惯在生产环境用--log-opt max-size=10m --log-opt max-file=3,这样每个日志文件最大10M,保留3个文件,循环覆盖。既不会丢日志,也不会撑爆磁盘。

监控方面,我推荐用docker stats命令实时查看资源使用情况:

# 实时监控所有容器
docker stats

# 监控指定容器
docker stats myapp myapp2

# 只输出一次
docker stats --no-stream myapp
经验之谈:如果你用docker stats发现某个容器CPU忽高忽低,别急着下结论。先看看是不是日志输出太频繁导致的。我曾经排查了半天,最后发现是应用里有个console.log每秒钟打印几百行,把CPU都耗在IO上了。

对于更专业的监控,我建议结合cAdvisor或者Prometheus。不过那是后话了,咱们先把基础打牢。记住一句话:日志要轮转,监控要持续,资源要限制——这三件事做好了,容器运维就稳了一大半。