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 ps | docker container ls | 容器 | 查看容器 |
docker run | docker container run | 容器 | 启动容器 |
docker images | docker image ls | 镜像 | 查看镜像 |
docker rmi | docker 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. 先启动临时容器,将容器内数据复制到存储卷
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
- 检查存储卷路径是否正确(用 docker volume inspect my-volume 确认卷的实际路径)。
问题 4:docker exec 进入容器提示 “exec format error”
- 原因:容器镜像架构与主机架构不匹配(如在 x86 主机上运行 ARM 架构的镜像,如 Raspberry Pi 镜像)。
- 解决方案:
- 确认主机架构(uname -m,x86 输出 x86_64,ARM 输出 aarch64);
- 拉取与主机架构匹配的镜像(如 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 运维场景:
- 镜像为 “模板”,容器为 “实例”: 所有容器基于镜像创建,修改容器后需用 docker commit 或重新构建镜像固化变更;
- 网络为 “通道”,存储为 “持久化”: 自定义网络实现容器互联,存储卷实现数据持久化,两者结合是容器服务稳定运行的基础;
- 规范命令优先,批量操作谨慎: 推荐使用 Docker 1.13+ 规范命令(如 docker container ls 替代 docker ps),批量删除命令(如 docker rmi $(docker images -aq))需确认无重要资源后执行。
通过本文的 “基础语法 → 实战示例 → 踩坑方案 → 速查表”,可系统掌握 Docker 命令,后续可结合具体场景(如 Docker Compose 编排、Docker Swarm 集群)进一步深化学习,逐步构建完整的容器化技术体系。