《Docker技术入门与实战 第4版》阅读笔记 3 Docker 容器
第4章 操作 Docker 容器
容器是 Docker 的另一个核心概念。
容器和镜像的区别:容器可以被理解为镜像的一个运行实例。镜像是静态的只读文件,而容器则包含运行时所需的可写文件层,容器中的应用处于运行状态。
相较于虚拟机模拟一整套操作系统以及在操作系统上运行的应用,Docker 容器更像是一个独立运行的应用加所需的运行环境。
4.1 创建容器
4.1.1 新建容器
可以使用 docker create 命令新建一个容器,例如:
docker create -it ubuntu:24.04
docker ps -a # 查看所有容器

当使用 docker create 命令创建新容器时,容器将处于停止状态。要启动容器,可以使用 docker start 命令。
由于容器是 Docker 技术栈的核心组成部分,create 以及后续的 run 命令都支持众多的命令选项,主要包括基本选项、高级选项,以及容器资源限制和安全保护相关选项。
基本选项
| 选项 | 说明 |
|---|---|
--name <容器名> | 为容器指定一个自定义名称,方便后续管理。 |
-d, --detach | 以后台模式(守护进程)运行容器,不占用当前终端。 |
-i, --interactive | 保持容器的标准输入(STDIN)打开,通常用于交互。 |
-t, --tty | 为容器分配一个伪终端,通常与 -i 结合使用(-it)。 |
--rm | 容器退出后自动删除该容器,适用于临时测试任务。 |
-p, --publish <主机端口>:<容器端口> | 将容器的端口映射到宿主机的指定端口。 |
-v, --volume <主机目录>:<容器目录> | 将宿主机的目录或命名卷挂载到容器内,实现数据持久化或共享。 |
-e, --env <变量名>=<值> | 在容器内设置环境变量,常用于传递配置信息。 |
高级选项
| 选项 | 说明 |
|---|---|
--restart <策略> | 设置容器的重启策略,如 no(默认)、on-failure、always、unless-stopped。 |
--network <网络模式> | 指定容器使用的网络,如 bridge(默认)、host、none 或自定义网络。 |
--mount type=<类型>,... | 更高级、更明确的挂载方式,支持 bind、volume、tmpfs 等类型。 |
--env-file <文件路径> | 从一个文件中批量加载环境变量,适合管理大量配置。 |
--log-driver <驱动> | 指定容器的日志驱动,如 json-file、syslog、none 等。 |
--health-cmd <命令> | 定义健康检查命令,Docker 会定期执行以判断容器是否健康。 |
--entrypoint <命令> | 覆盖镜像默认的入口点(Entrypoint)命令。 |
资源限制与安全保护选项
| 选项 | 说明 |
|---|---|
--cpus=<数量> | 限制容器可以使用的 CPU 核心数,例如 --cpus=1.5。 |
--memory, -m <大小> | 限制容器的最大内存使用量,例如 --memory=512m。 |
--memory-swap=<大小> | 限制容器的内存加 Swap 交换空间的总使用量。 |
--pids-limit=<数量> | 限制容器内可以运行的最大进程数,防止 fork 炸弹等恶意行为。 |
--user <用户名或UID> | 指定容器内进程运行的用户,避免使用默认的 root 用户。 |
--cap-add / --cap-drop | 添加或删除容器的 Linux 能力(Capabilities),精细化控制权限。 |
--security-opt <选项> | 设置安全选项,如配置 SELinux 或 AppArmor 策略。 |
--privileged | 赋予容器特权模式,使其几乎拥有与宿主机 root 相同的权限(慎用)。 |
4.1.2 启动容器
使用 docker start 命令来启动一个已经创建的容器。例如,启动刚创建的 Ubuntu 容器,此时,通过 docker ps 命令,可以查看到一个运行中的容器:
docker start 容器id
docker ps # 查看运行中的容器


4.1.3 新建并启动容器
docker run,等价于先执行 docker create 命令,再执行 docker start 命令。
例如,下面的命令,输出一个 “Hello World”,之后容器自动终止,Docker 的性能体现在这与在本地直接执行 /bin/echo ‘hello world’ 一样快。
docker run ubuntu:24.04 /bin/echo 'Hello world'
在使用 docker run 命令创建并启动容器时,Docker 会在后台执行以下标准操作:
- 检查本地是否存在指定的镜像,如果不存在,则从公共仓库下载。
- 基于镜像创建一个新容器,并启动它。
- 为容器分配一个文件系统,在只读镜像层外添加一层可读写层。
- 将宿主机的网桥接口桥接一个虚拟接口到容器内。
- 从网桥的地址池中为容器配置一个 IP 地址。
- 执行用户指定的应用程序。
- 应用程序执行完成后,容器将自动终止。

