Docker 高频常用命令速查表
本表筛选了日常开发、运维、生产环境中80%场景高频使用的核心命令,附带可直接运行的实战示例,可直接复制保存为本地速查手册。
一、镜像核心管理命令
| 命令 |
核心作用 |
高频必用参数 |
可直接运行的实战示例 |
docker pull |
从仓库拉取镜像 |
-a:拉取所有标签;--platform:指定CPU架构 |
1. 拉取轻量稳定版:docker pull nginx:alpine 2. 拉取指定架构镜像:docker pull --platform linux/amd64 mysql:8.0 |
docker images |
查看本地所有镜像 |
-a:显示中间层镜像;-q:仅输出镜像ID;--filter:过滤 |
1. 查看所有镜像:docker images 2. 批量删除专用:docker images -q |
docker rmi |
删除本地镜像 |
-f:强制删除(含被容器引用的镜像) |
1. 按名称删除:docker rmi nginx:alpine 2. 批量删除所有镜像:docker rmi $(docker images -q) |
docker tag |
镜像打标签(推送仓库必备) |
无 |
1. 私有仓库标签:docker tag nginx:alpine my-registry.com/nginx/nginx:v1.0 2. 镜像重命名:docker tag old-image:v1 new-image:v2 |
docker save/load |
镜像离线导出/导入 |
-o:指定输出文件;-i:指定输入文件 |
1. 导出镜像:docker save -o nginx-alpine.tar nginx:alpine 2. 导入镜像:docker load -i nginx-alpine.tar |
docker inspect |
查看镜像/容器/卷的元数据 |
--format:格式化输出 |
1. 查看完整信息:docker inspect nginx:alpine 2. 仅获取镜像ID:docker inspect --format {``{.Id}} nginx:alpine |
二、容器全生命周期管理(最高频核心)
| 命令 |
核心作用 |
高频必用参数 |
可直接运行的实战示例 |
docker run |
创建并启动容器(最核心) |
-d:后台守护运行;-it:交互式终端;--name:指定容器名 -p 主机端口:容器端口:端口映射;-e:设置环境变量 --rm:容器退出自动删除;--network:指定网络;-v:挂载卷 |
1. 最简启动nginx:docker run -d --name nginx-demo -p 80:80 nginx:alpine 2. 交互式临时容器:docker run -it --rm ubuntu:20.04 /bin/bash 3. 带环境变量启动mysql:docker run -d --name mysql-demo -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0 |
docker ps |
查看容器列表 |
-a:查看所有容器(含停止的);-q:仅输出容器ID;-s:显示容器大小 |
1. 查看运行中容器:docker ps 2. 查看所有容器:docker ps -a 3. 批量删除专用:docker ps -aq |
docker start/stop/restart |
启动/停止/重启容器 |
-t:停止前等待的秒数 |
1. 停止容器:docker stop nginx-demo 2. 启动停止的容器:docker start nginx-demo 3. 强制重启:docker restart nginx-demo |
docker rm |
删除容器 |
-f:强制删除运行中的容器;-v:同时删除关联的匿名卷 |
1. 删除停止的容器:docker rm nginx-demo 2. 强制删除运行中容器:docker rm -f nginx-demo 3. 批量删除所有容器:docker rm -f $(docker ps -aq) |
docker exec |
进入运行中容器执行命令 |
-it:交互式终端(必备) |
1. 进入容器bash终端:docker exec -it nginx-demo /bin/bash 2. 容器内执行单条命令:docker exec nginx-demo cat /etc/nginx/nginx.conf |
docker logs |
查看容器日志 |
-f:实时跟踪日志;--tail N:仅显示最后N行;-t:显示时间戳 |
1. 查看完整日志:docker logs nginx-demo 2. 实时跟踪日志:docker logs -f nginx-demo 3. 查看最后100行日志:docker logs --tail 100 nginx-demo |
三、容器运维排障高频命令
| 命令 |
核心作用 |
实战示例 |
docker cp |
主机与容器互传文件 |
1. 主机→容器:docker cp ./index.html nginx-demo:/usr/share/nginx/html/ 2. 容器→主机:docker cp nginx-demo:/etc/nginx/nginx.conf ./ |
docker port |
查看容器端口映射 |
docker port nginx-demo |
docker top |
查看容器内运行进程 |
docker top nginx-demo |
docker stats |
实时查看容器CPU/内存/磁盘IO占用 |
1. 查看所有容器:docker stats 2. 查看指定容器:docker stats nginx-demo |
docker diff |
查看容器文件系统变更 |
docker diff nginx-demo |
四、数据卷持久化管理命令
| 命令 |
核心作用 |
高频参数 |
实战示例 |
docker volume create |
创建自定义命名卷(生产推荐) |
--driver:指定存储驱动,默认local |
docker volume create mysql-data |
docker volume ls |
查看所有数据卷 |
-q:仅输出卷名 |
docker volume ls |
docker volume inspect |
查看卷的挂载路径、配置详情 |
无 |
docker volume inspect mysql-data |
docker volume rm |
删除数据卷 |
-f:强制删除 |
docker volume rm mysql-data |
docker volume prune |
清理未使用的卷(释放磁盘) |
-a:清理所有未使用卷;-f:不提示确认 |
docker volume prune -f |
| 容器挂载核心用法 |
- |
- |
1. 命名卷挂载(推荐):docker run -d -v mysql-data:/var/lib/mysql mysql:8.0 2. 主机目录绑定挂载:docker run -d -v /host/mysql/data:/var/lib/mysql mysql:8.0 3. 只读挂载:docker run -d -v nginx-config:/etc/nginx:ro nginx:alpine |
五、Docker网络管理命令
| 命令 |
核心作用 |
高频参数 |
实战示例 |
docker network create |
创建自定义网络(生产推荐) |
--driver:网络驱动,默认bridge;--subnet:指定子网;--gateway:指定网关 |
1. 创建基础网络:docker network create app-net 2. 创建指定子网网络:docker network create --subnet 172.20.0.0/16 --gateway 172.20.0.1 app-net |
docker network ls |
查看所有网络 |
-q:仅输出网络ID |
docker network ls |
docker network inspect |
查看网络详情(接入容器、IP分配) |
无 |
docker network inspect app-net |
docker network rm |
删除网络 |
无 |
docker network rm app-net |
docker network prune |
清理未使用的网络 |
-f:不提示确认 |
docker network prune -f |
docker network connect/disconnect |
容器接入/断开网络 |
--ip:指定容器IP;--alias:设置网络别名 |
1. 接入网络:docker network connect app-net nginx-demo 2. 断开网络:docker network disconnect app-net nginx-demo |
六、镜像构建与仓库交互命令
| 命令 |
核心作用 |
高频参数 |
实战示例 |
docker build |
基于Dockerfile构建自定义镜像 |
-t:指定镜像名和标签;-f:指定Dockerfile路径;--build-arg:传递构建参数;--no-cache:不使用构建缓存 |
1. 基础构建:docker build -t my-java-app:v1.0 . 2. 指定Dockerfile构建:docker build -t my-app:v1 -f ./Dockerfile.prod . 3. 带构建参数构建:docker build -t my-app:v1 --build-arg APP_VERSION=1.0 . |
docker login |
登录镜像仓库(默认Docker Hub) |
-u:用户名;-p:密码 |
1. 登录Docker Hub:docker login -u 你的用户名 2. 登录私有仓库:docker login my-registry.com |
docker logout |
登出镜像仓库 |
无 |
docker logout my-registry.com |
docker push |
推送镜像到仓库 |
无 |
docker push my-registry.com/nginx/nginx:v1.0 |
docker search |
搜索Docker Hub镜像 |
--filter is-official=true:仅筛选官方镜像 |
docker search --filter is-official=true nginx |
七、系统清理与信息查看命令
| 命令 |
核心作用 |
实战示例 |
docker system info |
查看Docker系统全局信息 |
docker system info |
docker system df |
查看Docker磁盘占用详情 |
docker system df |
docker system prune |
一键清理无用资源 |
1. 基础清理:docker system prune 2. 深度清理(含未使用镜像和卷):docker system prune -a --volumes -f |
Docker核心模块深入详解
1. Dockerfile 多阶段构建(生产环境核心最佳实践)
核心原理
多阶段构建允许在一个Dockerfile中使用多个FROM指令,每个阶段对应一个独立的构建环境,最终仅保留应用运行所需的最小文件,彻底解决「构建环境臃肿」问题,大幅减小镜像体积、提升分发效率与安全性。
核心优势
- 镜像体积大幅缩减(Java应用可从数百M降至几十M)
- 分离构建环境与运行环境,避免源码、构建工具、依赖缓存进入生产镜像
- 减少攻击面,提升容器安全性
- 单Dockerfile完成全流程,无需额外脚本维护
实战示例
示例1:Java SpringBoot 应用多阶段构建
# 第一阶段:构建环境(完整JDK+Maven,负责编译打包)
FROM maven:3.8.8-openjdk-11 AS builder
WORKDIR /app
# 提前复制依赖配置,最大化利用构建缓存
COPY pom.xml .
RUN mvn dependency:go-offline
# 复制源码并编译打包
COPY src ./src
RUN mvn clean package -DskipTests
# 第二阶段:运行环境(仅JRE最小运行时)
FROM openjdk:11-jre-slim
WORKDIR /app
# 仅从构建阶段复制编译好的jar包,无多余文件
COPY --from=builder /app/target/*.jar app.jar
# 声明端口
EXPOSE 8080
# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]
示例2:前端Vue/React 应用多阶段构建
# 第一阶段:构建环境(Node环境,负责打包前端代码)
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 第二阶段:运行环境(仅Nginx,托管静态文件)
FROM nginx:alpine
# 从构建阶段复制打包好的静态文件
COPY --from=builder /app/dist /usr/share/nginx/html
# 复制自定义nginx配置(可选)
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
进阶技巧
- 给
FROM指令加AS别名,避免用数字索引引用阶段,可读性更强
COPY --from不仅可以引用当前Dockerfile的阶段,还可以直接引用外部镜像(如COPY --from=busybox:1.36 /bin/busybox /bin/)
- 把不变的依赖配置放在前面,频繁变更的源码放在后面,最大化利用构建缓存
2. 自定义网络进阶用法与最佳实践
为什么不用默认bridge网络?
默认bridge网络存在明显缺陷:仅支持IP互访,不支持容器名/DNS解析,容器重启IP会失效;所有容器共用一个网桥,无网络隔离,安全性差;无法自定义网段、网关规则。
自定义bridge网络核心优势
- 内置DNS解析,容器之间可直接通过容器名/网络别名互访,无需硬编码IP
- 网络隔离,不同业务的容器可划分到不同网络,互不干扰
- 可自定义子网、网关、IP范围,适配企业网络规划
- 可灵活控制容器的网络接入与断开,无需重启容器
生产环境最佳实践
- 按业务维度划分网络:比如前端网络、后端业务网络、数据库网络,仅开放必要的网络连通
- 容器启动时直接指定网络,示例:
# 1. 创建业务网络
docker network create --driver bridge --subnet 172.30.0.0/16 business-net
# 2. 启动后端服务,接入业务网络
docker run -d --name user-service --network business-net user-service:v1
# 3. 启动前端服务,接入同一网络,可直接通过容器名user-service访问后端
docker run -d --name web-frontend --network business-net -p 80:80 web-frontend:v1
- 多网络接入:一个容器可同时接入多个网络,比如网关容器同时接入前端和后端网络,实现流量转发
- 非必要不使用host网络:host网络会破坏容器的网络隔离性,仅在极致性能需求场景使用
3. 数据卷核心选型与最佳实践
三种挂载方式选型对比
| 挂载类型 |
核心特点 |
适用场景 |
不适用场景 |
| 命名卷 |
Docker统一管理,生命周期独立于容器,支持备份/迁移/驱动扩展 |
生产环境数据库、业务数据持久化 |
需要在主机上频繁修改文件的场景 |
| 绑定挂载 |
直接绑定主机目录,主机与容器双向实时同步,性能最高 |
开发环境代码热更新、配置文件挂载 |
多主机集群环境、需要Docker统一管理的场景 |
| 匿名卷 |
Docker自动创建,无固定名称,生命周期默认随容器 |
临时数据存储、无需长期保留的缓存 |
生产环境核心数据持久化 |
生产环境最佳实践
- 核心数据必须用命名卷:数据库、业务文件等核心持久化数据,优先使用命名卷,避免绑定挂载的权限、路径依赖问题
- 配置文件用只读挂载 :nginx、mysql等配置文件,挂载时加
:ro只读参数,避免容器内误修改
- 禁止在容器可写层存储持久化数据:容器删除后数据会丢失,且会增大容器存储开销
- 定期备份命名卷数据 :通过
docker volume inspect查看卷的挂载路径,定期备份核心数据
- 定期清理无用卷 :执行
docker volume prune清理废弃卷,避免磁盘占用过高
4. Dockerfile 编写最佳实践清单
- 优先使用
alpine、slim版本的最小基础镜像,减小镜像体积和攻击面
- 合并
RUN指令,用&&连接多个命令,减少镜像层数,安装依赖后必须清理缓存
- 优化构建缓存:不变的内容(依赖配置、环境变量)放在前面,频繁变更的源码放在后面
- 使用非root用户运行容器,避免容器内使用root权限,提升安全性
- 禁止使用
latest标签,基础镜像和自定义镜像均指定固定版本号,避免版本不一致问题
- 使用
ENTRYPOINT+CMD的最佳组合:ENTRYPOINT指定固定启动命令,CMD指定默认参数,方便启动时传参
- 添加
HEALTHCHECK健康检查,让Docker自动检测容器运行状态,实现故障自动重启
- 禁止在Dockerfile中存储密码、密钥等敏感信息,通过环境变量或密钥管理工具注入
- 编写
.dockerignore文件,排除不需要的文件(node_modules、.git、日志等),减小构建上下文