概念

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: 指定执行命令的用户(如 rootwww-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),如 SIGINTSIGTERM

需要注意的是 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: 指定对象类型(如 containerimage,默认自动识别)

如果只使用 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: 更新容器重启策略(可选:noon-failurealwaysunless-stopped

docker commit

用于将容器的文件系统变更保存为新镜像的命令,可基于运行中的容器或已停止的容器创建自定义镜像,适用于快速封装容器状态为镜像的场景。

docker commit [OPTIONS] <容器ID/名称> [<仓库名>[:<标签>]]
  • options:

    • -m/--message: 添加提交说明(类似 Git 提交信息)

    • -a/--author: 指定作者信息(如 --author "Name <email@example.com>"

    • -c/--change: 应用 Dockerfile 指令(如 CMDENV,需配合 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 指令(如 CMDENV,格式同 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 对象

更多推荐