前言:前面我们完成了Docker基础命令速查表和help命令的学习,实操中频繁用到docker run创建容器、docker stop停止容器、docker rm删除容器,但很多新手只停留在“会用命令”的层面,不清楚“容器从创建到删除的完整生命周期”——比如“docker createdocker run的区别是什么?”“容器停止后数据还在吗?”“强制删除和正常删除有什么不同?”

本文全程新手友好,以“nginx容器”为实操案例,从底层逻辑+实操命令双维度,拆解容器完整生命周期的5个核心阶段(创建→启动→停止→重启→删除),补充各阶段的状态变化、数据留存规则、新手避坑点,衔接前文镜像分层、容器命令知识,帮你彻底搞懂“容器的一生”,避免实操中因不了解生命周期导致数据丢失、命令误用的问题!

建议收藏+关注,跟着Docker系列教程,从“会用命令”到“懂底层逻辑”,一步步夯实Docker基础,零基础也能轻松玩转容器生命周期管理~

一、先搞懂:容器生命周期核心概念(新手秒懂)

1. 容器生命周期的本质

容器的生命周期,就是从“基于镜像创建容器”开始,到“删除容器释放资源”结束的完整过程,核心是容器状态的持续变化。Docker容器有7种核心状态(新手重点关注5种):

状态

说明

对应操作

Created(已创建)

仅创建容器,未启动,容器处于“静止”状态

docker create

Running(运行中)

容器正常启动,执行核心命令(如nginx进程)

docker start/docker run

Exited(已停止)

容器正常停止,进程终止,可重新启动

docker stop/docker kill

Restarting(重启中)

容器处于“停止→启动”的过渡状态

docker restart

Removed(已删除)

容器被彻底删除,所有资源(可写层)释放

docker rm

2. 核心逻辑(衔接镜像分层知识)

容器的生命周期始终围绕“镜像只读层+容器可写层”展开:

  • 「创建阶段」:为镜像只读层新增空的可写层,分配容器ID、名称、网络等基础配置;

  • 「运行阶段」:启动容器内的核心进程(如nginx),可写层开始记录修改(如修改配置、新增文件);

  • 「停止阶段」:终止容器内的进程,可写层数据保留(不丢失),容器进入静止状态;

  • 「重启阶段」:重新启动容器内的进程,复用原有可写层和配置;

  • 「删除阶段」:彻底清理容器的可写层、ID、名称等所有资源,仅保留底层镜像。

二、核心拆解:容器生命周期5个阶段(实操+原理)

以“nginx容器”为统一案例,逐阶段拆解操作命令、状态变化、底层逻辑,Linux/Mac命令完全通用,新手可跟着复刻:

阶段1:创建容器(Created)—— 仅初始化,不启动

1. 核心命令

# 语法:docker create [参数] 镜像名 docker create --name my-nginx -p 8080:80 nginx:1.23.4

2. 关键解读
  • 作用:基于nginx:1.23.4镜像,创建名为my-nginx的容器,配置端口映射8080:80,但不启动容器

  • 底层操作:

① 检查本地是否有目标镜像(无则提示拉取);

② 为镜像只读层新增空的可写层;

③ 分配容器ID、名称、网络端口等配置;

④ 容器状态变为Created(已创建)。

3. 验证状态

# 查看容器状态,重点关注STATUS字段 docker ps -a | grep my-nginx # 输出示例: # 9f7a8b9c0d1e nginx:1.23.4 "/docker-entrypoint.…" 10 seconds ago Created my-nginx

4. 新手对比:docker create vs docker run

很多新手会问“为什么有docker run还要docker create?”,核心区别:

命令

操作逻辑

适用场景

docker create

仅创建容器,不启动

需先配置容器(如挂载数据卷),再启动;批量创建容器时,先统一创建再按需启动

docker run

先创建容器,再立即启动

快速启动容器(新手最常用),一步到位

> 补充:docker run = docker create + docker start

