news 2026/8/17 21:41:48

《Docker技术入门与实战 第4版》阅读笔记 3

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《Docker技术入门与实战 第4版》阅读笔记 3

《Docker技术入门与实战 第4版》阅读笔记 3

第4章 操作 Docker 容器

容器是 Docker 的另一个核心概念。
容器和镜像的区别:容器可以被理解为镜像的一个运行实例。镜像是静态的只读文件,而容器则包含运行时所需的可写文件层,容器中的应用处于运行状态。
相较于虚拟机模拟一整套操作系统以及在操作系统上运行的应用,Docker 容器更像是一个独立运行的应用加所需的运行环境。

4.1 创建容器

4.1.1 新建容器

可以使用 docker create 命令新建一个容器,例如:

dockercreate-itubuntu:24.04dockerps-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-failurealwaysunless-stopped
--network <网络模式>指定容器使用的网络,如bridge(默认)、hostnone或自定义网络。
--mount type=<类型>,...更高级、更明确的挂载方式,支持bindvolumetmpfs等类型。
--env-file <文件路径>从一个文件中批量加载环境变量,适合管理大量配置。
--log-driver <驱动>指定容器的日志驱动,如json-filesyslognone等。
--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 命令,可以查看到一个运行中的容器:

dockerstart 容器iddockerps# 查看运行中的容器


4.1.3 新建并启动容器

docker run,等价于先执行 docker create 命令,再执行 docker start 命令。
例如,下面的命令,输出一个 “Hello World”​,之后容器自动终止,Docker 的性能体现在这与在本地直接执行 /bin/echo ‘hello world’ 一样快。

dockerrun ubuntu:24.04 /bin/echo'Hello world'

在使用 docker run 命令创建并启动容器时,Docker 会在后台执行以下标准操作:

  • 检查本地是否存在指定的镜像,如果不存在,则从公共仓库下载。
  • 基于镜像创建一个新容器,并启动它。
  • 为容器分配一个文件系统,在只读镜像层外添加一层可读写层。
  • 将宿主机的网桥接口桥接一个虚拟接口到容器内。
  • 从网桥的地址池中为容器配置一个 IP 地址。
  • 执行用户指定的应用程序。
  • 应用程序执行完成后,容器将自动终止。


下面的命令将启动一个 bash 终端,允许用户在容器内进行交互:

dockerrun-it--rmubuntu:24.04 /bin/bash

其中,
-t 选项让 Docker 分配一个伪终端 (pseudo-tty) 并将它绑定到容器的标准输入上,
-i 则让容器的标准输入保持打开状态,
–rm 让容器退出后自动删除容器,一般跟随-it使用。
更多的命令选项可以通过 man docker-run 命令查看。
在交互模式下,用户可以通过所创建的终端来输入命令,例如:

pwdps

用户可以按 Ctrl+D 键或输入 exit 命令来退出容器,在用户使用 exit 命令退出bash进程之后,容器也会自动退出。这是因为对于容器来说,当其中的应用退出后,容器的使命完成,也就没有继续运行的必要了。

exit


可以使用 docker wait CONTAINER [CONTAINER…] 命令来等待容器退出,并输出退出的错误码,返回结果。某些时候,因为 docker run 命令无法正常执行,容器会出错直接退出,此时可以查看退出的错误码。

dockerwaitCONTAINER[CONTAINER...]# [CONTAINER...] 表示你可以同时指定多个容器。dockerwait容器id1 容器id2 容器id3
  • 125:Docker daemon 执行出错,例如,指定了不支持的 Docker 命令参数。
  • 126:所指定的命令无法执行,例如权限出错。
  • 127:容器内命令无法找到。

4.1.4 守护态运行

添加 -d 参数让 Docker 容器在后台以守护态 (Daemonized) 形式运行。

dockerrun-dubuntu: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 命令来查看容器信息:

dockerpsdockercontainerls

4.1.5 查看容器输出