下面的命令将启动一个 bash 终端,允许用户在容器内进行交互:
docker run -it --rm ubuntu:24.04 /bin/bash
其中,
-t 选项让 Docker 分配一个伪终端 (pseudo-tty) 并将它绑定到容器的标准输入上,
-i 则让容器的标准输入保持打开状态,
–rm 让容器退出后自动删除容器,一般跟随-it使用。
更多的命令选项可以通过 man docker-run 命令查看。
在交互模式下,用户可以通过所创建的终端来输入命令,例如:
pwd
ps
用户可以按 Ctrl+D 键或输入 exit 命令来退出容器,在用户使用 exit 命令退出bash进程之后,容器也会自动退出。这是因为对于容器来说,当其中的应用退出后,容器的使命完成,也就没有继续运行的必要了。
exit

可以使用 docker wait CONTAINER [CONTAINER…] 命令来等待容器退出,并输出退出的错误码,返回结果。某些时候,因为 docker run 命令无法正常执行,容器会出错直接退出,此时可以查看退出的错误码。
docker wait CONTAINER [CONTAINER...]
# [CONTAINER...] 表示你可以同时指定多个容器。
docker wait 容器id1 容器id2 容器id3
- 125:Docker daemon 执行出错,例如,指定了不支持的 Docker 命令参数。
- 126:所指定的命令无法执行,例如权限出错。
- 127:容器内命令无法找到。

4.1.4 守护态运行
添加 -d 参数让 Docker 容器在后台以守护态 (Daemonized) 形式运行。
docker run -d ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
# "while true; do echo hello world; sleep 1; done"
# 这是一个非常经典的 Bash 无限循环脚本,通常用来让容器保持运行状态,或者作为简单的测试任务。
# 这个脚本会每隔 1 秒钟,在终端打印一次 hello world,并且永远不会停止,直到你手动按下 Ctrl + C 强制中断它。
容器启动后会返回一个唯一的id,也可以通过 docker ps 或 docker container ls 命令来查看容器信息:
docker ps
docker container ls

4.1.5 查看容器输出
要获取容器的输出信息,可以使用 docker logs 命令。支持的选项包括:
--details #输出详细信息
-f 或 --follow #持续保持输出
--since string #输出从某个时间开始的日志
--tail string #输出最近的若干日志
-t 或 --timestamps #显示时间戳信息。
--until string #输出某个时间之前的日志。
例如,查看某个容器的输出,可以使用以下命令:
docker logs 容器id

4.2 停止容器
1.暂停容器
可以使用 docker pause CONTAINER[CONTAINER…] 命令来暂停一个运行中的容器。例如,启动一个容器,并将其暂停,对于处于 paused 状态的容器,可以使用 docker unpause CONTAINER [CONTAINER…] 命令恢复到运行状态。
# docker pause CONTAINER[CONTAINER...]
# docker unpause CONTAINER [CONTAINER...]
docker ps # 查看运行中容器
docker pause 容器id
docker ps
docker unpause 容器id

2.终止容器
可以使用 docker stop 命令来终止一个运行中的容器。该命令的格式为 docker stop [OPTIONS] CONTAINER [CONTAINER…]。
该命令会首先向容器发送 SIGTERM 信号,等待一段时间(默认10s超时)后,再发送 SIGKILL 信号来终止容器:
# docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker stop 容器id
此时,执行 docker container prune 命令,会自动清除所有处于停止状态的容器。还可以通过 docker kill 命令直接发送 SIGKILL 信号来强行终止容器。
docker container prune
docker kill 容器id
当 Docker 容器中指定的应用终结时,容器也会自动终止。例如,对于只启动了一个终端的容器,用户通过 exit 命令或 Ctrl+D 来退出终端时,所创建的容器立刻终止,处于 Stopped 状态。
可以用 docker ps -qa 命令看到所有容器的 ID。例如:
docker ps -qa
对于处于终止状态的容器,可以通过 docker start 命令重新启动:
docker start 容器id
docker restart 命令会将一个运行态的容器先终止,然后再重新启动:
docker restart 容器id


