虚拟化范式跃迁中的生命周期隐喻与命令哲学——解构Docker容器从抽象实体到可控资源的数字化生存法则
本篇摘要
本篇将介绍容器定义、特性及与镜像关系,阐述容器轻量、一致、灵活、安全等优势,详解容器五大生命周期状态及转换命令,涵盖创建、运行、停止等操作,还介绍异常处理、暂停机制及相关命令用法。
欢迎拜访: 点击进入博主主页
本篇主题: Docker容器之5大生命周期状态+22个核心命令的实战密码全方位解析
制作日期: 2025.09.22
隶属专栏: 点击进入所属Docker专栏
一.认识容器
- 容器定义:容器是镜像的运行实体,镜像是静态只读文件,容器带有运行时所需的可写文件层,且容器内进程处于运行状态,容器有初建、运行、停止、暂停和删除五种状态。
- 容器特性:容器本质是主机上运行的一个进程,但有自己独立的命名空间隔离和资源限制,在容器内部看不到主机上的进程、环境变量、网络等信息,此为与直接运行在主机上进程的本质区别。
- 容器与镜像关系:容器基于镜像创建,是可运行实例,单独存在,一个镜像可创建多个容器。运行容器化环境时,会在容器内部创建文件系统读写副本,添加容器层,该层允许修改镜像副本。
可以把镜像理解成一个模版,而容器就是实例化出来的对象(某种意义上可以这么理解):
因此,就是容器基于镜像工作起来,而又自带了镜像的能力(如打包功能),还自带它的资源隔离以及资源抑制特性。
二.为什么需要容器
- 比虚拟机更轻
- 不装完整系统,共享主机内核,省资源、启动快(秒级)、性能高。
- 环境一致
- 把应用和依赖打包成“集装箱”,到哪都能跑,杜绝“我这儿行你那儿不行”。
- 灵活高效
- 一键部署、快速扩缩容(业务忙就加容器,闲就减),搬家(迁移)也方便。
- 安全隔离
- 每个容器独立运行,一个炸了不影响其他,更安全稳定。
三.容器的生命周期
容器的生命周期状态
- created:初始创建状态,容器已创建但未运行。
- running:运行状态,容器正在执行任务。
- stopped:停止状态,容器已停止运行。
- paused:暂停状态,容器进程被暂停。
- deleted:删除状态,容器已被删除。
容器状态转换命令
docker create
:创建容器,使其进入初始创建状态。docker run
:创建并立即运行容器,进入运行状态。docker start
:将已停止的容器转为运行状态。docker stop
:停止正在运行的容器,使其进入停止状态。docker kill
:强制杀死容器进程,使其进入停止状态(可能导致数据丢失,非必要不建议使用)。docker restart
:重启容器,先停止再启动,使其进入运行状态。docker pause
:暂停容器内的所有进程,使其进入暂停状态。docker unpause
:取消暂停,使容器内的进程恢复运行,回到运行状态。docker rm
:删除容器,使其进入删除状态。
容器异常终止与处理
- 非计划终止:容器进程意外终止后,需决定是否重启。选择“yes”则执行
start
命令恢复运行;选择“no”则保持停止状态。 - 容器 OOM(内存不足):
- 当容器内应用耗尽分配的内存时,触发 OOM 事件(如内存占用过大)。若容器由宿主机操作系统直接管理(非 Docker Daemon),宿主机将关闭该容器。
- 使用
--oom-kill-disable
参数可禁用 OOM-Killer,但需配合-m
设置内存上限,否则容器可能耗尽主机内存。 - 若仅使用
--oom-kill-disable
未设置-m
,容器会尽可能占用主机内存,直至被系统强制终止。
容器异常退出
- 容器内所有进程依赖 Init 进程运行,若子进程异常退出,Init 进程也会退出,导致容器关闭。Docker Daemon 会尝试重启设置了
--restart
参数的容器,否则保持停止状态(如代码问题)。
容器暂停
- 使用
docker pause
时,Docker 会剥夺容器的 CPU 资源,使其进程无法被内核调度,进入“冻结”状态,但内存、网络等资源仍保留。
四.Docker 容器常见命令
1.docker create
命令
功能:
- 创建一个新的Docker容器,但不会立即启动该容器。你可以先配置好容器的各项参数,之后再根据需要手动启动它。
语法:
1. 基本用法:
- 功能:创建容器但不启动
- 命令格式:
docker create [选项] 镜像 [命令] [参数]
- 别名:
docker container create
(功能相同)
2. 核心参数:
交互与终端:
-i
:交互模式(配合-t
使用)-t
:分配终端(配合-i
使用)-p
:端口映射(格式:主机端口:容器端口,如-p 8080:80
)-P
:随机端口映射
容器标识:
--name
:指定容器名称(如--name my-container
)-h
:设置容器主机名
环境配置:
-e
:设置环境变量(如-e KEY=VALUE
)
资源限制:
-m
:设置内存限制(如-m 512m
)--cpuset-cpus
:绑定CPU核心(如--cpuset-cpus="0-1"
)
网络配置:
--network
:指定网络类型(如--network bridge
)--link
:链接其他容器(旧方式,推荐用自定义网络)
存储配置:
-v
:挂载卷(格式:主机路径:容器路径,如-v /data:/app/data
)
生命周期:
--rm
:退出时自动删除容器--restart
:设置重启策略(如--restart always
)
这里用法大都和docker run相似就不过多演示。
演示:
首先create一个容器:
- 发先容器没有启动,只是单一创好了。
- 运行的时候发现端口有冲突,改了一下,访问到了效果。
2.docker logs
- 功能:查看容器日志。
- 语法:
docker logs [选项] 容器
。 - 别名:
docker container logs
。 - 关键参数:
-f
:跟踪日志输出。--since
:显示指定时间后日志。-t
:显示时间戳。-n
:显示最新N条日志。
演示:
- 默认全显示完后退出。
- 追踪显示,没有内容就卡住了,有日志输出就接着走。
- 追踪某一年开始的日志。
- 显示最新的5条日志。
- 显示对应时间戳。
3.docker attach
- 功能:连接到正在运行中的容器。
- 语法:
docker attach [OPTIONS] CONTAINER
- 别名:
docker container attach
- 关键参数:
--sig-proxy
,默认true,设为false退出不影响容器,否则退出会导致容器退出。
演示:
- 相当于接管了这个容器,一旦attach退出,容器也会跟着退出。
只需要加上--sig-proxy
就可以解决了:
- 符合预期。
4.docker exec
- 功能:在容器中执行命令。
- 语法:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
- 别名:
docker container exec
- 关键参数:
-d
:分离模式,在后台运行。-i
:即使没有附加也保持 STDIN 打开。-t
:分配一个伪终端。-e
:设置环境变量。-u, --user
:指定用户(格式为<name|uid>[:<group|gid>]
)。-w, --workdir
:指定工作目录。
演示:
- 启动容器后,在执行对应bash指令。
- 修改环境变量。
- 后台运行。
- 指定用户才能在容器里面执行命令。
5.docker start
- 功能:启动停止的容器。
- 语法:
docker start [OPTIONS] CONTAINER [CONTAINER...]
。 - 别名:
docker container start
。 - 样例:
docker start mynginx
。
6.docker stop
- 功能:停止运行中的容器(
不管是交互还是后台运行
)。 - 语法:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
。 - 别名:
docker container stop
。 - 关键参数:
-s
(发信号)(不常用)。
- 可以是名字或者id,也可以是多个一起stop。
7.docker restart
- 功能:用于重启容器。
- 语法:
docker restart [OPTIONS] CONTAINER [CONTAINER...]
。 - 别名:
docker container restart
。 - 关键参数:
-s
,作用为发送信号 。
演示下:
- 进行重启容器,然后再开一个进行追踪日志监督,可以发现优雅地退出,说明容器释放是主动的可以进行一些资源释放,以及一些数据不能被及时保存等(先停止后启动,故日志也会断开)。
- 发现又在运行。
- 如果用信号强制杀死,发现没有“优雅地退出”,也就是被动的,一些容器资源不能及时释放掉,以及一些数据不能被及时保存。
8.docker kill
- 功能:强制退出容器。
- 语法:
docker kill [OPTIONS] CONTAINER [CONTAINER...]
。 - 别名:
docker container kill
。 - 关键参数:
-s
,用于指定发送的信号。 - 注意: Docker stop 发送的是 SIGTERM 信号, docker kill 发送的是 SIGKILL 信号
这和对应的stop发送信号相似,只不过,stop是优雅的退出,可以保存 释放容器的一些资源,而kill比较暴力,直接干掉了。
9.docker top
-
功能:查看容器中运行的进程信息,支持
ps
命令参数。 -
语法:
docker top CONTAINER [ps OPTIONS]
-
别名:
docker container top
-
注意:
- 容器运行时不一定有
/bin/bash
终端来交互执行top
命令。 - 容器还不一定有
top
命令,可以使用docker top
来实现查看 container 中正在运行的进程。 - 可有一些搭配ps对应参数使用。
演示:
10.docker stats
- 功能:展示容器CPU、内存、网络I/O等资源使用情况
- 语法:
docker stats [OPTIONS] [CONTAINER...]
- 别名:
docker container stats
- 关键参数:
--all,-a
:显示所有容器(含未运行)--format
:指定返回模板(如table、json)--no-stream
:只显示当前状态,不实时更新--no-trunc
:不截断输出
- 返回信息:
- 容器ID和名称
- CPU和内存使用百分比
- 内存使用量和限制量
- 网络收发数据量
- 块设备读写数据量
- 容器进程/线程数
演示下:
- 默认是全监视,看到一个实时刷新页面。
- 显示所有容器情况。
- format以json串形式显示,不常用,一般都是table。
一般都是默认实时更新,如果不需要可以 --no-stream
一下:
显示指定id容器相关资源占用情况(全id显示):
11.docker container inspect
- 功能:查看容器详细信息。
- 语法:
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
- 关键参数:
-f
:指定返回值的模板文件,如 table、json。-s
:显示总的文件大小。
- 注意事项:
docker inspect
会自动检查是镜像还是容器然后显示相关信息。
下面停止掉容器看看:
- 出现了总文件大小以及停止状态也变了。
12.docker port
- 功能:
docker port
命令的主要作用是展示指定Docker容器的端口映射详情。- 它能够帮助用户查找容器内部私有端口(PRIVATE_PORT)经过网络地址转换(NAT)后,对应到宿主机面向公众的网络端口(
先要启动
)。
- 语法:
在Shell环境下,其使用格式为:
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
其中:
CONTAINER
:这是必需参数,代表要查询端口映射的Docker容器的名称或者ID。PRIVATE_PORT[/PROTO]
:此为可选参数。PRIVATE_PORT
指容器内部的私有端口号,PROTO
(可选)用于指定协议类型,比如tcp
或者udp
。若不提供该可选参数,会显示该容器所有端口的映射情况。
- 别名:
docker port
命令存在一个别名,即 docker container port
,二者功能完全一致,你可以依据个人习惯选择使用。
- 后面参数起到筛选作用。
13.docker cp
功能:
在容器和宿主机之间拷贝文件。
语法:
- 从容器拷贝文件到宿主机:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
- 从宿主机拷贝文件到容器:
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
别名:
docker container cp
演示下:
容器文件拷贝到宿主机:
进行修改后拷贝回去:
- 页面变了。
14. docker diff
功能:
- 用于检查容器内文件结构的更改情况,能查看文件或目录的创建、删除、修改等变动。
语法:
- 在 Shell 中执行命令的格式为:
docker diff CONTAINER
,其中CONTAINER
是要检查的容器的名称或 ID。 - 执行后,会列出一系列文件和目录的变更信息,比如新增的配置文件、修改过的日志文件等。 变更信息通常会有标识来表示是新增(
A
)、删除(D
)还是修改(C
)等操作。
演示:
- 可以看到我们之前测试cp的时候修改的文件。
15.docker commit
- 功能:从容器创建一个新的镜像()。
- 语法:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
- 参数:
-a
:提交的镜像作者;-c
:使用Dockerfile指令来创建镜像,可修改启动指令;-m
:提交时的说明文字;-p
:在commit时,将容器暂停(提交完恢复)。
运行一个容器,然后把它还原成对应的镜像添加镜像列表里面:
下面测试下如果修改对应的容器,然后还原成的镜像,再运行是否发生变化:
进原容器文件新增:
还原这个容器为镜像:
- 镜像再次运行文件,发现之前的文件还在。
- 进行相关筛选,发现确实变了。
修改启动指令测试:
- 符合预期。
总结下:
这里的commit就相当于把对应的容器根据里面的信息,配置,重新转化成对应的镜像,如容器自身内部有变化,生成的镜像边变化可用于制作镜像。
16.docker pause
与docker unpause
docker pause
:- 功能:暂停容器中所有进程。
- 语法:
docker pause CONTAINER [CONTAINER...]
- 别名:
docker container pause
- 样例:
docker pause mynginx
docker unpause
:- 功能:恢复容器中所有进程。
- 语法:
docker unpause CONTAINER [CONTAINER...]
- 别名:
docker container unpause
启动nginx,然后再暂停:
- 一直在转圈。
unpause下:
- 恢复了。
17.docker rm
以下是关于 docker rm
命令的简单概括:
- 功能:删除停止的容器。
- 语法:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
- 别名:
docker container rm
- 关键参数:
-f
:通过 SIGKILL 信号强制删除一个运行中的容器。
运行容器,停止后删除:
强制删除:
18.docker import与 export
docker export:
- 功能:将容器
文件
系统导出为tar文件
。 - 语法:
docker export [OPTIONS] CONTAINER
- 别名:
docker container export
- 关键参数:
-o
:指定输出文件。
- 作用场景:备份容器文件系统、迁移环境。
docker import:
- 功能:将tar
文件
导入为Docker镜像
。 - 语法:
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
- 关键参数:
-c
:导入时执行Dockerfile指令。-m
:添加提交信息。
- 作用场景:基于容器创建镜像、定制基础镜像。
对比:
- 流程:export(容器→tar) + import(tar→镜像) = 容器文件系统转镜像。
- 差异:export只导容器文件,import生成含元数据的镜像。
将容器转化成tar文件:
进行导出为镜像,查看镜像信息:
- 发现相关原数据信息都变成空了(而save和load就不会出现这个问题[镜像与镜像之间的转换])。
因此在还原镜像的时候还是更推荐save和load。
基于还原镜像的时候参数选项:
19.docker wait
- 命令:
docker wait
- 功能:阻塞运行直到容器停止,然后打印出其退出代码。
- 语法:
docker wait CONTAINER [CONTAINER...]
- 别名:
docker container wait
正在运行的容器如果被wait,然后终端就无法进行,直到这个容器挂掉出现退出码,之后在wait,就直接返回退出码了。
20.docker rename
- 功能:重命名容器。
- 语法:
docker rename CONTAINER NEW_NAME
。 - 别名:
docker container rename
。
演示:
重命名容器名称:
21.docker container prune
- 功能:删除所有停止的容器。
- 语法:
docker container prune [OPTIONS]
。 - 关键参数:
-f, --force
:不提示是否进行确认。
22.docker update
-
功能
- 用于更新已有容器的配置。
-
语法
- Shell 命令格式:
docker update [OPTIONS] CONTAINER [CONTAINER…]
- Shell 命令格式:
-
别名
- 也可使用
docker container update
来执行相同操作。
- 也可使用
-
关键参数(部分常用)
--cpus
:指定容器可使用的 CPU 数量。--cpuset-cpus
:指定容器要绑定使用哪些 CPU 核心。--memory
:设置容器的内存使用上限。--memory-swap
:设置容器的交换内存(swap)大小。--cpu-period
:指定容器对 CPU 资源进行重新分配的时间周期(相当于多长时间分配时间片)。--cpu-quota
:在--cpu-period
指定的周期内,容器最多能占用 CPU 的时长(相当于时间片长度)。
- 这里还是不允许,一般容器在未启动时候就需要分配好相关信息,或者结合挂载,利用cgroups进行限制等。
小结下
命令 | 别名 | 功能 | 备注 |
---|---|---|---|
docker create | docker container create | 创建容器 | |
docker run | docker container run | 运行容器 | 必须掌握 |
docker attach | docker container attach | 连接到正在运行中的容器 | |
docker commit | docker container commit | 将镜像提交为容器 | 必须掌握 |
docker cp | docker container cp | 在容器和宿主机之间拷贝 | 必须掌握 |
docker diff | docker container diff | 检查容器里文件结构的更改 | |
docker exec | docker container exec | 在运行的容器中执行命令 | 必须掌握 |
docker export | docker container export | 将容器导出为tar | |
docker container inspect | 查看容器详细信息 | 必须掌握 | |
docker kill | docker container kill | 杀死容器 | 必须掌握 |
docker logs | docker container logs | 查看日志 | 必须掌握 |
docker ps | docker container ls, docker container list, docker container ps | 查看正在运行的进程 | 必须掌握 |
docker pause | docker container pause | 暂停进程 | |
docker port | docker container port | 查看容器的端口映射 | |
docker container prune | 删除停止的容器 | ||
docker rename | docker container rename | 重命名容器 | |
docker restart | docker container restart | 重启容器 | 必须掌握 |
docker rm | docker container rm, docker container remove | 删除容器 | 必须掌握 |
docker start | docker container start | 启动容器 | 必须掌握 |
docker stats | docker container stats | 查看资源占用信息 | 必须掌握 |
docker stop | docker container stop | 停止容器 | 必须掌握 |
docker top | docker container top | 查看某个容器的资源占用 | 必须掌握 |
docker unpause | docker container unpause | 继续运行容器 | |
docker update | docker container update | 更新容器配置 | |
docker wait | docker container wait | 阻止一个或多个容器停止,然后大厨退出码 |
五.本篇小结
通过本篇掌握容器核心概念与生命周期管理,熟悉常用命令,能有效进行容器部署、维护与故障处理,保障应用稳定高效运行。