🔍搜索⌘K

Docker 命令全攻略:从基础操作到进阶实战

概述

Docker 作为容器化技术的核心工具,其命令体系覆盖镜像管理、容器操作、网络配置、存储卷维护四大核心场景。新手常因命令繁多、参数复杂(如 docker run 数十个可选参数)导致操作混乱,甚至误删数据或容器。

本文将 Docker 命令按 “基础概念 → 核心模块 → 实战场景” 分层梳理:先从 Dockerfile 语法和 docker run 核心命令入手,再分模块详解 “镜像 / 容器 / 网络 / 存储卷” 的操作命令,每个命令均包含 “功能说明 + 常用参数 + 实战示例”,最后补充 “命令对比” 和 “批量清理技巧”,帮你系统掌握 Docker 命令,避免高频踩坑。

一、基础铺垫:Dockerfile 与核心启动命令

在学习命令前,需先理解 “镜像构建的入口(Dockerfile)” 和 “容器启动的核心(docker run)”,这是后续所有操作的基础。

1. Dockerfile 语法全解析(镜像构建模板)

Dockerfile 是构建 Docker 镜像的 “文本脚本”,包含一系列指令,定义了镜像的基础环境、依赖安装、配置项等。以下是完整的语法示例,关键指令已标注说明:

# 1. 基础镜像(必填,指定构建的基础环境,如 ubuntu、centos)
FROM ubuntu:20.04  # 建议指定具体版本,避免使用 latest(版本不稳定)

# 2. 维护者信息(可选,标注镜像作者和联系方式)
LABEL maintainer="Your Name" email="your@email.com"

# 3. 构建参数(可选,仅在构建时生效,构建后失效)
ARG APP_NAME="my-app"  # 可通过 docker build --build-arg APP_NAME=xxx 覆盖

