🔍搜索⌘K

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

概述

Docker 是现在做容器化最常用的一把工具,它的命令虽说多,但归根结底就管四件事:镜像管理、容器操作、网络配置、存储卷维护。新手刚上手容易被那一堆命令和参数搞晕(比如 docker run 后面能跟一长串参数),一不小心还可能把容器或数据误删了。

这篇文章换个思路来梳理 Docker 命令:先讲最基础的 Dockerfile 写法和 docker run 这个核心启动命令,再按「镜像 / 容器 / 网络 / 存储卷」四个模块一个个拆开讲,每个命令都配上「干什么用 + 常用参数 + 实际例子」,最后再补上命令对比和批量清理的小技巧。照着看一遍,基本就能避开那些高频踩的坑。

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

动手敲命令之前,有两样东西得先弄明白:一个是 Dockerfile(用来构建镜像的”图纸”),另一个是 docker run(启动容器的核心命令)。这俩是后面所有操作的地基。

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

Dockerfile 说白了就是一份构建镜像的”脚本文本”,里面一行行指令,定义了这个镜像的基础环境、装了哪些依赖、做了哪些配置。下面是个完整的示例,关键的指令都加了注释:

# 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 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

这几个是管容器”生命周期”的命令。注意删容器之前一般得先停掉它(或者加 -f 强制删)。

# 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 驱动,支持容器之间用名字互相访问,比默认的 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 架构的镜像,像树莓派的镜像)。
  • 解决办法:
  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 命令看着一大堆,其实就四样东西(镜像 / 容器 / 网络 / 存储卷)加一套生命周期操作(创建 → 查看 → 修改 → 删除)。把下面这三点逻辑吃透,九成以上的日常运维场景都能应付:

  1. 镜像是”模板”,容器是”实例”:容器都是从镜像跑出来的,改了容器之后想固化下来,得用 docker commit 或者重新构建镜像;
  2. 网络是”通道”,存储是”持久化”:自定义网络让容器能互相通信,存储卷保证数据不丢,这俩配合好,容器服务才稳;
  3. 规范命令优先,批量操作悠着点:建议用 Docker 1.13+ 的新命令(比如 docker container ls 代替 docker ps);批量删除那种命令(像 docker rmi $(docker images -aq))动手前一定确认没有重要资源。

按这篇”基础语法 → 实战例子 → 踩坑方案 → 速查表”的顺序走一遍,Docker 命令基本就摸到门道了。后面可以再结合 Docker Compose 编排、Docker Swarm 集群这些具体场景深入,慢慢把整套容器化技术串起来。