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 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 架构的镜像,像树莓派的镜像)。
- 解决办法:
- 确认主机架构(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 命令看着一大堆,其实就四样东西(镜像 / 容器 / 网络 / 存储卷)加一套生命周期操作(创建 → 查看 → 修改 → 删除)。把下面这三点逻辑吃透,九成以上的日常运维场景都能应付:
- 镜像是”模板”,容器是”实例”:容器都是从镜像跑出来的,改了容器之后想固化下来,得用 docker commit 或者重新构建镜像;
- 网络是”通道”,存储是”持久化”:自定义网络让容器能互相通信,存储卷保证数据不丢,这俩配合好,容器服务才稳;
- 规范命令优先,批量操作悠着点:建议用 Docker 1.13+ 的新命令(比如 docker container ls 代替 docker ps);批量删除那种命令(像 docker rmi $(docker images -aq))动手前一定确认没有重要资源。
按这篇”基础语法 → 实战例子 → 踩坑方案 → 速查表”的顺序走一遍,Docker 命令基本就摸到门道了。后面可以再结合 Docker Compose 编排、Docker Swarm 集群这些具体场景深入,慢慢把整套容器化技术串起来。