阶段2:启动容器(Running)—— 运行核心进程

1. 核心命令

# 语法:docker start 容器名/ID docker start my-nginx

2. 关键解读
  • 作用:启动已创建的my-nginx容器,容器状态从Created变为Running

  • 底层操作:

① 启动容器内的nginx主进程(/docker-entrypoint.sh);

② 绑定端口8080:80,对外提供HTTP服务;

③ 可写层开始接收数据(如访问日志、配置修改)。

3. 验证状态

# 查看运行中的容器 docker ps | grep my-nginx # 输出示例: # 9f7a8b9c0d1e nginx:1.23.4 "/docker-entrypoint.…" 2 minutes ago Up 10 seconds 0.0.0.0:8080->80/tcp my-nginx

  • 关键:STATUS显示Up 10 seconds(运行中),PORTS显示端口映射生效。

4. 实操验证:容器正常提供服务

访问http://localhost:8080(Mac/Linux本地),能看到nginx默认欢迎页,说明容器启动成功。

阶段3:停止容器(Exited)—— 终止进程,保留数据

容器停止分“正常停止”和“强制停止”,新手需理解两者区别,避免数据丢失:

方式1:正常停止(推荐)

# 语法:docker stop 容器名/ID docker stop my-nginx

  • 底层逻辑:向容器内的主进程发送SIGTERM信号(优雅终止),进程有时间保存数据、关闭连接,等待10秒后若未终止,自动发送SIGKILL强制终止;

  • 状态变化:RunningExited (0)(退出码0表示正常终止)。

方式2:强制停止(慎用)

# 语法:docker kill 容器名/ID docker kill my-nginx

  • 底层逻辑:直接向容器内进程发送SIGKILL信号,强制终止进程,无缓冲时间;

  • 适用场景:容器卡死、正常停止失败时使用;

  • 状态变化:RunningExited (137)(退出码137表示强制终止)。

3. 验证状态+数据留存

# 查看容器状态 docker ps -a | grep my-nginx # 输出示例: # 9f7a8b9c0d1e nginx:1.23.4 "/docker-entrypoint.…" 5 minutes ago Exited (0) 10 seconds ago my-nginx # 验证数据留存:修改容器内配置后停止,重启后配置仍在 # 1. 启动容器 docker start my-nginx # 2. 进入容器修改欢迎页 docker exec -it my-nginx bash echo "Hello Docker" > /usr/share/nginx/html/index.html exit # 3. 停止容器 docker stop my-nginx # 4. 重新启动容器 docker start my-nginx # 5. 访问http://localhost:8080,仍显示“Hello Docker”(可写层数据未丢失)

阶段4:重启容器(Restarting)—— 复用配置,重新运行

1. 核心命令

# 语法:docker restart 容器名/ID docker restart my-nginx

2. 关键解读
  • 作用:先停止容器(发送SIGTERM),再立即启动容器,状态从ExitedRestartingRunning

  • 底层逻辑:复用容器原有可写层、网络配置、端口映射,无需重新创建,启动速度快;

  • 适用场景:修改容器配置后(如nginx.conf),需重启容器使配置生效。

3. 验证状态

# 查看容器状态(重启过程中短暂显示Restarting) docker ps | grep my-nginx # 最终输出: # 9f7a8b9c0d1e nginx:1.23.4 "/docker-entrypoint.…" 10 minutes ago Up 5 seconds 0.0.0.0:8080->80/tcp my-nginx

阶段5:删除容器(Removed)—— 释放资源,彻底清理

1. 核心命令(正常删除)

# 步骤1:先停止容器(运行中的容器无法直接删除) docker stop my-nginx # 步骤2:删除容器 docker rm my-nginx

2. 强制删除(跳过停止,直接删除)

# 语法:docker rm -f 容器名/ID docker rm -f my-nginx

  • 底层逻辑:先强制停止容器(docker kill),再删除容器;

  • 新手提示:慎用!若容器内有未保存的临时数据,强制删除可能导致数据丢失(建议先停止再删除)。

