ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

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

2026/8/17 21:41:59 拓冰建站 浏览量
《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-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 核心数例如--cpus1.5。--memory, -m 大小限制容器的最大内存使用量例如--memory512m。--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/echoHello world在使用 docker run 命令创建并启动容器时Docker 会在后台执行以下标准操作检查本地是否存在指定的镜像如果不存在则从公共仓库下载。基于镜像创建一个新容器并启动它。为容器分配一个文件系统在只读镜像层外添加一层可读写层。将宿主机的网桥接口桥接一个虚拟接口到容器内。从网桥的地址池中为容器配置一个 IP 地址。执行用户指定的应用程序。应用程序执行完成后容器将自动终止。下面的命令将启动一个 bash 终端允许用户在容器内进行交互dockerrun-it--rmubuntu:24.04 /bin/bash其中-t 选项让 Docker 分配一个伪终端 (pseudo-tty) 并将它绑定到容器的标准输入上-i 则让容器的标准输入保持打开状态–rm 让容器退出后自动删除容器一般跟随-it使用。更多的命令选项可以通过 man docker-run 命令查看。在交互模式下用户可以通过所创建的终端来输入命令例如pwdps用户可以按 CtrlD 键或输入 exit 命令来退出容器在用户使用 exit 命令退出bash进程之后容器也会自动退出。这是因为对于容器来说当其中的应用退出后容器的使命完成也就没有继续运行的必要了。exit可以使用 docker wait CONTAINER [CONTAINER…] 命令来等待容器退出并输出退出的错误码返回结果。某些时候因为 docker run 命令无法正常执行容器会出错直接退出此时可以查看退出的错误码。dockerwaitCONTAINER[CONTAINER...]# [CONTAINER...] 表示你可以同时指定多个容器。dockerwait容器id1 容器id2 容器id3125Docker daemon 执行出错例如指定了不支持的 Docker 命令参数。126所指定的命令无法执行例如权限出错。127容器内命令无法找到。4.1.4 守护态运行添加 -d 参数让 Docker 容器在后台以守护态 (Daemonized) 形式运行。dockerrun-dubuntu:24.04 /bin/sh-cwhile 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 命令来查看容器信息dockerpsdockercontainerls4.1.5 查看容器输出要获取容器的输出信息可以使用 docker logs 命令。支持的选项包括--details#输出详细信息-f或--follow#持续保持输出--sincestring#输出从某个时间开始的日志--tailstring#输出最近的若干日志-t或--timestamps#显示时间戳信息。--untilstring#输出某个时间之前的日志。例如查看某个容器的输出可以使用以下命令dockerlogs 容器id4.2 停止容器1.暂停容器可以使用 docker pause CONTAINER[CONTAINER…] 命令来暂停一个运行中的容器。例如启动一个容器并将其暂停对于处于 paused 状态的容器可以使用 docker unpause CONTAINER [CONTAINER…] 命令恢复到运行状态。# docker pause CONTAINER[CONTAINER...]# docker unpause CONTAINER [CONTAINER...]dockerps# 查看运行中容器dockerpause 容器iddockerpsdockerunpause 容器id2.终止容器可以使用 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 命令或 CtrlD 来退出终端时所创建的容器立刻终止处于 Stopped 状态。可以用 docker ps -qa 命令看到所有容器的 ID。例如dockerps-qa对于处于终止状态的容器可以通过 docker start 命令重新启动dockerstart 容器iddocker restart 命令会将一个运行态的容器先终止然后再重新启动dockerrestart 容器id4.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-stdintrue|false是否关闭标准输入默认保持打开。 --sig-proxytrue|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例如进入刚创建的容器中并启动一个 bashdockerexec-it容器id /bin/bash可以看到会打开一个新的 bash 终端在不影响容器内其他应用的前提下用户可以与容器进行交互。注意-it 参数会保持容器的标准输入打开状态并且为容器分配一个伪终端。开启终端后用户可以在容器中通过命令行进行操作例如查看容器中的用户和进程信息wps-ef4.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容器id4.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# 或dockerexport81b109769622ubuntu2026081702.tar2.导入容器导出的文件又可以通过 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 容器id2.查看容器内进程查看容器内进程可以使用 docker top CONTAINER [ps OPTIONS] 命令。这个命令类似于 Linux 系统中的 top 命令会输出容器内的进程信息包括 PID、用户、时间、命令等。例如查看容器内的进程信息命令如下用法:dockertopCONTAINER[ps OPTIONS]显示容器内正在运行的进程 别名:dockercontainer top,dockertopdockertop容器id3.查看统计信息查看统计信息可以使用 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 templatejson:PrintinJSONformatTEMPLATE: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 容器id4.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,dockerdiffdockerdiff容器id3.查看端口映射port 命令可以查看容器的端口映射情况命令格式为用法:dockerport CONTAINER[PRIVATE_PORT[/PROTO]]列出容器的端口映射或查看该容器的某个特定端口映射。 别名:dockercontainer port,dockerportdockerport 容器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 exits4.8 本章小结读者可以通过 docker container help 命令查看Docker支持的各种容器操作子命令。此外用户还可以 Kubernetes 等辅助工具来实现对容器的更高级管理以此避免故障造成的影响。