【容器-docker】docker操作速查表

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 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 # 避免缓存过期问题

相关推荐
SelectDB12 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
曲幽19 小时前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
武子康3 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn866 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker