概念
Docker 容器是 Docker 生态中的运行时 实例,是基于 Docker 镜像创建的可执行环境,包含应用程序及其依赖(代码、运行时、库、环境变量等),并与宿主机和其他容器隔离,是镜像的 "动态运行形态"。
通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要 的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容 器有初建、运行、停止、暂停和删除五种状态。
虽然容器的本质是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资 源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息, 这是容器与直接运行在主机上进程的本质区别。
容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。 运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个 容器层,该层允许修改镜像的整个副本
容器的核心本质
可以把容器理解为:"轻量级的、隔离的虚拟运行 环境 ",它不是完整的虚拟机(无需模拟硬件),而是通过 Linux 内核的命名空间(Namespace)、控制组(Cgroup)等技术实现进程隔离和资源限制,因此更轻量、启动更快。
Docker 容器的关键特性
基于镜像创建
容器是镜像的运行实例,一个镜像可以创建多个独立的容器(类比:镜像 = 类,容器 = 对象)。例如:用 nginx:1.29.3 镜像可启动多个 nginx 容器,彼此隔离。
可写层与隔离性
容器在镜像的只读层之上添加了一层可写层,容器内的修改(如写入文件、安装软件)仅作用于该层,不会影响镜像本身;同时,容器拥有独立的网络、进程、文件系统空间,与宿主机和其他容器互不干扰。
轻量级与高效
容器共享宿主机内核,无需单独的操作系统内核,启动时间通常在毫秒级,资源占用远低于虚拟机。
生命周期可控
容器可被创建、启动、停止、重启、删除,状态灵活,支持快速扩缩容(如 Kubernetes 编排容器)。
容器和镜像的关系
|----------|--------------|-----------------|
| 维度 | image | container |
| 状态 | 静态、只读模板 | 动态、可写运行实例 |
| 作用 | 定义容器的运行环境和内容 | 实际运行应用程序 |
| 可修改性 | 不可修改(需重新构建) | 可修改(仅影响自身可写层) |
| 生命周期 | 持久化存储 | 临时运行(可通过卷持久化数据) |
容器的生命周期
容器的生命周期是容器可能处于的状态(status),一共有五种
|---------|------|
| status | 含义 |
| created | 初建状态 |
| running | 运行状态 |
| stopped | 停止状态 |
| paused | 暂停状态 |
| deleted | 删除状态 |
他们之间的转换关系如图所示:

容器OOM
容器 OOM(Out Of Memory)指容器因内存使用超出限制或宿主机内存耗尽,被 Linux 内核的 OOM Killer 强制终止的现象。本质是容器进程占用的内存资源触达阈值,触发系统的内存保护机制,导致容器崩溃退出。
触发原因
容器内存限制耗尽
Docker 支持通过--memory(或-m)为容器设置内存上限,若容器内进程使用内存超过该限制,内核会优先终止容器内的占用内存最大的进程(通常是容器 PID 为 1 的主进程),导致容器退出。
宿主机内存耗尽
即使未给容器设置内存限制,若宿主机整体内存不足(包括物理内存 + 交换分区),内核 OOM Killer 会根据进程的 "OOM 分数"(oom_score)选择终止进程,容器进程(尤其是占用内存大的)可能被选中,导致容器 OOM。
容器内存限制配置不合理
-
限制值远低于应用实际需求(如 Java 应用未调整堆内存,默认堆大小超出容器限制);
-
未考虑应用的峰值内存使用(如突发流量导致内存飙升)。
影响
-
容器崩溃退出 :容器状态变为exited,退出码通常为137(表示进程被信号 9(SIGKILL)终止);
-
业务中断:若容器运行的是核心服务,会导致服务不可用;
-
数据丢失风险:若应用未做好内存溢出时的容错和数据持久化,可能丢失未保存的数据。
命令
命令概况
|--------------------------|---------------------|-----------------------------------------------------------------|
| 命令 | 功能 | 别名 |
| 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 | 将容器导出为 tar | docker container export |
| 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 |
命令详解
docker ps
用于查看容器状态的核心命令,默认显示当前正在运行的容器信息,通过参数可扩展显示所有容器(包括已停止的)或自定义输出格式。
docker ps [OPTIONS]
-
Options
-
-a/--all: 显示所有容器(包括运行中、已停止、已创建的)
-
-q/--quiet : 仅输出容器 ID(常用于批量操作,如 docker rm $(docker ps -aq))
-
-l/--latest: 显示最近创建的容器(无论状态)
-
-s/--size: 显示容器占用的磁盘空间
-
--format : 自定义输出格式(如 --format "table {{.ID}}\t{{.Names}}\t{{.Status}}")
-
-n=<数字>: 显示最近创建的 n 个容器
-

docker create
创建容器,但是并没有运行容器,创建之后容器的状态为 created ,其语法和 docker run 基本类似,只是少了-d
docker create [OPTIONS] <镜像名:标签> 或 <镜像ID> [COMMAND] [ARG...]
-
Options
-
--name : 为容器指定自定义名称(如 --name mynginx),避免随机名称
-
-p/--publish : 端口映射(如 -p 8080:80,将宿主机 8080 端口映射到容器 80 端口)
-
-v/--volume : 挂载卷(如 -v /host/path:/container/path,实现宿主机与容器目录共享)
-
-e/- env : 设置环境变量(如 -e MYSQL_ROOT_PASSWORD=123456)
-
--network : 指定容器网络(如 --network bridge)
-
-m/--memory : 限制容器内存(如 -m 512m)
-

docker rm
用于删除已停止容器的命令,可清理无用容器以释放资源,也可通过选项强制删除运行中的容器。
docker rm [OPTIONS] <容器ID/名称> [容器ID/名称...]
-
Options
-
-f/--force : 强制删除运行中的容器(先发送 SIGKILL 终止容器,再删除)
-
-v/--volumes: 删除容器关联的数据卷(避免卷残留)
-
-l/--link: 删除容器间的网络链接(较少用)
-

如果删除未停止的容器,会进行报错

docker run
创建容器,并直接运行,如果容器已经创建但是没有运行,无法使用run使容器运行,可以理解为 docker create + docker start 的组合操作
docker run [OPTIONS] <镜像名:标签> 或 <镜像ID> [COMMAND] [ARG...]
-
options
-
--name : 为容器指定自定义名称(避免随机名称),如 --name mynginx
-
-d/--detach: 后台运行容器(守护进程模式),返回容器 ID
-
-p/--publish : 端口映射(宿主机端口:容器端口),如 -p 8080:80
-
-v/--volume : 挂载卷(宿主机路径:容器路径),如 -v /host/data:/container/data
-
-e/- env : 设置环境变量,如 -e MYSQL_ROOT_PASSWORD=123456
-
-m/--memory : 限制容器内存,如 -m 512m(最大 512MB 内存)
-
--network : 指定容器网络,如 --network bridge 或自定义网络
-
-it : 交互式运行(结合-i和-t),分配伪终端并保持标准输入打开(如运行 bash)
-
--rm: 容器停止后自动删除(适合一次性任务)
-


容器已经存在(使用 docker start 运行)

docker start
用于启动已创建(处于 created****或 exited****状态)的容器的命令,可将停止的容器恢复运行,无需重新创建容器,适用于复用已有容器配置的场景。
docker start [OPTIONS] <容器ID/名称> [容器ID/名称...]
-
Options
-
-a/--attach: 附加到容器的标准输入 / 输出 / 错误流(类似前台运行,会显示容器日志)
-
-i/--interactive: 保持容器的标准输入打开(适合交互式容器)
-

docker logs
用于查看容器日志的命令,可获取容器内应用程序的输出信息(包括标准输出和标准错误),是排查容器运行问题、监控应用状态的核心工具。
docker logs [OPTIONS] <容器ID/名称>
-
Options
-
-f/--follow : 实时跟踪日志输出(类似 tail -f)
-
-t/--timestamps: 显示日志的时间戳
-
--tail <行数>: 仅显示最后 N 行日志(默认显示全部)
-
-n <行数> : 同 --tail,显示最后 N 行
-
--since <时间> : 显示指定时间之后的日志(如 --since "2025-12-01T10:00:00" 或 --since 1h)
-
--until <时间>: 显示指定时间之前的日志
-

如果我们让运行中的容器停止运行,日志会像这样出现 exit 信息:

