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 create加docker start的组合。如果你只想创建容器但不启动,可以用docker create。我在项目中遇到过这样的情况:需要提前准备好一批容器,等流量高峰时再批量启动,这时候create就派上用场了。
--rm参数,容器停止后自动删除。开发环境强烈推荐,避免一堆废弃容器占着磁盘空间。
3.2 容器的生命周期管理
容器的生命周期,说白了就是「创建→运行→暂停/停止→删除」这几个状态。你想想看,一个容器从生到死,其实就这几个命令:
| 操作 | 命令 | 说明 |
|---|---|---|
| 启动 | docker start <容器名> |
启动已存在的停止状态容器 |
| 停止 | docker stop <容器名> |
优雅停止,给进程10秒清理时间 |
| 强制停止 | docker kill <容器名> |
直接发送SIGKILL信号 |
| 暂停 | docker pause <容器名> |
冻结容器进程,不释放资源 |
| 恢复 | docker unpause <容器名> |
解冻暂停的容器 |
| 重启 | docker restart <容器名> |
先停止再启动 |
| 删除 | docker rm <容器名> |
删除已停止的容器 |
嗯,这里要注意——docker stop和docker kill的区别。我曾经在生产环境上犯过傻,直接用kill停了一个数据库容器,结果数据没来得及刷盘,重启后出了点小问题。从那以后,我都是先用stop,实在停不下来再用kill。
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,默认是物理内存的两倍。
-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。不过那是后话了,咱们先把基础打牢。记住一句话:日志要轮转,监控要持续,资源要限制——这三件事做好了,容器运维就稳了一大半。