3. 关键解读
  • 底层操作:

① 清理容器的可写层(所有修改的数据被删除);

② 释放容器ID、名称、端口映射等配置;

③ 容器状态变为Removeddocker ps -a中不再显示;

  • 核心注意:删除容器不会影响底层镜像nginx:1.23.4仍存在),可基于该镜像重新创建容器。

4. 批量删除容器(新手实用技巧)

# 删除所有已停止的容器 docker rm $(docker ps -a -q) # 删除所有容器(含运行中) docker rm -f $(docker ps -a -q)

三、容器生命周期完整流程图(可视化)

用Mermaid流程图梳理全流程,帮你直观记忆:

四、新手避坑:容器生命周期常见错误(必看)

1. 错误1:删除运行中的容器失败,提示“container is running”

  • 原因:Docker默认禁止删除运行中的容器,防止数据丢失;

  • 解决:先执行docker stop 容器名停止容器,再执行docker rm删除;或用docker rm -f强制删除(慎用)。

2. 错误2:停止容器后,访问端口提示“连接拒绝”

  • 原因:容器停止后,端口映射失效,进程终止,无法提供服务;

  • 解决:执行docker start 容器名重启容器,端口映射自动恢复。

3. 错误3:删除容器后,修改的配置丢失

  • 原因:容器的修改仅保存在可写层,删除容器会清理可写层;

  • 解决:若需永久保存修改,先执行docker commit 容器名 新镜像名:标签,将容器转为新镜像,再删除容器。

4. 错误4:重启容器后,端口映射失效

  • 原因:创建容器时未指定--name,容器ID变化,或重启时Docker服务异常;

  • 解决:创建容器时用--name自定义名称(如my-nginx),重启时通过名称操作,避免依赖ID;重启Docker服务后重新启动容器。

五、核心关联:生命周期与前文知识点闭环

  1. 关联镜像分层:容器生命周期的所有操作,仅影响“容器可写层”,底层镜像只读层始终不变;

  2. 关联基础命令:生命周期的每个阶段,对应第15章的核心命令(create/start/stop/restart/rm);

  3. 关联help命令:记不清命令参数时,用docker [命令] --help查询(如docker rm --help查强制删除参数);

  4. 关联Hello World容器:Hello World容器是“一次性容器”,启动后执行命令→自动停止→进入Exited状态。

总结

核心知识点回顾

  1. 生命周期5阶段:创建(Created)→ 启动(Running)→ 停止(Exited)→ 重启(Restarting)→ 删除(Removed),核心是容器状态的变化;

  2. 核心逻辑:容器操作仅影响可写层,镜像只读层不变,停止容器数据留存,删除容器数据清空;

  3. 关键命令docker create(创建)、docker start(启动)、docker stop(正常停止)、docker restart(重启)、docker rm(删除);

  4. 避坑关键:运行中的容器无法直接删除,停止容器数据不丢,删除容器前可commit保存修改。

新手实操建议

  1. 完整复刻:用nginx容器完整走一遍“创建→启动→修改配置→停止→重启→删除”流程,观察每一步的状态变化;

  2. 对比练习:分别用docker create+startdocker run启动容器,理解两者的逻辑差异;

  3. 数据验证:修改容器内文件后,停止/重启/删除容器,验证数据的留存/丢失规则,加深对可写层的理解。

后续我会更新Docker数据卷(Volume)的使用(解决“删除容器数据丢失”的问题),关注我,跟着系列教程一步步吃透Docker,从容器生命周期管理到数据持久化,零基础也能轻松上手容器化开发和部署!

觉得有用的话,收藏+关注,评论区扣“容器生命周期”,免费领取《Docker容器生命周期实操手册+状态变化速查表》,助力你彻底掌握容器全流程管理,少走弯路~

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