docker attach
用于连接到正在运行的容器的标准输入 / 输出 / 错误流的命令,允许你直接与容器内的主进程(PID 1)交互,适用于查看容器实时输出或进行交互式操作。
docker attach [OPTIONS] <容器ID/名称>
-
Options
-
--no-stain: 不连接容器的标准输入(仅查看输出)
-
--sig-proxy: 代理所有接收到的信号到容器进程(默认开启,如按 Ctrl+C 会终止容器进程)
-

docker exec
用于在运行中的容器内执行命令的工具,可直接进入容器环境或执行一次性操作,是容器运维中常用的交互命令。
docker exec [OPTIONS] <容器ID/名称> <命令> [ARG...]
-
Options
-
-i/--interactive: 保持标准输入(STDIN)打开,允许交互
-
-t/--tty : 分配伪终端(PTY),通常与 -i 结合使用(-it)
-
-d/--detach: 后台执行命令(不进入容器)
-
-u/--user : 指定执行命令的用户(如 root、www-data)
-
--workdir: 指定命令执行的工作目录
-
当我们使用attach进入运行中的容器时,是无法直接使用bash或者sh的,如果我们想要进入容器内部终端,就需要使用exec,让容器可以像主机一样执行命令

同时我们可以直接在 docker exec 命令中对终端进行操作,比如添加一个文件,可以看到我们直接就让容器多出来了 test 文件

docker stop
用于停止运行中的容器 的命令,它会向容器的主进程(PID 1)发送 SIGTERM 信号(优雅终止信号),等待一段超时时间(默认 10 秒)后,若容器仍未停止,则发送 SIGKILL 信号强制终止容器。
# 可以一次停止多个容器
docker stop [OPTIONS] <容器ID/名称> [容器ID/名称...]
-
Options
-
-t/--time: 指定等待容器停止的超时时间(单位:秒),默认 10 秒。若超时未停止,强制终止。
-
-s/--signal: 指定停止容器时发送的信号(比如信号 9 是SIGKILL,强制停止容器,同docker kill)
-
我们可以通过日志来看一个容器的停止


如果我们使用 -s 9 呢?可以看到直接就退出了

docker wait
用于阻塞等待容器停止的命令,它会持续监听指定容器,直到容器退出并返回其退出码(Exit Code),适用于脚本中同步等待容器终止的场景。
docker wait <容器ID/名称> [容器ID/名称...]

输入 docker wait 命令之后,另外重启一个宿主机,然后输入 docker stop 命令让容器停止,输出退出码

docker start
用于启动已创建(处于 created****或 exited****状态)的容器的命令,可将停止的容器恢复运行,无需重新创建容器,适用于复用已有容器配置的场景。
# 可同时启动多个容器
docker start [OPTIONS] <容器ID/名称> [容器ID/名称...]
-
Options
-
-a/--attach: 附加到容器的标准输入 / 输出 / 错误流(类似前台运行,会显示容器日志)
-
-i/--interactive: 保持容器的标准输入打开(适合交互式容器)
-
如果我们只是用 docker start 命令是不会进入容器中的

需要结合对应options一起用

docker restart
用于重启运行中或已停止容器 的命令,相当于先执行 docker stop(优雅停止)再执行 docker start(启动容器),适用于需要重启容器以应用配置变更或恢复服务的场景。
# 可同时重启多个容器
docker restart [OPTIONS] <容器ID/名称> [容器ID/名称...]
-
Options
-
-t/--time: 指定等待容器停止的超时时间(单位:秒),默认 10 秒。若超时未停止,强制终止。
-
-s/--signal: 指定停止容器时发送的信号(比如信号 9 是SIGKILL,强制停止容器,同docker kill)
-


docker kill
用于强制终止运行中的容器 的命令,它会直接向容器的主进程发送 SIGKILL 信号(信号 9),立即终止容器,适用于容器无响应或需要快速停止的场景。
# 可以同时强制停止多个容器
docker kill [OPTIONS] <容器ID/名称> [容器ID/名称...]
-
Options
- -s/--signal : 指定发送的信号(默认 SIGKILL),如 SIGINT、SIGTERM 等
需要注意的是 docker kill 是不会优雅的关闭的


docker top
用于查看容器内运行的 进程 信息 的命令,类似 Linux 的 top 命令,但专门针对容器内的进程,可快速获取容器内进程的 PID、用户、CPU 占用等信息。
docker top <容器ID/名称> [ps选项]
其中 ps选项 是可选的,可传入 Linux ps 命令的参数(如 -aux、-ef 等),用于自定义输出格式。
默认输出字段:
-
UID:进程所属用户;
-
PID:容器内进程的 PID(宿主机视角的 PID);
-
PPID:父进程 PID;
-
C:CPU 占用率;
-
STIME:进程启动时间;
-
TTY:进程关联的终端;
-
TIME:进程占用的 CPU 时间;
-
CMD:进程启动命令。
首先容器要处于 running 状态

查看运行中的容器

添加命令

docker stats
用于实时监控容器资源使用情况的命令,可查看容器的 CPU、内存、网络 I/O、磁盘 I/O 等指标,是监控容器性能的核心工具。
docker stats [OPTIONS] [容器ID/名称...]
-
Options
-
-a/--all: 显示所有容器(包括已停止的,默认仅显示运行中)
-
--no-stream: 只输出一次统计结果(默认实时刷新)
-
--format : 自定义输出格式(如 --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}")
-
--no-trunc: 不截断输出内容(显示完整容器 ID 等)
-

如果没有任何options,我们可以看到他是实时更新的,不会自动退出

使用 -a 命令

docker container inspect
类似于 docker image inspect 命令,只不过是针对容器,用于查看容器(或镜像、网络等对象)的详细配置信息的命令,返回 JSON 格式的完整元数据,包括容器的网络配置、存储挂载、环境变量、资源限制等核心信息。
docker container inspect [OPTIONS] <容器ID/名称> [容器ID/名称...]
-
Options
-
-f/--format : 自定义输出格式(如 --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}")
-
-s/--size: 显示容器的磁盘使用情况(仅对容器有效)
-
--type : 指定对象类型(如 container、image,默认自动识别)
-


如果只使用 docker inspect 命令,会自动识别对象是镜像还是容器
docker port
用于查看容器 端口 映射关系的专用命令,可简洁地获取容器内端口映射到宿主机的具体端口,无需解析复杂的配置信息。
docker port <容器ID/名称> [容器端口]

查询指定窗口

docker cp
用于在 宿主机 和容器之间复制文件 / 目录的命令,支持双向复制(宿主机→容器、容器→宿主机),是容器与外部交换文件的常用工具。
# 宿主机 → 容器
docker cp [OPTIONS] <宿主机路径> <容器ID/名称>:<容器内路径>
# 容器 → 宿主机
docker cp [OPTIONS] <容器ID/名称>:<容器内路径> <宿主机路径>
-
Options
-
-a/--archive: 归档模式(保留文件权限、所有者、时间戳等属性)
-
-L/--follow-link: 跟随宿主机上的符号链接(复制链接指向的实际文件)
-
从 宿主机 复制到容器
先看看容器里面有哪些文件

在宿主机创建文件然后进行复制

可以看到容器中已经有了对应的文件

从容器复制到 宿主机