4.3 进入容器
在使用 -d 参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。这时如果需要进入容器进行操作,推荐使用官方的attach 或 exec 命令。
1.attach 命令
attach 是 Docker 自带的命令,命令格式为:
docker attach [OPTIONS] CONTAINER
Options:
--detach-keys string 指定退出attach模式的快捷键序列,默认是先按下 Ctrl + P 紧接着按下 Ctrl + Q。如果你直接输入 exit、按 Ctrl + C 或 Ctrl + D,这些操作会向容器的主进程发送终止信号,导致整个容器停止运行。
--no-stdin=true|false 是否关闭标准输入,默认保持打开。
--sig-proxy=true|false 是否将容器收到的系统信号代理(转发)给应用进程,默认为true。
下面的示例演示了如何使用该命令:
然而使用 attach 命令有时并不方便。当多个窗口同时进入同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令而发生阻塞时,其他窗口也无法执行操作了。
docker run -itd ubuntu:24.04
docker ps
docker attach 容器id
# 先按下 Ctrl + P 紧接着按下 Ctrl + Q 退出 attach 模式

2.exec 命令
从 Docker1.3.0 版本起,可以直接使用 exec 命令在运行中的容器内执行给定指令。该命令的基本格式为:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Options:
-d, --detach 在容器中的后台执行命令
--detach-keys string 指定将容器切回后台的按键
-e, --env list 指定环境变量列表
--env-file list Read in a file of environment variables
-i, --interactive 打开标准输入接受用户输入命令,默认为false。
--privileged 是否给执行命令以高权限,默认为false。
-t, --tty 分配伪终端,默认为false。
-u, --user string 执行命令的用户名或ID
-w, --workdir string Working directory inside the container
例如,进入刚创建的容器中,并启动一个 bash:
docker exec -it 容器id /bin/bash
可以看到会打开一个新的 bash 终端,在不影响容器内其他应用的前提下,用户可以与容器进行交互。
注意,-it 参数会保持容器的标准输入打开状态,并且为容器分配一个伪终端。
开启终端后,用户可以在容器中通过命令行进行操作,例如查看容器中的用户和进程信息:
w
ps -ef

4.4 删除容器
可以使用 docker rm 命令来删除处于终止或退出状态的容器,命令格式为:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
Options:
-f, --force 是否强行终止并删除一个运行中的容器
-l, --link 删除容器的链接,但保留容器。
-v, --volumes 删除容器挂载的数据卷
例如,查看容器并删除:
docker ps -a
docker stop 容器id
docker rm 容器id
默认情况下,docker rm 命令只能删除已经处于终止或退出状态的容器,并不能删除还处于运行状态的容器。如果要直接删除一个运行中的容器,可以添加 -f 参数。Docker 会先发送 SIGKILL 信号给容器,终止其中的应用,之后强行删除。
docker rm -f 容器id

4.5 导入和导出容器
在某些情况下,可能需要将容器从一个环境迁移到另一个环境。这时,可以利用 Docker 提供的导入 (import) 和导出 (export) 功能来实现。
1.导出容器
导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。可以使用 docker export 命令导出容器,该命令格式为:
用法: docker export [OPTIONS] CONTAINER
将容器的文件系统导出为一个 tar 压缩包(归档文件)
别名:
docker container export, docker export
参数:
-o, --output string 将内容写入文件,而不是输出到屏幕(标准输出)。
首先,查看所有容器,导出容器到文件,之后,可将导出的 tar 文件传输到其他机器上,然后再通过导入命令导入系统中,实现容器的迁移。
docker ps -a
docker run ubuntu:24.04
docker export -o ubuntu20260817.tar 81b109769622
# 或
docker export 81b109769622 > ubuntu2026081702.tar

2.导入容器
导出的文件又可以通过 docker import 命令导入变成镜像,该命令格式为:
用法: docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
从 tar 压缩包(tarball)中导入内容,以创建一个文件系统镜像。
别名:
docker image import, docker import
Options:
-c, --change list 将 Dockerfile 中的指令应用到所创建的镜像上
-m, --message string 为导入的镜像设置提交信息(commit message)
--platform string 如果服务器支持多平台,则指定目标平台。
下面将导出的 tar 文件导入系统中:
docker import ubuntu20260817.tar - test/ubuntu:v1.0

导出镜像然后导入镜像 与 导出容器然后导入镜像 的区别:
这两者之间的区别在于:容器快照文件会丢弃所有历史记录和元数据信息(仅保留当时的容器状态快照),而镜像存储文件会保存完整的记录,因此文件体积较大。另外,在从容器快照文件导入时,用户可以重新指定标签等元数据信息。
4.6 查看容器
1.查看容器详情
查看容器详情可以使用 docker inspect [OPTIONS] NAME|ID [NAME|ID…] 命令。例如,查看某容器的具体信息,会以JSON格式返回包括容器Id、创建时间、路径、状态、镜像、配置等在内的各项信息:
用法: docker inspect [OPTIONS] NAME|ID [NAME|ID...]
返回 Docker 对象的底层详细信息
Options:
-f, --format string 使用自定义模板来格式化输出内容:
'json': 以 JSON 格式进行打印(输出)
'TEMPLATE': 使用指定的 Go 模板来打印输出内容
有关使用模板格式化输出的更多信息,请参阅 https://docs.docker.com/go/formatting/。
-s, --size 如果对象类型是容器,则显示其总文件大小。
--type string 仅检查(或检视)指定类型的对象
docker inspect 容器id

