docker学习(4)容器的生命周期与资源控制

🧩 1. 容器启动、暂停、重启、删除的本质区别

操作 本质行为 对进程影响 对数据影响 对镜像影响
start 启动一个已创建的容器(重新运行容器中的主进程) 创建新的进程 保留容器层数据 不变
pause 暂停容器内所有进程(用 cgroup freezer 冻结) 进程仍存在,只是挂起 数据保留 不变
unpause 恢复暂停的容器 进程继续执行 保留 不变
restart 相当于 stop + start 进程重启(旧进程被杀掉) 挂载数据保留 不变
stop 发送 SIGTERM 再 SIGKILL,结束容器进程 进程终止 容器层仍在(未删除) 不变
rm 删除容器元数据和读写层 所有进程结束 容器层被删除(数据消失) 镜像仍在

💭 举个例子:

你有一个容器 web1,挂载路径 /data

bash 复制代码
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 对内存、进程、挂载数据的影响

当执行:

bash 复制代码
docker restart mycontainer

相当于:

bash 复制代码
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
bash 复制代码
docker run --cpus=2 myapp

→ 最多使用 2 个 CPU 核。

或用更细的方式:

bash 复制代码
docker run --cpu-shares=512 myapp

→ 代表优先级,数值越大获得的 CPU 时间片越多。

限制内存
bash 复制代码
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 引擎或内核版本;若兼容性没问题,容器不会受影响。
宿主机崩溃或磁盘损坏 所有容器进程中断;未持久化的数据丢失;卷中的数据若存在独立磁盘则可恢复。

总结一句话:

容器看似独立,实则寄生于宿主机。宿主机挂了,容器也跟着停;但只要卷和镜像在,容器可随时"再生"。


相关推荐
MC丶科4 小时前
【SpringBoot 快速上手实战系列】5 分钟用 Spring Boot 搭建一个用户管理系统(含前后端分离)!新手也能一次跑通!
java·vue.js·spring boot·后端
千码君20164 小时前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构
夜白宋5 小时前
【word多文档docx合并】
java·word
@yanyu6665 小时前
idea中配置tomcat
java·mysql·tomcat
爱宇阳5 小时前
禅道社区版 Docker Compose 服务迁移教程
运维·docker·容器
2501_916766545 小时前
【项目部署】JavaWeb、MavenJavaWeb项目部署至 Tomcat 的实现方式
java·tomcat
RoboWizard5 小时前
扩容刚需 金士顿新款Canvas Plus存储卡
java·spring·缓存·电脑·金士顿
lang201509285 小时前
Spring Boot 入门:5分钟搭建Hello World
java·spring boot·后端
xzl046 小时前
docker运行Ubuntu22.04
docker