docker diff
用于查看容器文件系统变更的命令,可显示容器启动后相对于镜像的文件新增、修改或删除操作,帮助追踪容器内文件的变化。
docker diff <容器ID/名称>
输出结果的符号含义:
-
A: 文件 / 目录新增(Added
-
C: 文件 / 目录修改(Changed)
-
D: 文件 / 目录删除(Deleted)

docker pause
用于暂停运行中的容器 的命令,它会向容器内的所有进程发送 SIGSTOP 信号,暂停容器的所有进程执行(但容器仍处于 running 状态,只是进程暂停),可通过 docker unpause 恢复。
# 可以同时暂停多个容器
docker pause <容器ID/名称> [容器ID/名称...]

docker unpause
用于恢复被暂停( paused****状态)的容器 的命令,它会向容器内的所有进程发送 SIGCONT 信号,让容器从暂停状态恢复正常运行。
# 可以同时恢复多个容器
docker unpause <容器ID/名称> [容器ID/名称...]

docker rename
用于修改容器名称的命令,可对已创建(无论运行中或停止)的容器重命名,方便管理容器标识。
docker rename <原容器ID/名称> <新容器名称>

docker update
用于动态更新运行中或已停止容器的资源限制的命令,无需重启容器即可调整 CPU、内存、重启策略等配置,适用于动态优化容器资源分配的场景。
docker update [OPTIONS] <容器ID/名称> [容器ID/名称...]
-
options
-
--cpus: 设置容器可使用的 CPU 核心数(如 --cpus 0.5 限制为半核,--cpus 2 限制为 2 核)
-
--cpu-shares: 设置 CPU 共享权重(相对值,默认 1024,值越高优先级越高)
-
--memory/-m: 设置容器内存上限(如 --memory 512m、--memory 1g)
-
--memory-swap: 设置内存 + 交换分区上限(如 --memory-swap 1g)
-
--restart: 更新容器重启策略(可选:no、on-failure、always、unless-stopped)
-
docker commit
用于将容器的文件系统变更保存为新镜像的命令,可基于运行中的容器或已停止的容器创建自定义镜像,适用于快速封装容器状态为镜像的场景。
docker commit [OPTIONS] <容器ID/名称> [<仓库名>[:<标签>]]
-
options:
-
-m/--message: 添加提交说明(类似 Git 提交信息)
-
-a/--author: 指定作者信息(如 --author "Name email@example.com")
-
-c/--change: 应用 Dockerfile 指令(如 CMD、ENV,需配合 JSON 格式)
-
-p/--pause: 提交时暂停容器(默认 true,避免提交过程中文件变更)
-

镜像的命名需要全部为小写

docker export
用于将容器的文件系统导出为 tar 归档文件的命令,生成的归档包包含容器的完整文件系统快照(无镜像分层和元数据),适用于容器备份、跨平台迁移或制作基础镜像的场景。
# 导出容器到本地 tar 文件
docker export [OPTIONS] <容器ID/名称> > <输出文件.tar>
-
options
- -o/--output: 指定输出文件路径(替代管道重定向)

docker import
用于从本地文件系统的 tar 包或远程 URL 创建镜像 的命令,它基于文件系统快照导入镜像(区别于 docker load 导入镜像归档),适用于将系统备份或第三方文件系统打包为 Docker 镜像的场景。
# 从本地 tar 包导入
docker import [OPTIONS] <tar包路径/URL> [<仓库名>[:<标签>]]
# 从标准输入导入(如通过管道)
cat <tar包路径> | docker import - [<仓库名>[:<标签>]]
# 从远程服务器下载 tar 包并导入为镜像
# docker import https://example.com/backup.tar mybackup:latest
-
Options
-
-c/--change: 应用 Dockerfile 指令(如 CMD、ENV,格式同 docker commit)
-
-m/--message: 添加导入说明(类似提交信息)
-

docker container prune
用于自动清理所有已停止容器的命令,可快速释放宿主机磁盘空间,避免无用容器占用资源。
docker container prune [OPTIONS]
-
Options
-
-f/--force: 强制删除,无需确认(默认会提示是否删除)
-
--filter: 按条件过滤要删除的容器(如 until=24h 删除 24 小时前停止的容器)
-

常见问题
docker create、docker start 和 docker run 有什么区别?
docker create 命令从 Docker 映像创建一个全新的容器。但是,它不会立即运行它。 docker start 命令将启动任何已停止的容器。如果使用 docker create 命令创建容器, 则可以使用此命令启动它。
docker run 命令是创建和启动的组合,因为它创建了一个新容器并立即启动它。实际 上,如果 docker run 命令在您的系统上找不到上述映像,它可以从 Docker Hub 中提 取映像。
docker import 和 docker load 有什么区别?
-
docker save images_name:将一个镜像导出为文件,再使用 docker load 命 令将文件导入为一个镜像,会保存该镜像的的所有历史记录。比 docker export 命令 导出的文件大,很好理解,因为会保存镜像的所有历史记录。
-
docker export container_id:将一个容器导出为文件,再使用 docker import 命令将容器导入成为一个新的镜像,但是相比 docker save 命令,容器文件 会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。 既可以使用 docker load 命令来导入镜像库存储文件到本地镜像库,也可以使用 docker import 命令来导入一个容器快照到本地镜像库。
两者的区别在于容器快照将会丢弃所有的历史记录和元数据信息,而镜像存储文件将 保存完整记录,体积也会更大。
docker rm & docker rmi & docker prune 的差异?
docker rm : 删除一个或多个容器
docker rmi : 删除一个或多个镜像
docker prune: 用来删除不再使用的 docker 对象