要获取容器的输出信息,可以使用 docker logs 命令。支持的选项包括:

--details#输出详细信息-f--follow#持续保持输出--sincestring#输出从某个时间开始的日志--tailstring#输出最近的若干日志-t--timestamps#显示时间戳信息。--untilstring#输出某个时间之前的日志。

例如,查看某个容器的输出,可以使用以下命令:

dockerlogs 容器id

4.2 停止容器

1.暂停容器

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

# docker pause CONTAINER[CONTAINER...]# docker unpause CONTAINER [CONTAINER...]dockerps# 查看运行中容器dockerpause 容器iddockerpsdockerunpause 容器id

2.终止容器

可以使用 docker stop 命令来终止一个运行中的容器。该命令的格式为 docker stop [OPTIONS] CONTAINER [CONTAINER…]。
该命令会首先向容器发送 SIGTERM 信号,等待一段时间(默认10s超时)后,再发送 SIGKILL 信号来终止容器:

# docker stop [OPTIONS] CONTAINER [CONTAINER...]dockerstop 容器id

此时,执行 docker container prune 命令,会自动清除所有处于停止状态的容器。还可以通过 docker kill 命令直接发送 SIGKILL 信号来强行终止容器。

dockercontainer prunedockerkill容器id

当 Docker 容器中指定的应用终结时,容器也会自动终止。例如,对于只启动了一个终端的容器,用户通过 exit 命令或 Ctrl+D 来退出终端时,所创建的容器立刻终止,处于 Stopped 状态。
可以用 docker ps -qa 命令看到所有容器的 ID。例如:

dockerps-qa

对于处于终止状态的容器,可以通过 docker start 命令重新启动:

dockerstart 容器id

docker restart 命令会将一个运行态的容器先终止,然后再重新启动:

dockerrestart 容器id


4.3 进入容器

在使用 -d 参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。这时如果需要进入容器进行操作,推荐使用官方的attach 或 exec 命令。

1.attach 命令

attach 是 Docker 自带的命令,命令格式为:

dockerattach[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 命令有时并不方便。当多个窗口同时进入同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令而发生阻塞时,其他窗口也无法执行操作了。

dockerrun-itdubuntu:24.04dockerpsdockerattach 容器id# 先按下 Ctrl + P 紧接着按下 Ctrl + Q 退出 attach 模式

2.exec 命令

从 Docker1.3.0 版本起,可以直接使用 exec 命令在运行中的容器内执行给定指令。该命令的基本格式为:

dockerexec[OPTIONS]CONTAINER COMMAND[ARG...]Options: -d,--detach在容器中的后台执行命令 --detach-keys string 指定将容器切回后台的按键 -e,--envlist 指定环境变量列表 --env-file list Readinafileof environment variables -i,--interactive打开标准输入接受用户输入命令,默认为false。--privileged是否给执行命令以高权限,默认为false。 -t,--tty分配伪终端,默认为false。 -u,--userstring 执行命令的用户名或ID -w,--workdirstring Working directory inside the container

例如,进入刚创建的容器中,并启动一个 bash:

dockerexec-it容器id /bin/bash

可以看到会打开一个新的 bash 终端,在不影响容器内其他应用的前提下,用户可以与容器进行交互。
注意,-it 参数会保持容器的标准输入打开状态,并且为容器分配一个伪终端。
开启终端后,用户可以在容器中通过命令行进行操作,例如查看容器中的用户和进程信息:

wps-ef

4.4 删除容器

可以使用 docker rm 命令来删除处于终止或退出状态的容器,命令格式为:

dockerrm[OPTIONS]CONTAINER[CONTAINER...]Options: -f,--force是否强行终止并删除一个运行中的容器 -l,--link删除容器的链接,但保留容器。 -v,--volumes删除容器挂载的数据卷

例如,查看容器并删除:

dockerps-adockerstop 容器iddockerrm容器id

默认情况下,docker rm 命令只能删除已经处于终止或退出状态的容器,并不能删除还处于运行状态的容器。如果要直接删除一个运行中的容器,可以添加 -f 参数。Docker 会先发送 SIGKILL 信号给容器,终止其中的应用,之后强行删除。

dockerrm-f容器id

4.5 导入和导出容器

在某些情况下,可能需要将容器从一个环境迁移到另一个环境。这时,可以利用 Docker 提供的导入 (import) 和导出 (export) 功能来实现。

1.导出容器

导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。可以使用 docker export 命令导出容器,该命令格式为:

用法:dockerexport[OPTIONS]CONTAINER 将容器的文件系统导出为一个tar压缩包(归档文件) 别名:dockercontainer export,dockerexport参数: -o,--outputstring 将内容写入文件,而不是输出到屏幕(标准输出)。

首先,查看所有容器,导出容器到文件,之后,可将导出的 tar 文件传输到其他机器上,然后再通过导入命令导入系统中,实现容器的迁移。

dockerps-adockerrun ubuntu:24.04dockerexport-oubuntu20260817.tar 81b109769622# 或dockerexport81b109769622>ubuntu2026081702.tar

2.导入容器

导出的文件又可以通过 docker import 命令导入变成镜像,该命令格式为:

用法:dockerimport[OPTIONS]file|URL|-[REPOSITORY[:TAG]]tar压缩包(tarball)中导入内容,以创建一个文件系统镜像。 别名:dockerimage import,dockerimportOptions: -c,--changelist 将 Dockerfile 中的指令应用到所创建的镜像上 -m,--messagestring 为导入的镜像设置提交信息(commit message)--platformstring 如果服务器支持多平台,则指定目标平台。

下面将导出的 tar 文件导入系统中:

dockerimportubuntu20260817.tar - test/ubuntu:v1.0


导出镜像然后导入镜像 与 导出容器然后导入镜像 的区别:
这两者之间的区别在于:容器快照文件会丢弃所有历史记录和元数据信息(仅保留当时的容器状态快照)​,而镜像存储文件会保存完整的记录,因此文件体积较大。另外,在从容器快照文件导入时,用户可以重新指定标签等元数据信息。

4.6 查看容器

1.查看容器详情

查看容器详情可以使用 docker inspect [OPTIONS] NAME|ID [NAME|ID…] 命令。例如,查看某容器的具体信息,会以JSON格式返回包括容器Id、创建时间、路径、状态、镜像、配置等在内的各项信息:

用法:dockerinspect[OPTIONS]NAME|ID[NAME|ID...]返回 Docker 对象的底层详细信息 Options: -f,--formatstring 使用自定义模板来格式化输出内容:'json':以 JSON 格式进行打印(输出)'TEMPLATE':使用指定的 Go 模板来打印输出内容 有关使用模板格式化输出的更多信息,请参阅 https://docs.docker.com/go/formatting/。 -s,--size如果对象类型是容器,则显示其总文件大小。--typestring 仅检查(或检视)指定类型的对象
dockerinspect 容器id

2.查看容器内进程

查看容器内进程可以使用 docker top CONTAINER [ps OPTIONS] 命令。这个命令类似于 Linux 系统中的 top 命令,会输出容器内的进程信息,包括 PID、用户、时间、命令等。例如,查看容器内的进程信息,命令如下:

用法:dockertopCONTAINER[ps OPTIONS]显示容器内正在运行的进程 别名:dockercontainer top,dockertop
dockertop容器id

3.查看统计信息

查看统计信息可以使用 docker stats [OPTIONS] [CONTAINER…] 命令,会显示 CPU、内存、存储器、网络等使用情况的统计信息。

用法:dockerstats[OPTIONS][CONTAINER...]实时显示容器的资源使用统计信息流 别名:dockercontainer stats,dockerstats 参数: -a,--all显示所有容器(默认情况下仅显示正在运行的容器)--formatstring 使用自定义模板来格式化输出内容:'table':Print outputintableformatwithcolumnheaders(default)'table TEMPLATE':Print outputintableformatusing the given Go template'json':PrintinJSONformat'TEMPLATE':Print output using the given Go template. Refer to https://docs.docker.com/go/formatting/formoreinformation about formatting output with templates --no-stream 关闭实时统计流,仅拉取(获取)一次结果。 --no-trunc 不要截断输出(显示完整内容)

例如,查看当前运行中容器的系统资源使用情况的统计信息:

dockerstats 容器id

4.7 其他容器命令

1.复制文件

cp 命令支持在容器和主机之间复制文件,命令格式为:

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

例如,将本地的路径 data 复制到容器的 /tmp 路径下:

dockercpdata 容器id:/tmp/



2.查看变更

diff 命令用于查看容器内文件系统的变更,命令格式为:

用法:dockerdiffCONTAINER 检查容器文件系统上文件或目录的变更 别名:dockercontainer diff,dockerdiff
dockerdiff容器id

3.查看端口映射

port 命令可以查看容器的端口映射情况,命令格式为:

用法:dockerport CONTAINER[PRIVATE_PORT[/PROTO]]列出容器的端口映射,或查看该容器的某个特定端口映射。 别名:dockercontainer port,dockerport
dockerport 容器id

目前暂时用不到,后面会演示这个命令。

4.更新配置

update 命令可以更新容器的一些运行时配置,主要是一些资源限制份额,命令格式为:

用法:dockerupdate[OPTIONS]CONTAINER[CONTAINER...]更新一个或多个容器的配置 别名:dockercontainer update,dockerupdate 参数: --blkio-weight uint16 Block IO(relative weight), between10and1000, or0to disable(default0)--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 periodinmicroseconds --cpu-rt-runtime int Limit the CPU real-time runtimeinmicroseconds -c, --cpu-shares int CPU shares(relative weight)--cpusdecimal Number of CPUs --cpuset-cpus string CPUsinwhichto allow execution(0-3,0,1)--cpuset-mems string MEMsinwhichto allow execution(0-3,0,1)-m,--memorybytes Memory limit --memory-reservation bytes Memory soft limit --memory-swap bytes Swap limit equal to memory plus swap:-1toenableunlimited swap --pids-limit int Tune container pids limit(set-1forunlimited)--restartstring Restart policy to apply when a container exits

4.8 本章小结

读者可以通过 docker container help 命令查看Docker支持的各种容器操作子命令。此外,用户还可以 Kubernetes 等辅助工具来实现对容器的更高级管理,以此避免故障造成的影响。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/17 21:40:02

Octolapse是什么?3D打印稳定化延时摄影插件完全指南

Octolapse是什么&#xff1f;3D打印稳定化延时摄影插件完全指南 【免费下载链接】Octolapse Stabilized timelapses for Octoprint 项目地址: https://gitcode.com/gh_mirrors/oc/Octolapse Octolapse 是一款专为 OctoPrint 打造的稳定化延时摄影插件&#xff0c;也是目…

作者头像 李华
网站建设 2026/8/17 21:38:56

5G NR下行链路波形生成技术解析与Matlab实现

1. 5G NR下行链路波形生成的核心价值 5G新空口&#xff08;NR&#xff09;的下行链路波形生成是物理层实现的关键环节&#xff0c;直接决定了系统吞吐量、覆盖范围和终端解调性能。与4G LTE采用的OFDM不同&#xff0c;5G NR引入了可参数化的灵活波形设计&#xff0c;支持多种子…

作者头像 李华
网站建设 2026/8/17 21:36:25

基于Qwen小模型的本地AI智能体部署与实战指南

最近在尝试将大语言模型&#xff08;LLM&#xff09;应用到本地业务场景时&#xff0c;发现一个明显的趋势&#xff1a;动辄数百亿参数的大模型虽然能力强大&#xff0c;但在实际部署中常常面临硬件成本高、推理延迟大、隐私安全难保障等挑战。与此同时&#xff0c;以通义千问&…

作者头像 李华