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

《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-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 命令,可以查看到一个运行中的容器:

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 等辅助工具来实现对容器的更高级管理,以此避免故障造成的影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值