docker容器-命令

概念

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 对象

相关推荐
幸运小猿1 小时前
启动项目报错,zookeeper影响的
linux·运维·服务器
liu****1 小时前
11.字符函数和字符串函数(一)
linux·运维·c语言·开发语言·数据结构·算法
honsor1 小时前
一种采用POE供电的RJ45网络型温湿度传感器
运维·服务器·网络
零匠学堂20251 小时前
woapi-server为Office Online Server文档在线预览提供文档加载地址
java·运维·服务器·oos·wopi
菜萝卜子1 小时前
k8s 本地动态存储 Local Path Provisioner 部署
容器·kubernetes
minji...1 小时前
linux 进程控制(一) (fork进程创建,exit进程终止)
linux·运维·服务器·c++·git·算法
wanhengidc1 小时前
巨 椰 云手机功能丰富 高性价比
运维·服务器·科技·智能手机·云计算
I · T · LUCKYBOOM1 小时前
21.Linux网络设置
linux·运维·网络
❀͜͡傀儡师1 小时前
使用Docker部署DashDot服务器仪表盘和Drupal
服务器·docker·容器