# 4. 执行命令(核心,在基础镜像上执行操作,如安装软件、配置环境)
# 注:合并多条命令减少镜像层数(用 && 连接,\ 换行)
RUN apt update && \
    apt upgrade -y && \
    apt install -y inetutils-ping net-tools && \
    rm -rf /var/lib/apt/lists/*  # 清理缓存,减小镜像体积

# 5. 触发指令(可选,当该镜像被作为基础镜像时,自动执行后续命令)
ONBUILD RUN echo "This command runs when the image is used as a base image"

# 6. 复制文件(二选一,ADD 支持远程文件/解压,COPY 仅本地文件)
ADD sshd_config /etc/ssh/sshd_config  # 支持 URL(如 ADD http://xxx/file /tmp)、自动解压压缩包
COPY app.conf /etc/app.conf            # 仅复制本地文件,推荐优先使用(更安全、清晰)

# 7. 容器启动命令(可选,容器启动时执行的命令,可被 docker run 最后参数覆盖)
CMD ["/usr/sbin/sshd", "-D"]  # 推荐 JSON 格式(数组),避免 shell 解析问题

# 8. 工作目录(可选,设置容器内的默认工作目录,后续命令(RUN/CMD/COPY)均基于此目录)
WORKDIR /tmp  # 相当于 cd /tmp,后续命令在 /tmp 下执行

# 9. 环境变量(可选,容器内的环境变量,可被 docker run -e 覆盖)
ENV HELLO="WORLD" PATH="$PATH:/usr/local/bin"

# 10. 运行用户(可选,指定容器内命令的执行用户,默认 root)
USER root  # 可改为普通用户(如 USER appuser),提升安全性

# 11. 存储卷(可选,声明容器内的持久化目录,运行时自动创建)
VOLUME ["/tmp/data"]  # 运行时可通过 -v 映射到本地目录

# 12. 健康检查(可选,监控容器内服务是否正常运行)
HEALTHCHECK --interval=10s \  # 检查间隔
            --timeout=10s \   # 检查超时时间
            --start-period=10s \  # 容器启动后延迟检查
            --retries=3 \     # 失败重试次数
            CMD wget -O - -q http://localhost || exit 1  # 检查命令(失败返回非 0)

# 13. 入口命令(可选,容器启动的“入口程序”,不可被 docker run 最后参数覆盖)
# 注:与 CMD 区别:ENTRYPOINT 是固定入口,CMD 是参数;如 ENTRYPOINT ["echo"], CMD ["hello"] → 实际执行 echo hello
ENTRYPOINT ["/usr/sbin/sshd", "-D"]

2. docker run:容器启动核心命令(高频使用)

docker run 是创建并启动容器的 “一站式命令”,参数繁多但核心可归纳为 “模式控制 + 资源配置 + 网络存储” 三类。以下是实战中最常用的参数组合示例:

# 核心示例:后台启动 ubuntu 容器,映射端口、设置工作目录、环境变量、运行用户
docker run \
  -it \          # 交互模式(-i 保持标准输入打开,-t 分配伪终端),常用于进入容器
  -d \           # 后台模式(detach),容器启动后在后台运行,返回容器 ID
  -p 8080:80 \   # 端口映射(本地端口:容器端口),如将本地 8080 映射到容器 80
  -w /tmp \      # 设置容器内默认工作目录(对应 Dockerfile 的 WORKDIR)
  -e HELLO="WORLD" \  # 设置环境变量(覆盖 Dockerfile 的 ENV)
  -u root \      # 指定容器内执行命令的用户(默认 root)
  --name my-ubuntu \  # 给容器命名(避免使用随机名称,便于后续操作)
  --restart=always \  # 容器重启策略(always 总是重启,on-failure 失败时重启)
  -v /local/data:/tmp/data \  # 挂载本地目录到容器(本地路径:容器路径)
  ubuntu:20.04 \ # 基于的镜像名称(含版本)
  bash           # 容器启动后执行的命令(覆盖 Dockerfile 的 CMD,此处进入 bash 终端)

参数说明表:

参数功能分类作用说明
-i/-t交互控制-i 保持标准输入打开,-t 分配伪终端,两者结合(-it)可进入容器终端
-d运行模式后台运行容器,适合长期服务(如 Nginx、MySQL)
-p/-P网络配置-p 本地端口:容器端口 手动映射,-P 自动映射容器暴露的所有端口
-w环境配置设置容器内默认工作目录
-e环境配置设置环境变量(格式:-e KEY=VALUE)
-u权限控制指定容器内执行命令的用户(如 -u appuser)
—name标识管理给容器命名(后续操作可通过名称而非 ID 定位容器)
—restart运维配置容器重启策略(always/on-failure:3/unless-stopped)
-v存储配置挂载本地目录或存储卷到容器(格式:-v 本地路径:容器路径)
—link网络互联连接两个容器(已过时,推荐用 docker network connect)
—net网络配置指定容器使用的网络(如 —net bridge/—net host)

二、镜像管理命令:从构建到分发

镜像是容器的 “模板”,所有容器均基于镜像创建。镜像命令覆盖 “构建 → 查看 → 拉取 → 推送 → 删除” 全生命周期,是 Docker 最基础的操作模块。

1. 镜像构建:docker build

基于 Dockerfile 构建镜像,核心参数是 -t(指定镜像名称和标签)。

# 1. 基础用法:当前目录(含 Dockerfile)构建,命名为 my-image:v1
docker build -t my-image:v1 .  # 末尾的 . 表示“上下文目录”(Dockerfile 所在目录)

# 2. 指定自定义 Dockerfile 路径(非默认 Dockerfile 名称)
docker build -t my-image:v1 -f ./docker/Dockerfile .  # -f 指定 Dockerfile 路径

# 3. 从远程 URL 或压缩包构建(无需本地 Dockerfile)
docker build -t my-image:v1 https://github.com/xxx/xxx.git  # 从 Git 仓库构建
docker build -t my-image:v1 - < ./image.tar.gz  # 从压缩包构建(压缩包内含 Dockerfile)

# 4. 保留临时镜像(调试用,默认构建后删除临时层)
docker build --rm=false -t my-image:v1 .  # --rm=false 保留临时镜像

2. 镜像查看:docker images /docker image ls

查看本地所有镜像,支持过滤、格式化输出。

# 1. 基础用法:查看所有镜像(简洁列表)
docker images
# 或等价命令(Docker 1.13+ 推荐,命令更规范)
docker image ls

# 2. 查看所有镜像(含中间层镜像,-a = --all)
docker images -a
docker image ls -a

# 3. 过滤“悬虚镜像”(dangling=true,即无标签的镜像,通常是构建残留)
docker images -f 'dangling=true'  # -f = --filter,过滤条件
docker image ls -f 'dangling=true'

# 4. 仅输出镜像 ID(批量操作时用,如删除所有悬虚镜像)
docker images -q  # -q = --quiet,仅输出 ID
docker image ls -q

# 5. 格式化输出(自定义显示字段,如仅显示镜像名、标签、大小)
docker image ls --format "{{.Repository}}:{{.Tag}} {{.Size}}"

3. 镜像拉取 / 推送:docker pull /docker push

拉取远程仓库(如 Docker Hub)的镜像,或推送本地镜像到远程仓库。

# 1. 拉取镜像(默认拉取 latest 标签,推荐指定版本)
docker pull ubuntu:20.04  # 拉取 ubuntu 20.04 版本
docker pull -a nginx       # -a = --all,拉取该镜像的所有版本(谨慎使用,体积大)
# 等价规范命令
docker image pull ubuntu:20.04

# 2. 推送镜像(需先登录远程仓库,且镜像名符合仓库规范,如 用户名/镜像名:标签)
# 步骤1:登录 Docker Hub(或私有仓库,如 docker login registry.xxx.com)
docker login
# 步骤2:给镜像打标签(符合仓库规范,如 username/my-nginx:v1)
docker tag nginx:latest username/my-nginx:v1
# 步骤3:推送镜像
docker push username/my-nginx:v1
# 等价规范命令
docker image push username/my-nginx:v1

4. 镜像删除:docker rmi /docker image rm

删除本地无用镜像,支持批量删除(结合 docker images -q 过滤)。

# 1. 基础删除(指定镜像名或 ID,-f 强制删除,即使有容器依赖)
docker rmi -f my-image:v1  # -f = --force,强制删除
docker rmi -f 8f7761de90f8  # 通过镜像 ID 删除(支持前几位简写)
# 等价规范命令
docker image rm -f my-image:v1

# 2. 批量删除所有镜像(谨慎使用!会删除本地所有镜像)
docker rmi -f $(docker images -aq)  # $(docker images -aq) 输出所有镜像 ID

# 3. 批量删除悬虚镜像(安全操作,悬虚镜像通常无用)
docker rmi -f $(docker images -qf 'dangling=true')

5. 镜像导出 / 导入:docker save /docker load vs docker export /docker import

镜像的 “备份 / 迁移” 有两种方式:save/load(针对镜像,保留历史层)和 export/import(针对容器,仅保留当前状态,无历史层),需注意区别。

|操作场景 |命令组合 |核心特点 |示例命令| |镜像备份(含历史) |docker save + docker load |保留镜像所有历史层和元数据,可恢复多个镜像(支持批量)| # 导出 docker save -o nginx.tar nginx:latest # 导入 docker load -i nginx.tar| |容器快照(无历史) |docker export + docker import |基于容器当前状态创建镜像,无历史层(体积小),仅恢复为单个镜像 |# 导出容器(先启动容器 my-nginx) docker export -o nginx-snap.tar my-nginx # 导入为镜像 docker import nginx-snap.tar my-nginx:snap|

关键区别:

  • save 操作对象是 “镜像”,export 操作对象是 “容器”;
  • load 导入后保留镜像历史层,import 导入后仅为单层镜像(无法查看构建历史)。

6. 其他镜像命令

命令功能说明示例命令
docker history查看镜像的构建历史(每一层的操作记录)docker history nginx:latest # 查看 nginx 镜像的构建历史
docker tag给镜像打标签(重命名或添加版本,不创建新镜像)docker tag nginx:latest my-nginx:v1 # 将 nginx 重命名为 my-nginx:v1
docker inspect查看镜像的详细元数据(如基础镜像、环境变量、端口暴露等)docker inspect nginx:latest # 查看 nginx 镜像的详细信息
docker image prune清理无用镜像(默认清理悬虚镜像,-a 清理所有未被容器使用的镜像)docker image prune -f # 强制清理悬虚镜像
docker image prune -a -f # 强制清理所有无用镜像

三、容器管理命令:从创建到运维

容器是镜像的 “运行实例”,容器命令覆盖 “创建 → 启动 → 进入 → 监控 → 删除” 全生命周期,是日常运维最高频的操作。

1. 容器创建 / 启动:docker create /docker start

  • docker create:仅创建容器(不启动,类似 “预初始化”);
  • docker start:启动已创建的容器(含 docker create 创建的容器或 docker stop 停止的容器)。
# 1. 创建容器(不启动,返回容器 ID)
docker create --name my-ubuntu -it ubuntu:20.04 bash
# 等价规范命令
docker container create --name my-ubuntu -it ubuntu:20.04 bash

# 2. 启动容器(启动已创建的 my-ubuntu)
docker start my-ubuntu  # 后台启动
docker start -i my-ubuntu  # -i 交互模式启动(进入容器终端)
# 等价规范命令
docker container start -i my-ubuntu

2. 容器查看:docker ps /docker container ls

查看容器状态(运行中 / 已停止),支持过滤和格式化输出。

# 1. 查看运行中的容器(默认)
docker ps
# 等价规范命令
docker container ls

# 2. 查看所有容器(含已停止的,-a = --all)
docker ps -a
docker container ls -a

# 3. 仅输出容器 ID(批量操作时用,如批量停止容器)
docker ps -q  # 仅运行中的容器 ID
docker ps -aq # 所有容器 ID

# 4. 过滤容器(如仅查看状态为 running 的容器)
docker ps -f 'status=running'  # 过滤运行中容器
docker ps -f 'name=my-*'       # 过滤名称以 my- 开头的容器
docker ps -f 'ancestor=ubuntu' # 过滤基于 ubuntu 镜像创建的容器

# 5. 查看容器详细信息(含端口映射、挂载目录等)
docker ps -s  # -s = --size,显示容器大小

3. 容器进入:docker exec /docker attach

进入运行中的容器终端,两者核心区别在于是否影响容器生命周期,实战中优先用 docker exec(更安全灵活)。

命令核心特点适用场景示例命令
docker exec启动新进程进入容器,退出终端不影响容器运行(推荐)日常运维、临时操作容器# 交互模式进入容器(分配 bash 终端) docker exec -it my-ubuntu bash # 非交互执行命令(如查看文件) docker exec my-ubuntu ls /tmp
docker attach直接附加到容器的 “主进程”,退出终端会导致容器停止(慎用)调试容器主进程(如日志查看)# 附加到容器主进程 docker attach my-ubuntu # 注:退出需用 Ctrl+P+Q(直接 Ctrl+C 会终止容器)

实战技巧:若需长期操作容器,推荐用 docker exec -it 进入,即使误关终端,容器仍会在后台运行;若需查看容器主进程输出(如 nginx 日志),可结合 docker logs -f(无需进入容器)。

4. 容器停止 / 重启 / 删除:docker stop /docker restart /docker rm

容器的 “生命周期控制” 命令,需注意删除容器前需先停止(或强制删除)。

# 1. 停止容器(发送 SIGTERM 信号,默认等待 10 秒后强制终止,-t 指定等待时间)
docker stop my-ubuntu  # 默认等待 10 秒
docker stop -t 5 my-ubuntu  # 等待 5 秒后强制停止
# 等价规范命令
docker container stop -t 5 my-ubuntu

# 2. 重启容器(先停止再启动,-t 指定停止等待时间)
docker restart my-ubuntu
docker restart -t 5 my-ubuntu  # 停止时等待 5 秒
# 等价规范命令
docker container restart -t 5 my-ubuntu

# 3. 删除容器(默认仅能删除已停止的容器,-f 强制删除运行中的容器)
docker rm my-ubuntu  # 删除已停止的容器
docker rm -f my-ubuntu  # 强制删除运行中的容器(慎用,会终止容器)
# 批量删除所有已停止的容器(安全操作)
docker rm $(docker ps -aqf 'status=exited')
# 等价规范命令
docker container rm -f my-ubuntu

注意:docker rm -v my-ubuntu 中的 -v 参数会同时删除容器挂载的 “匿名存储卷”(避免残留数据),推荐删除容器时加上 -v。

5. 容器数据交互:docker cp

在 “本地主机” 和 “容器” 之间复制文件 / 目录,无需进入容器即可实现数据传输。

# 1. 本地文件复制到容器(格式:本地路径 容器名:容器内路径)
docker cp /local/file.txt my-ubuntu:/tmp/file.txt  # 复制本地 file.txt 到容器 /tmp
docker cp /local/dir my-ubuntu:/tmp/  # 复制本地 dir 目录到容器 /tmp

# 2. 容器文件复制到本地(格式:容器名:容器内路径 本地路径)
docker cp my-ubuntu:/tmp/logs.txt /local/logs.txt  # 复制容器 logs.txt 到本地
docker cp my-ubuntu:/tmp/dir /local/  # 复制容器 dir 目录到本地
# 等价规范命令
docker container cp my-ubuntu:/tmp/logs.txt /local/

实战技巧:若需复制大量文件,推荐先在容器内压缩(如 tar -czf /tmp/data.tar.gz /data),再用 docker cp 复制压缩包到本地,减少传输时间。

6. 容器状态监控:docker logs /docker top /docker stats

监控容器的 “日志输出”“进程状态”“资源占用”,是运维排查问题的核心命令。

# 1. 查看容器日志(docker logs)
docker logs my-ubuntu  # 查看容器所有日志
docker logs -f my-ubuntu  # 实时跟踪日志(类似 tail -f)
docker logs -t my-ubuntu  # 显示日志时间戳
docker logs --tail=10 my-ubuntu  # 仅查看最后 10 行日志
docker logs --since="2024-05-01" my-ubuntu  # 查看指定时间后的日志
# 等价规范命令
docker container logs -f -t my-ubuntu

# 2. 查看容器内运行的进程(类似 Linux top 命令)
docker top my-ubuntu  # 查看 my-ubuntu 容器内的进程列表
# 等价规范命令
docker container top my-ubuntu

# 3. 实时查看容器资源占用(CPU、内存、网络、磁盘 I/O)
docker stats  # 查看所有运行中容器的资源占用
docker stats my-ubuntu  # 仅查看 my-ubuntu 容器的资源占用
# 等价规范命令
docker container stats my-ubuntu

7. 容器其他常用命令

命令功能说明示例命令
docker commit将容器当前状态提交为新镜像(基于容器修改创建自定义镜像)docker commit -m “add nginx” my-ubuntu my-nginx:v1 # -m 提交说明
docker diff查看容器内文件系统的修改(新增 / 删除 / 修改的文件)docker diff my-ubuntu # 输出 +(新增)、-(删除)、C(修改)的文件列表
docker pause/unpause暂停 / 恢复容器(暂停后容器内进程停止运行,资源不释放)docker pause my-ubuntu docker unpause my-ubuntu
docker port查看容器的端口映射关系(本地端口:容器端口)docker port my-ubuntu # 查看 my-ubuntu 容器的所有端口映射
docker port my-ubuntu 80 # 查看容器 80 端口对应的本地端口
docker rename重命名容器(修改容器的名称)docker rename my-ubuntu new-ubuntu # 将 my-ubuntu 重命名为 new-ubuntu
docker wait等待容器停止后返回退出码(常用于脚本中,等待容器执行完命令)docker wait my-ubuntu # 等待 my-ubuntu 容器停止,返回退出码

8. 容器批量清理:docker container prune

清理所有 “已停止的容器”,避免无用容器占用磁盘空间(安全操作,不会删除运行中的容器)。

docker container prune  # 清理所有已停止的容器(需确认)
docker container prune -f  # 强制清理(无需确认,脚本中常用)

四、网络管理命令:容器互联与网络配置

Docker 网络默认包含 bridge(默认)、host(共享主机网络)、none(无网络)三种模式,自定义网络需通过 docker network 命令创建和管理。

1. 网络创建:docker network create

创建自定义网络(推荐用 bridge 驱动,支持容器间 DNS 解析,比默认 bridge 网络更灵活)。

# 1. 创建默认 bridge 类型的网络(推荐)
docker network create my-bridge  # 创建名为 my-bridge 的网络
# 2. 指定驱动类型创建网络(如 overlay 用于跨主机容器通信,仅 swarm 模式用)
docker network create --driver bridge my-bridge  # --driver 指定驱动(默认 bridge)
# 3. 创建网络时指定子网和网关(自定义网段,避免与主机网段冲突)
docker network create --driver bridge --subnet=172.20.0.0/16 --gateway=172.20.0.1 my-bridge

2. 网络查看与详情:docker network ls /docker network inspect

查看系统中所有 Docker 网络,或查看某个网络的详细配置(如连接的容器、子网、网关)。

# 1. 查看所有 Docker 网络
docker network ls  # 输出网络 ID、名称、驱动类型、Scope(本地/全局)
# 2. 查看某个网络的详细信息(如 my-bridge)
docker network inspect my-bridge  # 输出 JSON 格式的详细配置,含连接的容器列表
docker network inspect -f '{{.Containers}}' my-bridge  # 仅查看网络连接的容器

3. 容器连接网络:docker network connect

将已创建的容器连接到指定网络(实现跨网络容器通信,如将容器从默认 bridge 网络切换到自定义 my-bridge 网络)。

# 将 my-ubuntu 容器连接到 my-bridge 网络
docker network connect my-bridge my-ubuntu
# 连接时为容器指定固定 IP(需网络支持,如自定义 subnet 的 bridge 网络)
docker network connect --ip=172.20.0.10 my-bridge my-ubuntu

4. 容器断开网络:docker network disconnect

将容器从指定网络中断开(断开后容器无法通过该网络与其他容器通信)。

# 将 my-ubuntu 容器从 my-bridge 网络断开
docker network disconnect my-bridge my-ubuntu

5. 网络清理:docker network prune

清理所有 “未被容器使用的网络”(避免无用网络占用配置空间)。

docker network prune  # 清理未使用的网络(需确认)
docker network prune -f  # 强制清理(无需确认)

五、存储卷命令:容器数据持久化

存储卷(Volume)是 Docker 中 “持久化容器数据” 的核心方案,与 “绑定挂载(-v 本地路径:容器路径)” 相比,Volume 由 Docker 统一管理,支持跨容器共享、备份、迁移。

1. 存储卷创建:docker volume create

创建自定义存储卷(默认驱动为 local,即存储在主机 /var/lib/docker/volumes/ 目录下)。

# 创建名为 my-volume 的存储卷
docker volume create my-volume
# 创建时指定驱动(如远程存储驱动,需额外配置)
docker volume create --driver local my-volume

2. 存储卷查看与详情:docker volume ls /docker volume inspect

查看所有存储卷,或查看某个卷的详细信息(如存储路径、驱动、挂载的容器)。

# 1. 查看所有存储卷
docker volume ls  # 输出卷 ID、名称、驱动类型、Scope
# 2. 查看某个卷的详细信息(如 my-volume)
docker volume inspect my-volume  # 输出 JSON 格式,含卷的本地存储路径(如 /var/lib/docker/volumes/my-volume/_data)

3. 存储卷挂载:docker run -v /docker run —mount

将存储卷挂载到容器内的目录,实现数据持久化(即使容器删除,卷内数据仍保留)。

# 方式1:用 -v 挂载(简洁,推荐)
docker run -d --name my-nginx -v my-volume:/usr/share/nginx/html nginx:latest
# 说明:my-volume 是存储卷名称,/usr/share/nginx/html 是容器内挂载目录(nginx 静态文件目录)

# 方式2:用 --mount 挂载(更详细,支持更多参数)
docker run -d --name my-nginx \
  --mount type=volume,source=my-volume,target=/usr/share/nginx/html \
  nginx:latest
# 说明:type=volume 表示挂载类型为存储卷,source 是卷名称,target 是容器内目录

4. 存储卷共享:—volume-from

让新容器挂载 “已有容器的存储卷”(实现容器间数据共享,如 “数据容器” 模式)。

# 1. 先创建一个“数据容器”(仅用于存储卷,不运行服务)
docker create --name data-container -v my-volume:/data ubuntu:20.04

# 2. 新容器通过 --volume-from 挂载 data-container 的存储卷
docker run -it --name app-container --volume-from data-container ubuntu:20.04 bash
# 说明:app-container 容器内会自动挂载 /data 目录,与 data-container 的 /data 共享数据

5. 存储卷清理:docker volume prune

清理所有 “未被容器使用的存储卷”(需谨慎,删除后卷内数据永久丢失)。

docker volume prune  # 清理未使用的存储卷(需确认)
docker volume prune -f  # 强制清理(无需确认,脚本中常用)

6. 存储卷删除:docker volume rm

删除指定的存储卷(仅能删除未被容器使用的卷,若卷被挂载需先停止容器)。

# 删除 my-volume 存储卷(需确保无容器挂载该卷)
docker volume rm my-volume
# 批量删除所有未使用的存储卷(等价于 docker volume prune -f)
docker volume rm $(docker volume ls -qf 'dangling=true')

六、Docker 命令规范与实战技巧

1. 命令规范:新旧命令对比(Docker 1.13+)

Docker 1.13 后对命令进行了规范化,将 “按资源类型” 分组(如 docker container、docker image),推荐使用新命令(更清晰,便于记忆)。

旧命令(兼容)新规范命令(推荐)资源类型功能说明
docker psdocker container ls容器查看容器
docker rundocker container run容器启动容器
docker imagesdocker image ls镜像查看镜像
docker rmidocker image rm镜像删除镜像
docker network ls无变化(已规范)网络查看网络
docker volume ls无变化(已规范)存储卷查看存储卷

2. 批量操作技巧(脚本常用)

Docker 命令支持通过 “命令嵌套” 实现批量操作,以下是实战中高频使用的批量命令:

# 1. 批量停止所有运行中的容器
docker stop $(docker ps -q)

# 2. 批量删除所有已停止的容器
docker rm $(docker ps -aqf 'status=exited')

# 3. 批量删除所有悬虚镜像
docker rmi $(docker images -qf 'dangling=true')

# 4. 批量删除所有未被容器使用的镜像(谨慎!)
docker rmi $(docker images -qf 'dangling=true') $(docker image ls -q --filter "dangling=false" --filter "since=nginx:latest")
# 说明:--filter "since=nginx:latest" 表示删除比 nginx:latest 镜像创建时间晚的无用镜像

# 5. 批量清理所有无用资源(容器、网络、存储卷、悬虚镜像)
docker system prune -a -f
# 说明:-a 清理所有无用资源(含未被使用的镜像),-f 强制清理(无需确认)

3. 高频踩坑点与解决方案

问题 1:删除镜像提示 “image is being used by stopped container”

  • 原因:该镜像被已停止的容器引用,需先删除容器。
  • 解决方案:先删除引用该镜像的容器,再删除镜像:
# 查找引用该镜像的容器 ID
docker ps -aq --filter "ancestor=my-image:v1"
# 删除这些容器
docker rm $(docker ps -aq --filter "ancestor=my-image:v1")
# 再删除镜像
docker rmi my-image:v1

问题 2:容器启动提示 “port is already allocated”

  • 原因:本地端口已被其他进程(或容器)占用。
  • 解决方案:更换本地端口,或停止占用端口的进程:
# 查看占用 8080 端口的进程
sudo lsof -i :8080
# 停止该进程(替换 PID)
sudo kill -9 [PID]
# 或更换本地端口(如用 8081:80)
docker run -p 8081:80 nginx:latest

问题 3:存储卷挂载后容器内无数据

  • 原因:挂载时 “容器内目录已存在数据”,Docker 会用存储卷的空数据覆盖容器内原有数据(存储卷优先级高于容器内目录);或存储卷路径拼写错误。
  • 解决方案:
  1. 若需保留容器内原有数据,先将数据复制到存储卷,再重新挂载:
# 1. 先启动临时容器,将容器内数据复制到存储卷
docker run --rm -v my-volume:/volume -v /path/to/container/data:/container/data ubuntu:20.04 \
  cp -r /container/data/* /volume/
# 2. 再启动正式容器,挂载存储卷
docker run -d -v my-volume:/container/data my-image:v1
  1. 检查存储卷路径是否正确(用 docker volume inspect my-volume 确认卷的实际路径)。

问题 4:docker exec 进入容器提示 “exec format error”

  • 原因:容器镜像架构与主机架构不匹配(如在 x86 主机上运行 ARM 架构的镜像,如 Raspberry Pi 镜像)。
  • 解决方案:
  1. 确认主机架构(uname -m,x86 输出 x86_64,ARM 输出 aarch64);
  2. 拉取与主机架构匹配的镜像(如 Docker Hub 镜像通常标注 amd64/arm64 标签):
# 拉取 x86 架构的 nginx 镜像
docker pull nginx:latest-amd64

4. Docker 系统信息与登录:基础运维命令

命令功能说明示例命令
docker info查看 Docker 系统信息(如版本、镜像数、容器数、存储驱动、网络驱动等)docker info # 输出详细的系统配置,排查环境问题时常用
docker version查看 Docker 客户端和服务端版本(区分 Client 和 Server 版本)docker version # 输出 Client Version 和 Server Version
docker login/logout登录 / 退出 Docker 仓库(如 Docker Hub、私有仓库)docker login # 交互式输入用户名密码登录 Docker Hub
docker login registry.xxx.com # 登录私有仓库
docker logout # 退出当前仓库
docker events实时监听 Docker 系统事件(如容器启动 / 停止、镜像拉取 / 删除、网络创建等)docker events # 监听所有事件
docker events —filter ‘event=stop’ # 仅监听容器停止事件
docker events —since ‘1h’ # 监听 1 小时内的事件

七、命令速查表:按场景分类(收藏备用)

为方便日常查询,以下按 “镜像操作”“容器操作”“网络操作”“存储卷操作” 四大场景,整理高频命令速查表:

1. 镜像操作速查表

操作需求命令示例
构建镜像docker build -t my-image:v1 -f ./Dockerfile .
拉取镜像docker pull ubuntu:20.04
推送镜像docker tag my-image:v1 username/my-image:v1 && docker push username/my-image:v1
查看所有镜像docker image ls -a
查看镜像历史docker history my-image:v1
删除镜像docker image rm -f my-image:v1
导出镜像docker save -o my-image.tar my-image:v1
导入镜像docker load -i my-image.tar
清理悬虚镜像docker image prune -f

2. 容器操作速查表

操作需求命令示例
启动容器docker run -d -p 8080:80 —name my-nginx nginx:latest
进入容器docker exec -it my-nginx bash
查看运行中容器docker container ls
查看所有容器docker container ls -a
停止容器docker container stop my-nginx
重启容器docker container restart my-nginx
删除容器docker container rm -fv my-nginx
查看容器日志docker container logs -f -t my-nginx
复制文件到容器docker container cp /local/file.txt my-nginx:/tmp/
查看容器资源占用docker container stats my-nginx
批量删除已停止容器docker container prune -f

3. 网络操作速查表

操作需求命令示例
创建自定义网络docker network create —subnet=172.20.0.0/16 my-bridge
查看所有网络docker network ls
查看网络详情docker network inspect my-bridge
容器连接网络docker network connect my-bridge my-nginx
容器断开网络docker network disconnect my-bridge my-nginx
清理未使用网络docker network prune -f

4. 存储卷操作速查表

操作需求命令示例
创建存储卷docker volume create my-volume
查看所有存储卷docker volume ls
查看存储卷详情docker volume inspect my-volume
挂载存储卷到容器docker run -d -v my-volume:/data —name my-app my-image:v1
容器间共享存储卷docker run -d —volume-from data-container —name app-container my-image:v1
清理未使用存储卷docker volume prune -f
删除存储卷docker volume rm my-volume

八、总结

Docker 命令体系虽看似庞大,但核心可归纳为 “四大资源(镜像 / 容器 / 网络 / 存储卷)+ 生命周期操作(创建 → 查看 → 修改 → 删除)”。掌握以下核心逻辑,即可灵活应对 90% 以上的 Docker 运维场景:

  1. 镜像为 “模板”,容器为 “实例”: 所有容器基于镜像创建,修改容器后需用 docker commit 或重新构建镜像固化变更;
  2. 网络为 “通道”,存储为 “持久化”: 自定义网络实现容器互联,存储卷实现数据持久化,两者结合是容器服务稳定运行的基础;
  3. 规范命令优先,批量操作谨慎: 推荐使用 Docker 1.13+ 规范命令(如 docker container ls 替代 docker ps),批量删除命令(如 docker rmi $(docker images -aq))需确认无重要资源后执行。

通过本文的 “基础语法 → 实战示例 → 踩坑方案 → 速查表”,可系统掌握 Docker 命令,后续可结合具体场景(如 Docker Compose 编排、Docker Swarm 集群)进一步深化学习,逐步构建完整的容器化技术体系。