docker学习(4)容器的生命周期与资源控制
🧩 1. 容器启动、暂停、重启、删除的本质区别
操作 | 本质行为 | 对进程影响 | 对数据影响 | 对镜像影响 |
---|---|---|---|---|
start | 启动一个已创建的容器(重新运行容器中的主进程) | 创建新的进程 | 保留容器层数据 | 不变 |
pause | 暂停容器内所有进程(用 cgroup freezer 冻结) | 进程仍存在,只是挂起 | 数据保留 | 不变 |
unpause | 恢复暂停的容器 | 进程继续执行 | 保留 | 不变 |
restart | 相当于 stop + start | 进程重启(旧进程被杀掉) | 挂载数据保留 | 不变 |
stop | 发送 SIGTERM 再 SIGKILL,结束容器进程 | 进程终止 | 容器层仍在(未删除) | 不变 |
rm | 删除容器元数据和读写层 | 所有进程结束 | 容器层被删除(数据消失) | 镜像仍在 |
💭 举个例子:
你有一个容器 web1
,挂载路径 /data
:
docker run -d -v /mydata:/data --name web1 nginx
操作 | 结果 |
---|---|
docker stop web1 | 容器进程停止,/data 数据仍在 |
docker start web1 | 容器重新启动,继续使用同一个 /data |
docker rm web1 | 容器被彻底删除,若没挂载卷,/data 数据也没了 |
docker restart web1 | 容器短暂停止再启动,挂载不变,内存和进程都被重建 |
🧠 2. docker restart
对内存、进程、挂载数据的影响
当执行:
docker restart mycontainer
相当于:
docker stop mycontainer && docker start mycontainer
影响如下:
项目 | 变化情况 |
---|---|
内存状态 | 全部清空(因为进程重启) |
进程 | 被终止并重新创建 |
挂载数据(volume/bind mount) | 不受影响(挂载关系保持) |
容器层文件系统 | 保留(除非删除容器) |
网络连接 | 重新分配 IP(如果动态分配) |
📌 所以:
- 你修改
.env
文件后docker restart
无效,就是因为容器进程被重启,但容器层的数据(包括原始环境变量)没变。 - 只有
docker-compose down
删除容器,再up
重新创建,才会重新读取.env
并生效。
💪 3. Docker 如何限制 CPU 和内存
Docker 使用 Linux 的 cgroups(控制组) 来实现资源限制。
限制 CPU
docker run --cpus=2 myapp
→ 最多使用 2 个 CPU 核。
或用更细的方式:
docker run --cpu-shares=512 myapp
→ 代表优先级,数值越大获得的 CPU 时间片越多。
限制内存
docker run -m 512m myapp
→ 限制容器最多使用 512MB 内存。
当超出内存限制时:
- Linux 内核的 OOM Killer 会杀掉容器进程;
- 容器状态变为
Exited (137)
。
⚠️ 4. 如果某个容器疯狂占用资源,会不会影响其他容器?
会,但可以被限制。
-
如果没设置资源限制,容器本质上共用宿主机资源。
→ 一个容器吃光 CPU/内存,宿主机会卡死,其他容器也受影响。 -
如果设置了
--cpus
和-m
,Docker 会通过 cgroups 控制:- 超出限制的 CPU 需求被阻塞;
- 内存达到上限会触发 OOM;
- 这样就能保证“资源隔离”。
✅ 建议:
为每个重要容器设置合理的资源限制,防止“噪音容器”(noisy neighbor)。
💡 5. Docker 解决的根本问题是什么?
Docker 解决的,不仅是“运行方便”,而是 环境一致性 + 快速部署 + 资源隔离。
传统问题:
- “我本地能跑,服务器跑不动”;
- 每次部署要手动装环境;
- 应用之间依赖冲突。
Docker 的核心思路是:
把应用和运行环境打包成一个独立、可移植的单元(容器),在任何地方都能以同样方式运行。
所以 Docker 解决的是:
- 开发、测试、生产的环境一致性;
- 部署自动化;
- 多应用隔离与资源控制。
🧩 6. 容器技术对微服务和 CI/CD 的意义
微服务架构
- 每个微服务打包成一个独立容器;
- 快速启动、独立部署;
- 不同语言/框架互不干扰;
- 容器间通过网络通信,形成完整系统。
CI/CD(持续集成/持续部署)
- 构建:代码提交后自动构建镜像;
- 测试:用容器跑自动化测试;
- 部署:在 Kubernetes 等平台自动拉取新镜像上线。
👉 容器 = 自动化流水线的“原子单元”。
💥 7. 宿主机系统更新或崩溃,会对容器造成什么影响?
情况 | 对容器的影响 |
---|---|
宿主机重启 | 所有容器都会停止(进程消失),但镜像、卷都保留;重启 Docker 后可恢复。 |
宿主机系统更新 | 可能更新 Docker 引擎或内核版本;若兼容性没问题,容器不会受影响。 |
宿主机崩溃或磁盘损坏 | 所有容器进程中断;未持久化的数据丢失;卷中的数据若存在独立磁盘则可恢复。 |
✅ 总结一句话:
容器看似独立,实则寄生于宿主机。宿主机挂了,容器也跟着停;但只要卷和镜像在,容器可随时“再生”。