共计 2531 个字符,预计需要花费 7 分钟才能阅读完成。
简介
Docker的多阶段构建(Multi-stage builds)和多架构构建(Multi-platform builds)是两个强大的特性,可以帮助我们优化镜像大小并支持不同的硬件架构。本文将详细介绍这两个特性的实践应用。
1. Docker安装
首先需要在系统中安装Docker。以Ubuntu系统为例,执行以下步骤:
# step 1: 安装必要的系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 添加软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
提示: 这里使用了阿里云的镜像源,可以提高国内下载速度。
2. 多阶段构建
多阶段构建可以显著减小最终镜像的大小。下面是一个Java应用的多阶段构建示例:
# 构建阶段
FROM eclipse-temurin:21.0.2_13-jdk-jammy AS builder
WORKDIR /opt/app
COPY .mvn/ .mvn
COPY mvnw pom.xml ./
RUN ./mvnw dependency:go-offline
COPY ./src ./src
RUN ./mvnw clean install
# 运行阶段
FROM eclipse-temurin:21.0.2_13-jre-jammy AS final
WORKDIR /opt/app
EXPOSE 8080
COPY --from=builder /opt/app/target/*.jar /opt/app/*.jar
ENTRYPOINT ["java", "-jar", "/opt/app/*.jar"]
这个多阶段构建的优点是:
- 使用JDK镜像进行构建
- 使用更小的JRE镜像运行
- 最终镜像中不包含源码和构建工具
3. 多架构构建
3.1 初始化构建器
首先需要创建一个buildx构建器:
# 创建基本构建器
docker buildx create --use --name mybuild
# 如果需要代理,可以这样创建:
docker buildx create --name myproxybuilder \
--driver-opt env.http_proxy=http://192.168.8.28:2080 \
--driver-opt env.https_proxy=http://192.168.8.28:2080
3.2 基础镜像一致的情况
当不同架构使用相同的基础镜像时:
# syntax=docker/dockerfile:1
FROM --platform=$BUILDPLATFORM golang:alpine AS build
ARG TARGETPLATFORM
ARG BUILDPLATFORM
RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" > /log
FROM alpine
COPY --from=build /log /log
ENTRYPOINT ["cat","/log"]
3.3 基础镜像不一致的情况
当需要为不同架构使用不同的基础镜像时:
# syntax=docker/dockerfile:1
FROM openjdk:8-jdk AS base-amd64
FROM arm64v8/openjdk:8-jdk AS base-arm64
FROM maven:3.8.6-openjdk-8 AS build
WORKDIR /app
COPY ./pom.xml pom.xml
RUN mvn install
COPY ./src src/
RUN mvn package -DskipTests
FROM base-${TARGETARCH}
WORKDIR /app
COPY --from=build /app/target/my-java-app-1.0.jar app.jar
CMD ["java", "-jar", "app.jar"]
4. GitHub Actions自动构建
可以使用GitHub Actions来自动化多架构镜像的构建和推送:
name: Build and push image
on:
push:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: Build and push by action
uses: docker/build-push-action@v6
with:
push: true
tags: deeplythink/java-hello-world:latest-action
platforms: linux/amd64,linux/arm64
- name: Build and push by script
run: |
make image
5. 参考资源
- Docker官方文档: docs.docker.com
- 示例项目: java-hello-world
- Docker Hub: hub.docker.com
正文完