2.查看容器内进程
查看容器内进程可以使用 docker top CONTAINER [ps OPTIONS] 命令。这个命令类似于 Linux 系统中的 top 命令,会输出容器内的进程信息,包括 PID、用户、时间、命令等。例如,查看容器内的进程信息,命令如下:
用法: docker top CONTAINER [ps OPTIONS]
显示容器内正在运行的进程
别名:
docker container top, docker top
docker top 容器id

3.查看统计信息
查看统计信息可以使用 docker stats [OPTIONS] [CONTAINER…] 命令,会显示 CPU、内存、存储器、网络等使用情况的统计信息。
用法: docker stats [OPTIONS] [CONTAINER...]
实时显示容器的资源使用统计信息流
别名:
docker container stats, docker stats
参数:
-a, --all 显示所有容器(默认情况下仅显示正在运行的容器)
--format string 使用自定义模板来格式化输出内容:
'table': Print output in table format with column headers (default)
'table TEMPLATE': Print output in table format using the given Go template
'json': Print in JSON format
'TEMPLATE': Print output using the given Go template.
Refer to https://docs.docker.com/go/formatting/ for more information about formatting output with templates
--no-stream 关闭实时统计流,仅拉取(获取)一次结果。
--no-trunc 不要截断输出(显示完整内容)
例如,查看当前运行中容器的系统资源使用情况的统计信息:
docker stats 容器id

4.7 其他容器命令
1.复制文件
cp 命令支持在容器和主机之间复制文件,命令格式为:
用法: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
在容器和本地文件系统之间复制文件或文件夹
使用 - 作为源路径,可以从标准输入(stdin)读取一个 tar 压缩包,并将其解压到容器内的指定目录。
使用 - 作为目标路径,可以将容器内指定源路径的内容打包成 tar 压缩包,并输出到标准输出(stdout)。
别名:
docker container cp, docker cp
参数:
-a, --archive 归档模式(复制所有的 UID/GID 信息)
-L, --follow-link 始终跟随源路径(SRC_PATH)中的符号链接
-q, --quiet 在复制过程中抑制(隐藏)进度输出。如果未连接终端,进度输出会自动被抑制。
例如,将本地的路径 data 复制到容器的 /tmp 路径下:
docker cp data 容器id:/tmp/



2.查看变更
diff 命令用于查看容器内文件系统的变更,命令格式为:
用法: docker diff CONTAINER
检查容器文件系统上文件或目录的变更
别名:
docker container diff, docker diff
docker diff 容器id

3.查看端口映射
port 命令可以查看容器的端口映射情况,命令格式为:
用法: docker port CONTAINER [PRIVATE_PORT[/PROTO]]
列出容器的端口映射,或查看该容器的某个特定端口映射。
别名:
docker container port, docker port
docker port 容器id
目前暂时用不到,后面会演示这个命令。
4.更新配置
update 命令可以更新容器的一些运行时配置,主要是一些资源限制份额,命令格式为:
用法: docker update [OPTIONS] CONTAINER [CONTAINER...]
更新一个或多个容器的配置
别名:
docker container update, docker update
参数:
--blkio-weight uint16 Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
--cpu-period int Limit CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota
--cpu-rt-period int Limit the CPU real-time period in microseconds
--cpu-rt-runtime int Limit the CPU real-time runtime in microseconds
-c, --cpu-shares int CPU shares (relative weight)
--cpus decimal Number of CPUs
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
-m, --memory bytes Memory limit
--memory-reservation bytes Memory soft limit
--memory-swap bytes Swap limit equal to memory plus swap: -1 to enable unlimited swap
--pids-limit int Tune container pids limit (set -1 for unlimited)
--restart string Restart policy to apply when a container exits
4.8 本章小结
读者可以通过 docker container help 命令查看Docker支持的各种容器操作子命令。此外,用户还可以 Kubernetes 等辅助工具来实现对容器的更高级管理,以此避免故障造成的影响。

247

被折叠的 条评论
为什么被折叠?



