上一篇 下一篇 分享链接 返回 返回顶部

Docker 近期更新梳理:BuildKit、Compose V2 与生产配置一次讲清

发布人:慈云数据-客服中心 发布时间:15小时前 阅读量:2

Docker 最新更新内容汇总|附配置文件

说明:本文基于截至 2024 年 6 月左右的 Docker 官方公开更新信息进行整理,重点覆盖 Docker Engine、Docker Desktop、Docker Compose、BuildKit、镜像构建、安全能力、网络与运行时等方面的变化。由于 Docker 更新频率较高,生产环境升级前建议再次核对官方 Release Notes,并在测试环境完成验证。


一、前言:为什么要关注 Docker 最新更新?

Docker 作为容器化技术生态中最常用的工具之一,已经从早期的“容器运行工具”逐渐发展为覆盖镜像构建、容器运行、开发环境管理、供应链安全、云原生交付等多个场景的完整平台。

对于开发者而言,Docker 的更新通常意味着:

  • 镜像构建速度更快;
  • Compose 编排能力更强;
  • 本地开发环境更接近生产环境;
  • 安全扫描、SBOM、签名、凭据管理更加完善;
  • 对新版本 Linux 内核、cgroup、containerd、BuildKit 的支持更完整。

对于运维和平台团队而言,Docker 的每一次更新都可能影响:

  • CI/CD 构建流程;
  • 镜像仓库兼容性;
  • 生产容器运行参数;
  • 日志、网络、存储驱动;
  • 安全基线与权限控制;
  • 老版本配置是否仍然兼容。

因此,及时了解 Docker 最新更新内容,并结合合理的配置文件,是保障开发效率和生产稳定性的重要工作。


二、Docker Engine 近期重点更新

Docker Engine 是 Docker 的核心组件,主要负责镜像管理、容器运行、网络、存储、日志以及与 containerd、runc 等底层组件交互。

近期 Docker Engine 的更新重点主要集中在以下几个方向。


1. BuildKit 默认构建能力持续增强

BuildKit 是 Docker 新一代镜像构建后端,相比传统构建器,它具备更好的缓存能力、更快的并行构建速度,以及更强的安全特性。

在新版本 Docker 中,BuildKit 已经成为推荐甚至默认的构建方式。常见优势包括:

  • 支持更智能的构建缓存;
  • 支持 RUN --mount=type=cache
  • 支持 RUN --mount=type=secret
  • 支持多平台镜像构建;
  • 支持构建阶段导出缓存;
  • 支持更清晰的构建日志输出;
  • 更适合 CI/CD 场景。

例如,在 Dockerfile 中可以这样使用缓存挂载:

# syntax=docker/dockerfile:1.7

FROM node:20-alpine AS builder

WORKDIR /app

COPY package*.json ./

RUN --mount=type=cache,target=/root/.npm \
    npm ci

COPY . .

RUN npm run build

FROM nginx:alpine

COPY --from=builder /app/dist /usr/share/nginx/html

EXPOSE 80

上面的配置中:

RUN --mount=type=cache,target=/root/.npm npm ci

可以缓存 npm 依赖下载目录,避免每次构建都重新下载依赖,从而明显提升构建速度。


2. 多平台镜像构建更加成熟

随着 ARM 架构设备的普及,例如 Apple Silicon、ARM 服务器、边缘计算设备等,多平台镜像构建变得越来越重要。

Docker 通过 buildx 支持构建多平台镜像,例如:

docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t registry.example.com/demo/app:1.0.0 \
  --push .

这条命令会同时构建 linux/amd64linux/arm64 架构镜像,并推送到镜像仓库。

新版本 Docker 对 buildx、BuildKit、QEMU 模拟等能力的整合更加顺畅,使开发者可以更方便地在本地或 CI/CD 中完成多平台镜像发布。


3. containerd 集成持续深化

Docker 底层长期依赖 containerd 作为容器运行时管理组件。近年来,Docker 与 containerd 的集成持续增强,尤其是在镜像存储、运行时管理和 Kubernetes 生态兼容性方面。

对于普通用户来说,这类变化通常不会直接影响日常命令,例如:

docker run
docker build
docker pull
docker push

这些命令仍然保持熟悉的使用方式。

