Docker 容器技术入门与实践 (一):命令与镜像、容器管理

张开发
2026/5/31 11:29:18 15 分钟阅读
Docker 容器技术入门与实践 (一):命令与镜像、容器管理
命令与镜像、容器管理详解前言Docker 作为当前主流的容器化技术极大地简化了应用程序的开发、部署和运维流程。对于初学者而言掌握 Docker 的核心概念和常用命令是入门的关键。本指南将聚焦于 Docker 中最基础也最重要的两个对象镜像Image和容器Container并详细介绍在 OpenEuler 操作系统下管理它们所需的命令。核心概念镜像 (Image)定义镜像是一个只读的模板包含了运行容器所需的所有文件和依赖项如代码、运行时环境、库、环境变量、配置文件等。你可以将其理解为一个应用程序及其运行环境的打包快照。特点分层存储Layer只读性。多个镜像可以共享相同的底层基础层提高存储效率。镜像是创建容器的基石。容器 (Container)定义容器是镜像的一个运行实例。当你启动一个容器时Docker 会在镜像的只读层之上创建一个可写的容器层。容器是实际运行应用程序的进程或一组进程。特点轻量级、可读写层、相互隔离进程、网络、文件系统等、资源限制、生命周期管理创建、启动、停止、删除。容器运行在宿主机的内核上但拥有自己独立的用户空间。环境准备 (OpenEuler)在开始使用 Docker 命令之前请确保你的 OpenEuler 系统已正确安装并启用了 Docker 引擎。通常可以通过以下命令安装sudo yum install docker-engine sudo systemctl start docker sudo systemctl enable docker验证安装docker version或docker info。第一部分Docker 镜像管理命令详解镜像是容器运行的基础。管理好镜像是高效使用 Docker 的前提。docker images功能列出本地主机上存储的所有 Docker 镜像。常用选项-a, --all: 显示所有镜像包括中间层镜像默认不显示。--digests: 显示镜像的摘要信息Digest。-q, --quiet: 仅显示镜像 ID。--filter: 根据条件过滤镜像如danglingtrue显示悬虚镜像。示例docker images # 列出所有顶层镜像 docker images -a # 列出所有镜像包括中间层 docker images --filter danglingtrue # 列出悬虚镜像 docker images -q # 只显示镜像ID输出解析REPOSITORY: 镜像仓库来源如nginx,ubuntu。TAG: 镜像标签如latest,18.04用于标识同一仓库中不同版本的镜像。IMAGE ID: 镜像的唯一标识符哈希值。CREATED: 镜像创建时间。SIZE: 镜像大小注意是压缩后在仓库中的大小解压后运行时会更大。docker search功能在 Docker Hub或其他配置的镜像仓库上搜索公共镜像。常用选项--limit: 限制返回结果的数量。--filter: 过滤搜索结果如is-officialtrue只显示官方镜像。示例docker search nginx # 搜索包含 nginx 关键字的镜像 docker search --limit 5 mysql # 搜索包含 mysql 的镜像只显示前5个 docker search --filter is-officialtrue python # 搜索官方的 Python 镜像输出解析NAME: 镜像仓库名。DESCRIPTION: 镜像描述。STARS: 镜像的星标数受欢迎程度。OFFICIAL: 是否为官方镜像 ([OK])。AUTOMATED: 是否由 Docker Hub 自动构建 ([OK])。docker pull功能从配置的镜像仓库默认 Docker Hub下载拉取指定的镜像到本地。格式docker pull [OPTIONS] NAME[:TAG|DIGEST]说明如果不指定TAG或DIGEST默认拉取latest标签的镜像。强烈建议始终指定明确的标签如ubuntu:20.04而非依赖latest以保证环境一致性。示例docker pull nginx # 拉取 nginx:latest docker pull ubuntu:20.04 # 拉取 Ubuntu 20.04 镜像 docker pull myprivate.registry.com/app:1.0 # 从私有仓库拉取镜像docker push功能将本地的镜像上传到配置的镜像仓库如 Docker Hub、私有仓库。前提镜像必须已经docker tag过其名称符合目标仓库的命名规范通常是[registry_url]/[username]/repository:tag。你需要有该仓库的写入权限通常需要先docker login。格式docker push [OPTIONS] NAME[:TAG]示例docker tag myapp:1.0 myusername/myapp:1.0 # 先打标签 docker push myusername/myapp:1.0 # 推送到 Docker Hub docker push myprivate.registry.com/team/app:release # 推送到私有仓库docker build功能根据一个Dockerfile文件中的指令自动构建一个新的镜像。核心选项-t, --tag: 为构建成功的镜像指定一个名称和标签格式name:tag。可以多次使用-t为一个镜像设置多个标签。-f, --file: 指定要使用的Dockerfile路径默认为当前目录下的Dockerfile。格式docker build [OPTIONS] PATH | URL | -说明PATH是包含Dockerfile的目录路径称为构建上下文。构建过程中该目录下的所有文件除.dockerignore指定的外都会被发送给 Docker 守护进程。示例docker build -t mywebapp:1.0 . # 使用当前目录下的 Dockerfile 构建并打标签 docker build -t myapp:latest -t myapp:stable . # 打多个标签 docker build -f /path/to/Dockerfile -t customimage . # 指定 Dockerfile 路径docker tag功能为本地已有的镜像创建一个新的标签引用。常用于在推送镜像到仓库前设置符合仓库规范的名称或者为镜像创建别名如latest,v1。格式docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]示例docker tag myapp:1.0 myapp:latest # 为 myapp:1.0 创建别名 latest docker tag localimage:dev myusername/repo:production # 准备推送镜像到仓库docker rmi功能删除一个或多个本地镜像。常用选项-f, --force: 强制删除如删除被标记或被容器引用的镜像。格式docker rmi [OPTIONS] IMAGE [IMAGE...]说明如果镜像有多个标签rmi只会删除指定的标签。只有当该镜像没有任何标签时才会真正删除镜像数据层。如果镜像被容器即使已停止引用需要先删除容器或使用-f强制删除不推荐在生产环境强制删除被引用的镜像。示例docker rmi ubuntu:18.04 # 删除 ubuntu:18.04 镜像 docker rmi myapp:oldtag # 删除特定标签 docker rmi $(docker images -q) # 删除所有镜像危险慎用docker inspect(镜像)功能获取 Docker 镜像的详细信息元数据以 JSON 格式输出。输出内容包含镜像的 ID、创建时间、父镜像 ID、作者、架构、操作系统、配置如入口点、命令、环境变量、卷、暴露端口、层信息等。格式docker inspect [OPTIONS] IMAGE [IMAGE...]示例docker inspect nginx:latest # 查看 nginx 镜像的详细信息 docker inspect --format {{.Id}} ubuntu:20.04 # 仅提取镜像完整IDdocker history功能显示镜像的构建历史记录即组成该镜像的每一层Layer及其对应的Dockerfile指令。输出包括层 ID、创建时间、创建指令 (CREATED BY)、大小。格式docker history [OPTIONS] IMAGE示例docker history myapp:built # 查看自己构建的镜像历史 docker history --no-trunc nginx # 显示完整的创建指令不截断docker save功能将一个或多个镜像保存到一个归档文件通常是.tar格式。用于备份镜像或迁移到其他未联网的 Docker 主机。常用选项-o, --output: 指定输出归档文件的路径和名称。格式docker save [OPTIONS] IMAGE [IMAGE...]示例docker save -o nginx.tar nginx:latest # 保存 nginx:latest 到 nginx.tar docker save -o allimages.tar image1 image2 # 保存多个镜像到一个文件 docker save nginx:latest nginx.tar # 使用重定向 (功能同 -o)docker load功能从归档文件通常由docker save生成中加载一个或多个镜像到本地镜像仓库。常用选项-i, --input: 指定要加载的归档文件路径。-q, --quiet: 静默模式仅输出镜像名称。格式docker load [OPTIONS]示例docker load -i nginx.tar # 从 nginx.tar 加载镜像 docker load allimages.tar # 使用重定向加载docker commit功能将一个运行中或已停止的容器的当前状态主要是可写层的变化提交为一个新的镜像。这相当于手动创建镜像通常用于调试或保存临时修改不推荐作为构建镜像的常规方式应使用Dockerfile。常用选项-a, --author: 指定镜像作者。-c, --change: 使用 Dockerfile 指令修改提交的镜像如CMD,ENV。-m, --message: 提交信息。格式docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]示例docker commit -m Added config mycontainer mynewimage:temp # 将容器状态保存为新镜像docker import功能从tar归档文件通常包含一个文件系统创建一个新的镜像。这个归档文件可以是docker export导出的容器文件系统也可以是一个操作系统根文件系统的tar包。与docker load区别docker load加载的是由docker save保存的完整镜像包含历史层和元数据。docker import导入的是一个扁平化的文件系统tar包会丢弃所有历史记录和元数据生成一个新的单层镜像。格式docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]示例docker import ubuntu-rootfs.tar myubuntu:custom # 从 rootfs 包创建镜像 cat container.tar | docker import - mycontainer:snapshot # 通过管道导入第二部分Docker 容器管理命令详解容器是镜像的运行实例。管理容器的生命周期是日常工作的核心。docker run功能最核心命令之一。基于指定镜像创建并启动一个新的容器。极其常用且重要的选项选项 (短/长)说明-d,--detach在后台运行容器并打印容器 ID。--name为容器指定一个自定义名称否则 Docker 会随机生成。-p,--publish将容器的端口映射到宿主机的端口格式[host_ip:]host_port:container_port。允许多个-p。-v,--volume将宿主机的目录或文件绑定挂载Bind Mount到容器内格式[host_src:]container_dest[:options]。允许多个-v。--mount更强大的挂载选项支持 Volume, Bind Mount, tmpfs语法更复杂。-e,--env设置容器内的环境变量格式VARvalue。允许多个-e。--env-file从文件读取环境变量设置文件每行VARvalue。-it-i(保持 STDIN 打开) 和-t(分配伪终端) 的组合常用于运行交互式容器如/bin/bash。--restart设置容器的重启策略no,on-failure[:max-retries],always,unless-stopped。--rm容器退出时自动删除容器不能与-d同时使用。--network指定容器使用的网络如bridge,host,none, 或自定义网络名。--link已过时建议使用自定义网络链接到另一个容器。-c,--cpu-sharesCPU 共享权重相对值。-m,--memory内存限制如512m,2g。格式docker run [OPTIONS] IMAGE [COMMAND] [ARG...]说明如果IMAGE在本地不存在Docker 会先尝试docker pull。COMMAND和ARG会覆盖Dockerfile中的CMD指令。示例docker run -d --name mynginx -p 8080:80 nginx # 后台运行 nginx命名端口映射 docker run -it --rm ubuntu:20.04 /bin/bash # 运行交互式 bash退出后删除容器 docker run -v /host/data:/container/data myapp # 挂载宿主机目录到容器 docker run -e ENV_VARvalue myapp # 设置环境变量 docker run --restartalways myapp # 设置容器总是重启docker create功能基于镜像创建一个新的容器但不会自动启动它。容器默认处于created状态。选项与docker run的大部分选项相同如--name,-p,-v,-e,--network等但没有-d,-it,--rm等与运行相关的选项。格式docker create [OPTIONS] IMAGE [COMMAND] [ARG...]示例docker create --name mycreatedcontainer nginx # 创建名为 mycreatedcontainer 的 nginx 容器用途通常用于在启动前对容器进行更复杂的配置或者配合docker start使用。docker start功能启动一个或多个处于停止 (exited) 或创建 (created) 状态的容器。常用选项-a, --attach: 附加到容器的 STDIN、STDOUT 和 STDERR。-i, --interactive: 附加到容器的 STDIN通常与-a一起使用。格式docker start [OPTIONS] CONTAINER [CONTAINER...]示例docker start mycreatedcontainer # 启动之前创建的容器 docker start stopped_container # 启动已停止的容器 docker start -a mycontainer # 启动并附加到输出docker stop功能停止一个或多个正在运行的容器。默认情况下Docker 会先发送 SIGTERM 信号如果在超时期限默认 10 秒内容器未停止则发送 SIGKILL 信号。常用选项-t, --time: 指定停止超时时间秒。格式docker stop [OPTIONS] CONTAINER [CONTAINER...]示例docker stop mynginx # 停止 mynginx 容器 docker stop -t 5 container1 container2 # 停止两个容器超时 5 秒docker restart功能重启一个或多个容器无论当前是运行中还是已停止状态。如果容器已停止docker restart会先启动它。过程等同于先docker stop再docker start。常用选项同docker stop(-t)。格式docker restart [OPTIONS] CONTAINER [CONTAINER...]示例docker restart mynginx # 重启 mynginx 容器docker kill功能强制杀死发送 SIGKILL 信号一个或多个正在运行的容器。这是一种更直接、更暴力的停止方式不会给容器清理的机会。常用选项-s, --signal: 指定发送的信号如SIGINT,SIGHUP默认为SIGKILL。格式docker kill [OPTIONS] CONTAINER [CONTAINER...]示例docker kill unresponsive_container # 杀死无响应的容器 docker kill -s SIGTERM container_id # 发送 SIGTERM 信号docker rm功能删除一个或多个容器必须是停止状态除非使用-f。常用选项-f, --force: 强制删除正在运行的容器会先发送 SIGKILL。-v, --volumes: 删除与容器关联的匿名卷由Dockerfile中的VOLUME指令创建。格式docker rm [OPTIONS] CONTAINER [CONTAINER...]示例docker rm stopped_container # 删除已停止的容器 docker rm -f running_container # 强制删除运行中的容器 docker rm -v container_with_volume # 删除容器及其匿名卷 docker rm $(docker ps -aq) # 删除所有容器危险慎用docker ps功能最常用命令之一。列出当前正在运行的容器。常用选项选项描述补充说明-a,--all显示所有容器包括停止的-q,--quiet仅显示容器 ID适合脚本处理场景-s,--size显示容器大小文件系统使用量--filter根据条件过滤容器支持statusrunning、nameweb*、ancestornginx等条件--format使用 Go 模板格式化输出如--format {{.ID}}: {{.Names}}-n,--last显示最近创建的 n 个容器包括所有状态如-n 3显示最近 3 个容器-l,--latest显示最近创建的容器包括所有状态等价于--last 1格式docker ps [OPTIONS]示例docker ps # 列出正在运行的容器 docker ps -a # 列出所有容器 docker ps -q # 列出所有运行中容器的ID docker ps -a -q # 列出所有容器包括停止的的ID docker ps --filter statusexited # 列出已退出的容器 docker ps --filter namemy* # 列出名称以 my 开头的容器 docker ps --format table {{.ID}}\t{{.Names}}\t{{.Status}} # 自定义格式输出输出解析 (docker ps -a)字段名描述CONTAINER ID容器的唯一短 ID。IMAGE容器基于的镜像。COMMAND容器启动时运行的命令。CREATED容器创建时间。STATUS容器状态例如Up [time] 表示运行中Exited ([code]) [time ago] 表示已退出Created 表示已创建未启动。PORTS端口映射情况例如0.0.0.0:8080-80/tcp。NAMES容器的名称通过 --name 指定或随机生成。docker exec功能在正在运行的容器内部执行指定的命令。常用于进入容器内部进行调试、管理或执行一次性任务。常用选项-it: 组合使用分配伪终端并保持 STDIN 打开用于交互式命令如/bin/bash,/bin/sh。-e, --env: 设置执行命令时的环境变量。--user: 指定执行命令的用户名或 UID。-w, --workdir: 设置命令的工作目录。格式docker exec [OPTIONS] CONTAINER COMMAND [ARG...]示例docker exec -it mynginx /bin/bash # 进入 mynginx 容器的 bash shell docker exec mycontainer ls /app # 在容器内执行 ls /app 命令 docker exec -e DEBUGtrue myapp ./script.sh # 设置环境变量并执行脚本docker logs功能获取容器的日志输出。默认显示容器的 STDOUT 和 STDERR 信息。常用选项-f, --follow: 实时跟踪日志输出类似tail -f。--tail: 显示日志末尾的行数如--tail 100。-t, --timestamps: 显示每条日志的时间戳。--since: 显示自某个时间点之后的日志如--since 2023-10-01T12:00:00。--until: 显示到某个时间点之前的日志。格式docker logs [OPTIONS] CONTAINER示例docker logs myapp # 查看 myapp 容器的日志 docker logs -f mynginx # 实时查看 nginx 日志 docker logs --tail 50 -t mycontainer # 查看最后50条带时间戳的日志docker inspect(容器)功能获取 Docker 容器的详细信息元数据以 JSON 格式输出。信息比docker ps详细得多。输出内容包含容器的 ID、名称、创建时间、状态、镜像、命令、参数、网络配置IP、网关、端口映射、挂载点、环境变量、重启策略、资源限制、日志驱动配置等。格式docker inspect [OPTIONS] CONTAINER [CONTAINER...]示例docker inspect mynginx # 查看 mynginx 容器的所有信息 docker inspect --format {{.NetworkSettings.IPAddress}} mycontainer # 仅提取容器IP docker inspect --format {{.HostConfig.RestartPolicy.Name}} mycontainer # 查看重启策略docker top功能显示容器内正在运行的进程信息类似于在容器内运行ps -ef。格式docker top CONTAINER [ps OPTIONS]示例docker top myapp # 显示 myapp 容器内的进程 docker top mynginx aux # 显示类似 ps aux 的进程信息docker rename功能为容器指定一个新的名称。格式docker rename OLD_NAME NEW_NAME示例docker rename old_name new_name # 将容器 old_name 重命名为 new_namedocker attach功能将本地终端的 STDIN、STDOUT、STDERR 附加到一个正在运行的容器上。这使你能够看到容器的输出并与之交互如果容器启动时配置了交互式终端。注意如果同时附加多个终端所有输入会发送到容器所有输出会显示在所有附加的终端上。退出附加如按CtrlC可能会影响容器的运行取决于容器内的进程如何处理信号。通常使用docker exec -it进入容器更安全可控。要从附加会话中分离而不停止容器使用序列CtrlPCtrlQ。格式docker attach [OPTIONS] CONTAINER示例docker attach myinteractivecontainer # 附加到交互式容器docker cp功能在容器和本地宿主机文件系统之间复制文件或目录。格式从容器复制到主机docker cp CONTAINER:SRC_PATH DEST_PATH从主机复制到容器docker cp SRC_PATH CONTAINER:DEST_PATH说明SRC_PATH或DEST_PATH可以是文件或目录。容器路径必须是绝对路径。示例docker cp mycontainer:/app/logs/app.log ./ # 从容器复制文件到当前目录 docker cp ./config.ini mycontainer:/etc/app/ # 从主机复制文件到容器目录 docker cp mycontainer:/var/www/html ./website_backup # 复制容器目录到主机docker diff功能显示容器文件系统自创建以来与它基于的镜像相比发生了哪些更改A: 添加的文件/目录C: 修改的文件/目录D: 删除的文件/目录。格式docker diff CONTAINER示例docker diff mycontainer # 查看 mycontainer 的文件系统变更docker pause/docker unpause功能pause: 暂停一个或多个运行容器内的所有进程。unpause: 恢复一个或多个被暂停容器内的所有进程。说明暂停进程会冻结它们的 CPU 时间片但不会释放内存等资源。主要用于临时冻结容器状态。格式docker pause CONTAINER [CONTAINER...] docker unpause CONTAINER [CONTAINER...]示例docker pause myapp # 暂停 myapp 容器 docker unpause myapp # 恢复 myapp 容器docker port功能列出容器端口映射的配置信息即docker run -p或DockerfileEXPOSE的结果或查找将容器的特定端口映射到宿主机的哪个端口。格式列出所有映射docker port CONTAINER查找特定容器端口docker port CONTAINER PRIVATE_PORT[/PROTO]示例docker port mynginx # 列出 mynginx 的所有端口映射 docker port mynginx 80 # 查看容器 80 端口映射到宿主机哪个端口docker stats功能实时显示一个或多个容器的资源使用情况统计CPU、内存、网络 I/O、块 I/O、进程数。常用选项-a, --all: 显示所有容器默认只显示运行的。--no-stream: 仅显示当前状态不实时更新。格式docker stats [OPTIONS] [CONTAINER...]示例docker stats # 实时显示所有运行中容器的资源使用 docker stats myapp mydb # 实时显示 myapp 和 mydb 的资源使用 docker stats --no-stream container_id # 获取 container_id 的当前资源快照docker update功能更新一个或多个运行中容器的配置如 CPU、内存限制、重启策略。通常不需要停止容器。可更新选项--cpu-shares,--cpus,--memory,--memory-swap,--restart,--blkio-weight等资源限制和策略。格式docker update [OPTIONS] CONTAINER [CONTAINER...]示例docker update --memory 1g myapp # 将 myapp 容器的内存限制改为 1GB docker update --restarton-failure:5 mycontainer # 更新重启策略docker wait功能阻塞命令行直到指定的一个或多个容器停止运行然后打印出它们的退出代码。格式docker wait CONTAINER [CONTAINER...]示例docker wait mycontainer # 等待 mycontainer 停止并显示其退出码docker export功能将容器的文件系统导出为一个tar归档文件。注意导出的是容器的当前文件系统快照不包括历史层、元数据或容器运行所需的其他信息如端口、环境变量。格式docker export [OPTIONS] CONTAINER常用选项-o, --output: 指定输出文件。示例docker export -o container_fs.tar mycontainer # 导出容器文件系统到 tar 包 docker export mycontainer snapshot.tar # 使用重定向用途通常用于检查容器内的文件或配合docker import创建新镜像会丢失历史。docker events功能从 Docker 守护进程获取实时事件流如容器创建、启动、停止、销毁、镜像拉取、删除等。常用选项--filter: 过滤事件类型如eventcreate,typecontainer,imagenginx。--since: 显示自某个时间点之后的事件。--until: 显示到某个时间点之前的事件。格式docker events [OPTIONS]示例docker events # 实时监听所有事件 docker events --filter eventdie # 只监听容器退出事件第三部分Docker 全局选项这些选项可以用于大多数 Docker 命令用于配置客户端行为或连接到特定的 Docker 守护进程。选项短选项长参数类型说明--configstring指定客户端配置文件目录默认/root/.docker。-c--contextstring指定要使用的上下文Context名称。这会覆盖DOCKER_HOST环境变量。-D--debug启用调试模式输出更详细的日志。-H--hostlist指定要连接的 Docker 守护进程的地址。允许多个-H连接到 Swarm。-l--log-levelstring设置日志级别debug,info,warn,error,fatal默认info。--tls使用 TLS传输层安全。由--tlsverify隐含。--tlscacertstring指定受信任的 CA 证书文件路径。--tlscertstring指定客户端 TLS 证书文件路径。--tlskeystring指定客户端 TLS 密钥文件路径。--tlsverify使用 TLS 并验证远程服务器守护进程的身份。-v--version打印 Docker 客户端和守护进程的版本信息并退出。示例用法docker -H tcp://remotehost:2375 ps # 连接到远程 Docker 主机的守护进程查看容器 docker --debug pull nginx # 调试模式拉取镜像 docker --tlscacert ca.pem --tlscert cert.pem --tlskey key.pem -H tcp://securehost:2376 ps # 使用 TLS 安全连接到远程主机 docker --context myremotecontext ps # 使用名为 myremotecontext 的上下文查看容器总结本指南详细介绍了在 OpenEuler 系统下使用 Docker 管理镜像和容器的基础命令。从镜像的拉取、构建、查看、删除到容器的创建、启动、停止、重启、进入、查看日志、检查状态、复制文件、资源监控等涵盖了日常操作的主要方面。理解这些命令及其常用选项是有效使用 Docker 的基础。请务必在实践中多加练习并随时查阅官方文档 (docker COMMAND --help) 以获取更深入的信息。后续指南将探讨 Docker 网络、存储卷、Dockerfile 编写等更高级的主题。

更多文章