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 应用多阶段构建
dockerfile
# 第一阶段:构建环境(完整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 应用多阶段构建
dockerfile
# 第一阶段:构建环境(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范围,适配企业网络规划
- 可灵活控制容器的网络接入与断开,无需重启容器
生产环境最佳实践
- 按业务维度划分网络:比如前端网络、后端业务网络、数据库网络,仅开放必要的网络连通
- 容器启动时直接指定网络,示例:
bash
# 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、日志等),减小构建上下文