但对于平台团队来说,需要关注:

  • containerd 版本变化;
  • runc 版本变化;
  • 镜像存储格式;
  • snapshotter 支持;
  • rootless 模式兼容性;
  • 与 Kubernetes 或其他容器平台的兼容性。

4. cgroup v2 支持更加完善

在较新的 Linux 发行版中,cgroup v2 已经逐渐成为默认配置,例如较新版本的 Ubuntu、Debian、Fedora、RHEL 系发行版等。

Docker 新版本对 cgroup v2 的支持更加完善,尤其是在资源限制方面。

例如:

docker run -d \
  --name nginx-demo \
  --memory=512m \
  --cpus=1.5 \
  nginx:alpine

这条命令限制容器最多使用 512MB 内存和 1.5 个 CPU。

在 cgroup v2 环境下,Docker 对 CPU、内存、I/O 等资源限制的行为更加符合新内核机制。


5. Rootless 模式持续优化

Rootless Docker 允许用户在不使用 root 权限的情况下运行 Docker Daemon 和容器,对于安全要求较高的开发环境或共享服务器非常有价值。

Rootless 模式的优势包括:

  • 降低 Docker Daemon 被攻击后的风险;
  • 避免普通用户直接获得 root 等价权限;
  • 更适合多用户开发机;
  • 适合安全隔离要求更高的场景。

不过 Rootless 模式也存在一些限制,例如:

  • 低端口绑定需要额外配置;
  • 网络性能可能与 root 模式略有差异;
  • 某些存储驱动或内核特性受限;
  • 部分老旧镜像或特权容器场景不适合。

启用 Rootless Docker 后,通常需要配置用户级 systemd 服务,并设置环境变量。

示例:

export DOCKER_HOST=unix:///run/user/1000/docker.sock

也可以写入 shell 配置文件:

echo 'export DOCKER_HOST=unix:///run/user/1000/docker.sock' >> ~/.bashrc
source ~/.bashrc

三、Docker Desktop 最新更新重点

Docker Desktop 是开发者在 Windows、macOS 和 Linux 桌面环境中使用 Docker 的主要工具。

近期 Docker Desktop 的更新重点主要包括以下几个方向。


1. 启动速度和资源占用优化

Docker Desktop 近年来持续优化启动速度、虚拟机资源占用和文件系统性能。

尤其是在 macOS 和 Windows 环境中,Docker Desktop 需要通过虚拟化层运行 Linux 容器,因此性能一直是用户关注的重点。

常见优化方向包括:

  • 减少 Docker Desktop 启动时间;
  • 改善文件共享性能;
  • 优化 bind mount 目录同步;
  • 降低空闲状态资源占用;
  • 改进 WSL 2 后端体验;
  • 优化 Apple Silicon 原生运行体验。

对于前端、Node.js、Java、Go、Python 等项目,依赖目录较多时,文件挂载性能会明显影响开发体验,因此这部分优化很重要。


2. Docker Scout 安全能力增强

Docker Scout 是 Docker 推出的软件供应链安全工具,用于分析镜像漏洞、依赖风险、基础镜像更新建议等。

常见能力包括:

  • 镜像漏洞扫描;
  • 依赖包风险分析;
  • 基础镜像升级建议;
  • SBOM 分析;
  • 与 Docker Hub、CI/CD 集成;
  • 对镜像安全策略进行评估。

示例命令:

docker scout quickview nginx:alpine

查看镜像漏洞:

docker scout cves nginx:alpine

对企业来说,Docker Scout 可以帮助团队更早发现镜像中的高危漏洞,避免问题进入生产环境。


3. Docker Desktop 设置管理更加细化

新版 Docker Desktop 在资源配置、代理、镜像加速、Kubernetes、扩展插件等方面提供了更细化的设置。

常见可配置项包括:

  • CPU 核数;
  • 内存大小;
  • Swap 大小;
  • 磁盘镜像位置;
  • 代理地址;
  • 文件共享目录;
  • Kubernetes 开关;
  • 镜像仓库认证;
  • Docker Extensions;
  • WSL 发行版集成。

对于公司内部开发环境,可以通过统一配置文件或管理策略减少环境差异。


四、Docker Compose 更新重点

Docker Compose 是本地开发和轻量级部署中非常常用的编排工具。新版本 Compose 主要以 Docker CLI 插件形式存在,即:

docker compose

而不是旧版本的:

docker-compose

