docker操作速查表
一、镜像操作命令
1. 镜像获取与查看
docker pull - 拉取镜像
含义 :从镜像仓库(默认Docker Hub)下载镜像到本地
场景:获取官方或第三方应用镜像
bash
# 拉取最新版nginx
docker pull nginx
# 拉取指定版本
docker pull nginx:1.21
# 从私有仓库拉取
docker pull registry.example.com/myapp:v1.0
docker images - 查看本地镜像
含义 :列出本地所有镜像,显示仓库名、标签、ID、大小等信息
场景:检查本地有哪些可用镜像,管理磁盘空间
bash
# 列出所有镜像
docker images
# 过滤特定镜像
docker images nginx
docker images --filter "dangling=true" # 查看悬空镜像
# 只显示镜像ID
docker images -q
docker search - 搜索镜像
含义 :在Docker Hub上搜索镜像
场景:查找需要的官方或社区镜像
bash
# 搜索mysql相关镜像
docker search mysql
# 限制显示数量,过滤星数
docker search --limit 10 --filter=stars=100 mysql
2. 镜像构建与打包
docker build - 构建镜像
含义 :根据Dockerfile构建自定义镜像
场景:打包应用环境,创建项目专属镜像
bash
# 基本构建(-t: 指定标签)
docker build -t myapp:v1.0 .
# 指定Dockerfile路径
docker build -f ./docker/Dockerfile -t myapp:latest .
# 构建时不使用缓存
docker build --no-cache -t myapp:v1.0 .
# 多标签构建
docker build -t myapp:v1.0 -t myapp:latest .
docker tag - 镜像打标签
含义 :为镜像创建新标签(别名),不创建副本
场景:版本标记、推送到不同仓库
bash
# 本地镜像打标签
docker tag nginx:latest mynginx:production
# 准备推送到远程仓库
docker tag myapp:v1.0 registry.example.com/myapp:v1.0
docker save/load - 镜像导入导出
含义 :将镜像保存为tar文件/从tar文件加载
场景:离线环境部署,镜像归档
bash
# 保存镜像为文件
docker save -o nginx.tar nginx:latest
docker save nginx:latest | gzip > nginx.tar.gz
# 加载镜像文件
docker load -i nginx.tar
docker load < nginx.tar.gz
3. 镜像清理
docker rmi - 删除镜像
含义 :删除一个或多个本地镜像
场景:释放磁盘空间
bash
# 删除指定镜像
docker rmi nginx:latest
# 强制删除(有容器使用也删除)
docker rmi -f nginx:latest
# 删除所有未使用的镜像
docker image prune -a
# 删除悬空镜像
docker image prune
二、容器操作命令
1. 容器生命周期
docker run - 创建并运行容器
含义 :最重要的命令,综合了创建、配置和启动
场景:启动应用服务
bash
# 基本运行(交互式)
docker run -it ubuntu:20.04 /bin/bash
# 后台运行,端口映射,命名
docker run -d \
--name web-nginx \
-p 8080:80 \
-v /data/html:/usr/share/nginx/html \
-e NGINX_HOST=example.com \
nginx:latest
# 自动删除(退出后删除容器)
docker run --rm -it ubuntu:20.04 bash
参数详解:
-d:后台运行-i:标准输入保持打开-t:分配伪终端-p:端口映射宿主机:容器-v:卷挂载宿主机目录:容器目录-e:环境变量--name:容器命名--rm:退出时自动删除
docker start/stop/restart - 容器启停
含义 :启动已停止的容器/停止运行中的容器/重启
场景:服务开关控制
bash
# 启动已存在的容器
docker start web-nginx
# 停止容器(优雅停止,SIGTERM信号)
docker stop web-nginx
# 立即强制停止(SIGKILL信号)
docker kill web-nginx
# 重启容器
docker restart web-nginx
docker exec - 进入运行中的容器
含义 :在运行容器中执行新命令
场景:调试、运维操作
bash
# 进入bash交互界面
docker exec -it web-nginx /bin/bash
# 执行单条命令
docker exec web-nginx ls /usr/share/nginx/html
# 以特定用户执行
docker exec -u root web-nginx apt-get update
docker rm - 删除容器
含义 :删除停止的容器
场景:清理不用的容器
bash
# 删除指定容器
docker rm web-nginx
# 强制删除运行中的容器(先stop再rm)
docker rm -f web-nginx
# 删除所有已停止的容器
docker container prune
docker rm $(docker ps -aq)
2. 容器查看与监控
docker ps - 查看容器列表
含义 :列出容器,默认只显示运行中的
场景:排查问题,查看状态
bash
# 运行中的容器
docker ps
# 所有容器(包括已停止)
docker ps -a
# 最近创建的容器
docker ps -l
# 只显示容器ID
docker ps -q
# 自定义输出格式
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
docker logs - 查看日志
含义 :获取容器的标准输出和错误信息
场景:排查应用问题
bash
# 查看全部日志
docker logs web-nginx
# 实时跟踪日志
docker logs -f web-nginx
# 查看最后100行
docker logs --tail 100 web-nginx
# 带时间戳
docker logs -ft web-nginx
docker inspect - 查看详细信息
含义 :返回Docker对象的底层元数据(JSON格式)
场景:获取容器/镜像的IP、卷挂载、网络等配置
bash
# 查看容器信息
docker inspect web-nginx
# 查看镜像信息
docker inspect nginx:latest
# 提取特定字段
docker inspect -f '{{.NetworkSettings.IPAddress}}' web-nginx
docker inspect -f '{{.Mounts}}' web-nginx
docker stats - 资源监控
含义 :实时显示容器资源使用情况
场景:性能分析,资源监控
bash
# 所有容器统计
docker stats
# 特定容器
docker stats web-nginx
# 不持续刷新,单次输出
docker stats --no-stream
三、容器与镜像的关联操作
docker commit - 容器提交为镜像
含义 :将容器的当前状态保存为新镜像
场景:调试后的快照保存(不推荐用于生产)
bash
# 从容器创建镜像
docker commit web-nginx my-nginx-debug:v1
# 添加提交信息
docker commit -m "added debug tools" web-nginx my-nginx-debug:v1
docker cp - 容器与主机间复制文件
含义 :在容器和宿主机文件系统间复制数据
场景:配置文件导入导出
bash
# 从容器复制到宿主机
docker cp web-nginx:/etc/nginx/nginx.conf ./nginx.conf
# 从宿主机复制到容器
docker cp ./index.html web-nginx:/usr/share/nginx/html/
docker export/import - 容器文件系统导出(与save/load不同)
含义 :导出容器的文件系统(不含镜像历史和元数据)
场景:创建精简的镜像
bash
# 导出容器文件系统
docker export web-nginx > container.tar
# 导入为镜像(会丢失历史层和信息)
docker import container.tar my-nginx-flat:latest
四、命令区别与关联总结
关键概念对比
| 对比项 | 说明 | 使用场景 |
|---|---|---|
| run vs start | run = create + start,创建新容器;start启动已存在的容器 | run用于首次启动;start用于重启暂停的服务 |
| stop vs kill | stop发送SIGTERM(可处理优雅退出);kill发送SIGKILL(强制) | stop用于正常关闭;kill用于卡死无响应 |
| save/load vs export/import | save保留镜像所有层和历史;export只保留文件系统 | save用于完整备份;export用于精简传输 |
| commit vs build | commit从容器生成(黑箱);build从Dockerfile生成(可追溯) | build用于生产;commit仅用于临时调试 |
| exec vs attach | exec新启进程;attach连接主进程的输出 | exec用于运维;attach查看主进程输出 |
操作流程图
镜像操作: 容器操作:
docker pull ──┐
docker build ─┤
docker tag ─┤ docker create (从镜像创建容器)
├──> 镜像 ──> docker run (创建+启动)
docker save ─┘ docker start/stop/restart (生命周期)
docker load ──> 镜像 docker exec (进入容器)
docker rmi ──> 删除 docker logs/inspect/ps (查看)
docker rm (删除容器)
关联操作:
docker commit: 容器 ──> 镜像
docker cp: 主机 <──> 容器
实用命令组合示例
bash
# 停止并删除所有容器
docker stop $(docker ps -aq) && docker rm $(docker ps -aq)
# 清理所有未使用的资源(容器、镜像、网络、卷)
docker system prune -a --volumes
# 进入当前唯一运行的容器
docker exec -it $(docker ps -q) bash
# 查看容器资源使用排序(CPU)
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}" | sort -k 2 -rh
# 批量删除包含特定名称的镜像
docker images | grep "none" | awk '{print $3}' | xargs docker rmi
五、dockerfile编写指南
Dockerfile 基础概念
Dockerfile 是一个文本文件,包含构建镜像所需的所有指令。每条指令在镜像中创建一个层,通过 docker build 逐条执行。
构建上下文 :执行 docker build 时,Docker 客户端会将当前目录(或指定路径)的所有文件发送到 Docker 守护进程作为构建上下文。
核心指令详解
1. 基础定义指令
FROM - 指定基础镜像
dockerfile
FROM <image>[:<tag>] [AS <name>]
含义 :定义构建的基础镜像,必须是 Dockerfile 的第一条指令(ARG 除外)
场景:选择操作系统或预装环境
dockerfile
# 使用官方镜像
FROM ubuntu:22.04
# 使用特定平台版本
FROM --platform=linux/amd64 node:18-alpine
# 多阶段构建
FROM golang:1.19 AS builder
# ... 构建过程
FROM alpine:latest
COPY --from=builder /app/binary /app/
最佳实践:
- 优先使用官方镜像
- 使用特定标签而非
latest - 使用轻量级基础镜像(alpine/slim)
LABEL - 添加元数据
dockerfile
LABEL <key>=<value> <key>=<value> ...
含义 :为镜像添加元数据(作者、版本、描述等)
场景:镜像管理和自动化
dockerfile
LABEL maintainer="admin@example.com"
LABEL version="1.0"
LABEL description="This is a web application"
# 多标签合并(减少层数)
LABEL maintainer="admin" \
version="1.0" \
description="Web app"
MAINTAINER (已废弃)
dockerfile
MAINTAINER <name>
已不推荐使用,用 LABEL maintainer 替代。
2. 配置与环境指令
ENV - 设置环境变量
dockerfile
ENV <key>=<value>
含义 :设置环境变量,在构建和运行时都生效
场景:配置应用参数、路径设置
dockerfile
# 单个设置
ENV APP_HOME /app
# 多个设置
ENV APP_HOME=/app \
APP_PORT=8080 \
NODE_ENV=production
# 使用环境变量
WORKDIR $APP_HOME
COPY . $APP_HOME
注意:
- ENV 在构建阶段和容器运行时都可见
- 持久化存储,会随镜像层保存
ARG - 构建参数
dockerfile
ARG <name>[=<default value>]
含义 :定义构建时变量,仅在构建过程中可用
场景:传递构建参数(版本号、密钥等)
dockerfile
# 定义ARG
ARG VERSION=1.0
ARG BUILD_DATE
# 使用ARG
RUN echo "Building version ${VERSION}"
# 从命令行传递
# docker build --build-arg VERSION=2.0 --build-arg BUILD_DATE=2024-01-01 .
ARG vs ENV 的关键区别:
| 特性 | ARG | ENV |
|---|---|---|
| 定义方式 | ARG VAR=value |
ENV VAR=value |
| 构建时可用 | ✓ | ✓ |
| 运行时可用 | ✗ | ✓ |
| 继承到子镜像层 | ✗ | ✓ |
| 安全性 | 适合敏感信息 | 会保留在最终镜像 |
| 命令行传递 | --build-arg |
不支持 |
ARG 和 ENV 的关联示例:
dockerfile
ARG NODE_VERSION=18
ENV NODE_VERSION=$NODE_VERSION
# 这样 NODE_VERSION 在运行时也可用
# 使用预定义ARG
ARG TARGETPLATFORM # 构建平台信息
ARG BUILDPLATFORM
WORKDIR - 设置工作目录
dockerfile
WORKDIR /path/to/workdir
含义 :设置后续指令的执行目录(RUN, CMD, ENTRYPOINT, COPY, ADD)
场景:统一操作路径,避免路径混乱
dockerfile
# 设置并创建目录
WORKDIR /app
# 相对路径 - 基于上一级WORKDIR
WORKDIR /usr
WORKDIR local/src # 实际路径:/usr/local/src
# 环境变量使用
ENV PROJECT_ROOT /opt/project
WORKDIR $PROJECT_ROOT
最佳实践:
- 优先使用 WORKDIR 而非
RUN cd /some/path - 使用绝对路径更清晰
- WORKDIR 会自动创建不存在的目录
3. 文件操作指令
COPY - 复制文件
dockerfile
COPY [--chown=<user>:<group>] <src>... <dest>
含义 :从构建上下文中复制文件到镜像
场景:添加应用代码、配置文件
dockerfile
# 基本用法
COPY app.js /app/
COPY package*.json ./
# 复制目录
COPY src/ /app/src/
# 多文件复制
COPY package.json package-lock.json ./
# 指定所有者和组(需要数字ID)
COPY --chown=1000:1000 app /app
# 多阶段构建复制
FROM builder AS build-stage
# ...
FROM nginx:alpine
COPY --from=build-stage /app/dist /usr/share/nginx/html
# 通配符
COPY *.go /app/
COPY go.* /app/
ADD - 高级复制
dockerfile
ADD [--chown=<user>:<group>] <src>... <dest>
含义 :类似 COPY,但有额外功能
场景:需要自动解压或从URL获取文件
dockerfile
# 自动解压tar文件
ADD app.tar.gz /opt/
# 从URL下载(不推荐)
ADD https://example.com/file.tar.gz /tmp/
# 通配符(类似COPY)
ADD *.go /app/
COPY vs ADD 的关键区别:
| 特性 | COPY | ADD |
|---|---|---|
| 基本文件复制 | ✓ | ✓ |
| 自动解压 tar 文件 | ✗ | ✓ |
| 从 URL 下载 | ✗ | ✓ |
| 多阶段构建 --from | ✓ | ✓ |
| 推荐程度 | 首选 | 特殊场景 |
最佳实践:
- 绝大多数场景使用 COPY
- ADD 仅在需要自动解压时使用
- 不要用 ADD 从 URL 下载(用 RUN wget/curl 更可控)
4. 构建执行指令
RUN - 执行命令
dockerfile
RUN <command> (shell 形式)
RUN ["executable", "param1", "param2"] (exec 形式)
含义 :在镜像构建时执行命令,会创建新的镜像层
场景:安装软件包、编译代码、配置系统
dockerfile
# Shell形式(运行在 /bin/sh -c)
RUN apt-get update
RUN apt-get install -y nginx
# Exec形式(不调用Shell)
RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "nginx"]
# 优化:合并多个命令减少层数
RUN apt-get update && \
apt-get install -y \
nginx \
curl \
vim && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 管道命令优化
RUN wget -O - https://some.site | wc -l > /number
最佳实践:
- 合并相关命令减少层数
- 清理临时文件减少镜像体积
- 使用
&&确保命令执行失败时停止
CMD - 默认执行命令
dockerfile
CMD ["executable","param1","param2"] (exec 形式,推荐)
CMD command param1 param2 (shell 形式)
含义 :定义容器启动时默认执行的命令
场景:定义应用启动命令
dockerfile
# Exec形式(推荐)
CMD ["nginx", "-g", "daemon off;"]
# Shell形式
CMD nginx -g 'daemon off;'
# 作为ENTRYPOINT的参数
ENTRYPOINT ["node"]
CMD ["app.js"] # 相当于执行 node app.js
ENTRYPOINT - 入口点命令
dockerfile
ENTRYPOINT ["executable", "param1", "param2"] (exec 形式)
ENTRYPOINT command param1 param2 (shell 形式)
含义 :配置容器以可执行方式运行,CMD 为其提供默认参数
场景:制作工具类容器、预配置启动脚本
dockerfile
# 固定入口,CMD提供默认参数
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]
# 覆盖ENTRYPOINT
# docker run --entrypoint /bin/bash myimage
# Shell形式的局限(不会接收CMD参数)
ENTRYPOINT exec nginx -g "daemon off;"
CMD vs ENTRYPOINT vs RUN 的区别与关联:
| 特性 | RUN | CMD | ENTRYPOINT |
|---|---|---|---|
| 执行时机 | 构建时 | 运行时 | 运行时 |
| Dockerfile位置 | 中间 | 末尾 | 末尾(在CMD前) |
| 覆盖方式 | 不可覆盖 | docker run 命令 |
--entrypoint |
| 主要用途 | 安装软件、编译 | 默认应用命令 | 容器固定入口 |
CMD 与 ENTRYPOINT 的组合使用:
dockerfile
# 场景1:灵活的启动配置
ENTRYPOINT ["nginx"]
CMD ["-g", "daemon off;"]
# 可以覆盖CMD:docker run myimage -t # 测试配置
# 场景2:固定配置的工具类
ENTRYPOINT ["curl"]
CMD ["--help"]
# docker run myimage -v http://api.example.com
# 场景3:完整应用启动
COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["postgres"]
EXPOSE - 声明端口
dockerfile
EXPOSE <port> [<port>/<protocol>...]
含义 :声明容器运行时监听的端口(仅是文档性质)
场景:告知使用者应用使用的端口
dockerfile
# 声明单个端口
EXPOSE 80
# 声明多个端口
EXPOSE 80/tcp
EXPOSE 80/udp
EXPOSE 80 443
# 配合运行时使用
# docker run -p 8080:80 myimage
注意:
- EXPOSE 不实际发布端口,仅作为文档
- 实际需要在运行时用
-p或-P映射端口
5. 高级构建指令
VOLUME - 创建挂载点
dockerfile
VOLUME ["/data"]
VOLUME /path/to/volume
含义 :创建匿名卷挂载点
场景:持久化数据、共享数据
dockerfile
# 单个卷
VOLUME /var/log
# 多个卷(JSON格式)
VOLUME ["/var/log", "/var/db"]
# 使用场景
FROM mysql:8.0
VOLUME /var/lib/mysql # 数据持久化
重要提示:
- VOLUME 创建的卷在容器删除时不会自动删除
- 匿名卷命名由Docker管理
- 运行时卷映射会覆盖此设置
USER - 切换用户
dockerfile
USER <user>[:<group>]
含义 :指定后续指令的执行用户
场景:安全运行,避免 root 权限
dockerfile
# 创建并切换用户
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser
# 临时切换(在RUN中)
USER root
RUN apt-get update && apt-get install -y package
USER appuser
# 使用数字ID
USER 1000:1000
HEALTHCHECK - 健康检查
dockerfile
HEALTHCHECK [OPTIONS] CMD <command>
含义 :定义容器健康检查命令
场景:监控应用状态,配合编排工具
dockerfile
# 基本用法
HEALTHCHECK --interval=30s \
--timeout=3s \
--retries=3 \
CMD curl -f http://localhost/ || exit 1
# 禁用继承的健康检查
HEALTHCHECK NONE
参数说明:
--interval:检查间隔(默认 30s)--timeout:超时时间(默认 30s)--retries:失败重试次数(默认 3)--start-period:启动缓冲期
SHELL - 指定默认Shell
dockerfile
SHELL ["executable", "parameters"]
含义 :替换默认的 /bin/sh -c Shell
场景:在 Windows 镜像中使用 PowerShell,或需要特定 Shell 特性
dockerfile
# Windows镜像使用PowerShell
SHELL ["powershell", "-Command"]
# 使用bash特性
SHELL ["/bin/bash", "-c"]
RUN source ~/.bashrc && command
# 查看当前Shell
# SHELL指令影响后续所有Shell形式的指令
指令执行顺序与层级关系
Dockerfile 推荐结构
dockerfile
# 1. 基础镜像
FROM node:18-alpine AS builder
# 2. 元数据
LABEL maintainer="team@example.com"
# 3. 构建参数
ARG NODE_ENV=production
# 4. 环境变量
ENV APP_HOME=/app
# 5. 工作目录
WORKDIR $APP_HOME
# 6. 依赖安装(利用缓存)
COPY package*.json ./
RUN npm ci --only=production
# 7. 应用代码
COPY . .
# 8. 构建步骤
RUN npm run build
# 9. 运行配置
EXPOSE 3000
USER node
HEALTHCHECK --interval=30s CMD node healthcheck.js
# 10. 启动命令
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["node", "server.js"]
缓存优化策略
dockerfile
# 不好的做法(每次代码变更都会重新安装依赖)
COPY . /app
RUN npm install
# 好的做法(利用层缓存)
COPY package.json package-lock.json /app/
RUN npm ci
COPY . /app
实际应用示例
示例1:Node.js 应用多阶段构建
dockerfile
# 构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 生产阶段
FROM node:18-alpine
RUN apk add --no-cache tini
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
USER node
EXPOSE 3000
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["node", "dist/server.js"]
示例2:Go 语言静态编译
dockerfile
# 编译阶段
FROM golang:1.19-alpine AS builder
WORKDIR /build
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
# 运行阶段(最小镜像)
FROM scratch
COPY --from=builder /build/app /app
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
EXPOSE 8080
ENTRYPOINT ["/app"]
最佳实践总结
指令选择指南
- FROM:总是使用特定标签,优先 alpine/slim 版本
- COPY vs ADD:默认用 COPY,需要解压用 ADD
- ENV vs ARG:运行时需要就用 ENV,构建时参数用 ARG
- CMD vs ENTRYPOINT:单独定义启动,配合使用提供灵活性
- RUN:合并命令,清理缓存
构建效率优化
dockerfile
# 使用 .dockerignore 排除不需要的文件
# .dockerignore
node_modules
.git
*.log
# 多阶段构建减少大小
# 利用构建缓存 - 变动小的放前面
安全最佳实践
dockerfile
# 1. 使用非root用户
RUN useradd -r -u 1001 appuser
USER appuser
# 2. 扫描漏洞
# docker scan myimage
# 3. 签名镜像
# export DOCKER_CONTENT_TRUST=1
--no-cache # 避免缓存过期问题