虽然旧命令在很多环境中仍然可用,但官方更推荐使用新版命令格式。


1. Compose V2 成为主流

Compose V2 使用 Go 语言实现,并作为 Docker CLI 插件集成。

主要优势包括:

  • 与 Docker CLI 集成更紧密;
  • 跨平台体验更一致;
  • 支持更多 Compose Specification 特性;
  • 性能更好;
  • 后续维护更活跃。

查看版本:

docker compose version

2. Compose Watch 改善开发体验

Compose Watch 可以监听本地文件变化,并自动同步、重建或重启服务。

示例:

docker compose watch

compose.yaml 中可以配置:

services:
  app:
    build: .
    command: npm run dev
    ports:
      - "3000:3000"
    develop:
      watch:
        - action: sync
          path: ./src
          target: /app/src
        - action: rebuild
          path: package.json

这表示:

  • src 目录变化时,同步到容器;
  • package.json 变化时,重新构建镜像。

对于前端、Node.js、Python、Go 等项目来说,这可以减少手动重启容器的操作。


3. Compose 文件规范更加统一

新版 Compose 更强调使用 compose.yamlcompose.yml,而不是旧式的 docker-compose.yml。当然,旧文件名仍然通常可以兼容。

推荐文件名:

compose.yaml

示例:

services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"

启动:

docker compose up -d

停止:

docker compose down

查看日志:

docker compose logs -f

五、镜像构建与 Dockerfile 新特性

Dockerfile 仍然是 Docker 使用中最核心的文件之一。随着 BuildKit 和 Dockerfile frontend 的升级,Dockerfile 支持了更多高级写法。


1. 推荐声明 Dockerfile syntax

在 Dockerfile 顶部声明 syntax,可以使用较新的 Dockerfile 特性:

# syntax=docker/dockerfile:1.7

完整示例:

# syntax=docker/dockerfile:1.7

FROM golang:1.22-alpine AS builder

WORKDIR /src

COPY go.mod go.sum ./

RUN --mount=type=cache,target=/go/pkg/mod \
    go mod download

COPY . .

RUN --mount=type=cache,target=/root/.cache/go-build \
    go build -o /out/app ./cmd/server

FROM alpine:3.20

RUN addgroup -S app && adduser -S app -G app

WORKDIR /app

COPY --from=builder /out/app /app/app

USER app

EXPOSE 8080

ENTRYPOINT ["/app/app"]

这个 Dockerfile 体现了几个推荐实践:

  • 使用多阶段构建;
  • 缓存 Go 模块;
  • 缓存 Go 编译产物;
  • 运行时镜像使用更小的 Alpine;
  • 创建非 root 用户;
  • 最终镜像不包含源码和编译工具。

2. Secret 挂载更加安全

在构建镜像时,很多人会遇到私有仓库 token、npm token、pip token、SSH key 等敏感信息。

不推荐这样写:

ARG TOKEN
RUN curl -H "Authorization: Bearer $TOKEN" https://example.com

因为 token 可能进入构建历史或缓存中。

更推荐使用 BuildKit secret:

# syntax=docker/dockerfile:1.7

FROM alpine

RUN --mount=type=secret,id=mytoken \
    TOKEN=$(cat /run/secrets/mytoken) && \
    echo "Use token securely"

构建命令:

docker build \
  --secret id=mytoken,src=./token.txt \
  -t demo:secure .

这样 secret 不会直接写入镜像层中,安全性更高。


六、Docker Daemon 配置文件示例

Docker 的核心配置文件通常位于:

/etc/docker/daemon.json

下面给出一个较完整的生产环境参考配置。

{
  "data-root": "/var/lib/docker",
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "5"
  },
  "exec-opts": ["native.cgroupdriver=systemd"],
  "storage-driver": "overlay2",
  "live-restore": true,
  "default-address-pools": [
    {
      "base": "172.30.0.0/16",
      "size": 24
    }
  ],
  "registry-mirrors": [
    "https://mirror.example.com"
  ],
  "insecure-registries": [
    "registry.local:5000"
  ],
  "features": {
    "buildkit": true
  },
  "experimental": false,
  "iptables": true,
  "ipv6": false
}

配置说明:

配置项 说明
data-root Docker 数据目录,包含镜像、容器、卷等数据
log-driver 容器日志驱动
max-size 单个日志文件最大大小
max-file 日志文件保留数量
exec-opts 设置 cgroup driver
storage-driver 存储驱动,Linux 上常用 overlay2
live-restore Docker daemon 重启时尽量保持容器运行
default-address-pools 默认网络地址池,避免与内网网段冲突
registry-mirrors 镜像加速地址
insecure-registries HTTP 或自签名证书私有仓库
features.buildkit 启用 BuildKit
experimental 是否启用实验特性
iptables 是否允许 Docker 管理 iptables
ipv6 是否启用 IPv6

修改后重启 Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

查看配置是否生效:

docker info

七、Compose 项目配置文件示例

下面是一个较完整的 Web 应用开发环境 compose.yaml 示例,包含应用、数据库、Redis、网络、卷、健康检查等配置。

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: demo-app:latest
    container_name: demo-app
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      APP_ENV: development
      DB_HOST: mysql
      DB_PORT: 3306
      DB_USER: app
      DB_PASSWORD: app_password
      DB_NAME: app_db
      REDIS_HOST: redis
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_started
    volumes:
      - ./config:/app/config:ro
      - ./logs:/app/logs
    networks:
      - app-net
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://localhost:8080/health"]
      interval: 10s
      timeout: 3s
      retries: 5
      start_period: 20s

  mysql:
    image: mysql:8.4
    container_name: demo-mysql
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: app_db
      MYSQL_USER: app
      MYSQL_PASSWORD: app_password
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-net
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-proot_password"]
      interval: 10s
      timeout: 5s
      retries: 10

  redis:
    image: redis:7-alpine
    container_name: demo-redis
    restart: unless-stopped
    command: ["redis-server", "--appendonly", "yes"]
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    networks:
      - app-net

networks:
  app-net:
    driver: bridge

volumes:
  mysql-data:
  redis-data:

启动服务:

docker compose up -d

查看服务状态:

docker compose ps

查看日志:

docker compose logs -f app

停止并删除容器:

docker compose down

如果需要连同数据卷一起删除:

docker compose down -v

八、生产环境推荐配置

在生产环境中使用 Docker,需要比本地开发更加重视稳定性、安全性和可观测性。


1. 限制容器资源

不要让容器无限制使用主机资源。

示例:

services:
  app:
    image: demo-app:1.0.0
    deploy:
      resources:
        limits:
          cpus: "2.0"
          memory: 1024M
        reservations:
          cpus: "0.5"
          memory: 256M

需要注意的是,deploy 字段在 Swarm 中支持更完整;普通 docker compose 场景下,部分资源限制字段的行为需要根据 Compose 版本确认。

也可以使用命令行:

docker run -d \
  --name app \
  --memory=1g \
  --cpus=2 \
  demo-app:1.0.0

2. 配置日志轮转

生产环境中,如果不限制容器日志大小,可能导致磁盘被日志打满。

推荐在 /etc/docker/daemon.json 中配置:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "5"
  }
}

单个容器也可以单独配置:

docker run -d \
  --name nginx \
  --log-driver=json-file \
  --log-opt max-size=50m \
  --log-opt max-file=3 \
  nginx:alpine

3. 使用非 root 用户运行容器

Dockerfile 中建议创建普通用户:

FROM alpine:3.20

RUN addgroup -S app && adduser -S app -G app

WORKDIR /app

COPY app /app/app

USER app

ENTRYPOINT ["/app/app"]

这样即使应用被入侵,攻击者也不会直接获得容器内 root 权限。


4. 避免使用 latest 标签

生产环境不建议使用:

image: demo-app:latest

推荐使用明确版本号:

image: demo-app:1.2.3

或者使用镜像 digest:

image: demo-app@sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

这样可以避免镜像内容变化导致部署不可控。


5. 定期清理无用资源

查看磁盘占用:

docker system df

清理无用容器、网络、镜像缓存:

docker system prune

清理构建缓存:

docker builder prune

谨慎清理所有未使用镜像:

docker system prune -a

生产环境执行清理操作前应确认不会删除仍需回滚使用的镜像。


九、CI/CD 中的 Docker 推荐配置

在 CI/CD 中,Docker 常用于构建镜像、运行测试、推送镜像仓库。

下面是一个 GitHub Actions 示例。

name: Docker Build

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    permissions:
      contents: read
      packages: write

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to Registry
        uses: docker/login-action@v3
        with:
          registry: registry.example.com
          username: ${{ secrets.REGISTRY_USERNAME }}
          password: ${{ secrets.REGISTRY_PASSWORD }}

      - name: Build and Push
        uses: docker/build-push-action@v5
        with:
          context: .
          platforms: linux/amd64,linux/arm64
          push: true
          tags: |
            registry.example.com/demo/app:${{ github.sha }}
            registry.example.com/demo/app:latest
          cache-from: type=gha
          cache-to: type=gha,mode=max

这个流程包含:

  • 检出代码;
  • 初始化 Buildx;
  • 登录镜像仓库;
  • 构建多平台镜像;
  • 使用 GitHub Actions 缓存;
  • 推送镜像。

如果是生产环境,建议不要只依赖 latest,而应使用 Git SHA、版本号或构建号作为镜像标签。


十、升级 Docker 前的检查清单

在升级 Docker 之前,建议完成以下检查。

1. 查看当前版本

docker version
docker compose version
docker info

2. 备份关键配置

sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak

如果 Docker 数据目录有特殊配置,也需要确认:

docker info | grep "Docker Root Dir"

3. 检查容器和镜像

docker ps -a
docker images
docker volume ls
docker network ls

4. 检查 Compose 文件兼容性

重点检查:

  • 是否使用过旧字段;
  • 是否依赖 version 字段;
  • 是否使用旧命令 docker-compose
  • 是否使用 Swarm 专属配置;
  • 是否存在不兼容的网络或卷配置。

5. 在测试环境验证

建议至少验证:

  • 容器能否正常启动;
  • 网络是否正常;
  • 数据卷是否正常挂载;
  • 日志是否正常输出;
  • 健康检查是否正常;
  • CI/CD 构建是否成功;
  • 镜像推送和拉取是否正常。

十一、常见问题与建议

1. 是否必须升级到最新版本?

不一定。

如果是个人开发环境,可以较快跟进新版本,获得更好的开发体验。

如果是生产环境,应优先选择稳定版本,并结合企业内部测试流程进行升级。不要在没有验证的情况下直接升级生产 Docker Engine。


2. Docker Compose 的 version 字段还需要写吗?

新版 Compose Specification 已经不再强制要求写 version 字段。

过去常见写法:

version: "3.8"
services:
  app:
    image: nginx

现在可以简化为:

services:
  app:
    image: nginx

这也是当前更推荐的写法。


3. Docker Desktop 和 Docker Engine 有什么区别?

简单来说:

  • Docker Engine 是核心运行引擎;
  • Docker Desktop 是桌面端集成工具;
  • Docker Desktop 内部包含 Docker Engine、Compose、Buildx、Kubernetes 可选组件、图形界面等;
  • Linux 服务器通常安装 Docker Engine;
  • Windows/macOS 开发机通常使用 Docker Desktop。

4. 是否应该启用 BuildKit?

建议启用。

BuildKit 在性能、安全性和功能上都明显优于旧构建器,尤其适合现代项目的镜像构建。

可通过环境变量临时启用:

DOCKER_BUILDKIT=1 docker build -t demo .

也可以通过 daemon 配置启用:

{
  "features": {
    "buildkit": true
  }
}

十二、总结

Docker 最新更新的核心方向可以概括为:

  1. 构建更快:BuildKit、buildx、多平台构建和缓存能力持续增强;
  2. 开发更顺畅:Docker Desktop、Compose Watch、文件同步和资源管理不断优化;
  3. 安全更完善:Docker Scout、SBOM、secret 挂载、非 root 运行等能力更加成熟;
  4. 运行更稳定:cgroup v2、containerd、日志轮转、资源限制和网络配置持续改进;
  5. 配置更规范:推荐使用 compose.yaml、明确镜像标签、合理配置 daemon.json
  6. 生产更可控:升级前备份、测试验证、限制资源、控制日志、避免 latest 标签。

对于开发团队来说,建议尽快熟悉 docker compose、BuildKit、buildx 和 Docker Scout 等新能力;对于生产运维团队,则应重点关注 Docker Engine 版本兼容性、daemon 配置、日志策略、镜像安全和升级流程。

合理使用 Docker 的新特性,不仅可以提升开发效率,也能显著改善镜像构建速度、部署稳定性和系统安全性。

目录结构
全文