本文目录导读:

- 核心步骤概览
- 方法一:使用 Docker CLI(最常用,适用于单机或CI/CD)
- 方法二:使用 Docker Compose(适用于多服务应用)
- 方法三:使用 Cloud Build / 云服务商工具(GCP、AWS、Azure)
- 方法四:使用 BuildKit(更高效、安全的构建引擎)
- 方法五:使用 Podman / Buildah(无守护进程替代方案)
- 高级技巧与最佳实践
- 常见问题排查
- 最常用的命令组合
构建镜像是将应用及其依赖环境打包成标准化的容器镜像(如 Docker 镜像)的过程,以下是使用主流工具(以 Docker 为主要示例)构建镜像的详细步骤和常用方法。
核心步骤概览
- 准备上下文:包含应用代码、依赖文件和构建指令。
- 编写 Dockerfile:定义镜像的构建步骤。
- 执行构建命令:使用 Docker 客户端构建。
- 验证与推送:测试镜像并上传到仓库。
使用 Docker CLI(最常用,适用于单机或CI/CD)
准备工作
确保已安装 Docker Desktop 或 Docker Engine。
编写 Dockerfile
在项目根目录下创建名为 Dockerfile(无扩展名)的文件,示例(一个简单的 Node.js 应用):
# 1. 指定基础镜像 FROM node:18-alpine # 2. 设置工作目录 WORKDIR /app # 3. 复制依赖文件并安装(利用缓存优化) COPY package*.json ./ RUN npm install # 4. 复制源代码 COPY . . # 5. 暴露端口 EXPOSE 3000 # 6. 定义启动命令 CMD ["node", "app.js"]
执行构建命令
# 语法:docker build [选项] <构建上下文路径> # 常用选项: # -t, --tag : 指定镜像名称和标签(如 myapp:1.0.0) # -f : 指定 Dockerfile 路径(默认是上下文中的 Dockerfile) # --no-cache : 禁用构建缓存 docker build -t myapp:latest . # 多标签构建: docker build -t myapp:1.0.0 -t myapp:latest .
验证镜像
docker images docker run -d -p 3000:3000 myapp:latest
使用 Docker Compose(适用于多服务应用)
如果应用包含多个服务(如前端 + 后端 + 数据库),可以使用 docker-compose.yml 统一构建。
编写 docker-compose.yml
version: '3.8'
services:
web:
build: . # 使用当前目录的 Dockerfile 构建
ports:
- "3000:3000"
environment:
- NODE_ENV=production
database:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
构建与启动
# 构建或重建所有服务 docker-compose build # 构建并启动 docker-compose up --build # 构建特定服务 docker-compose build web
使用 Cloud Build / 云服务商工具(GCP、AWS、Azure)
适用于自动化 CI/CD 流水线,以 Google Cloud Build 为例:
先构建并生成构建配置(cloudbuild.yaml)
steps: - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'gcr.io/$PROJECT_ID/myimage:$SHORT_SHA', '.'] images: - 'gcr.io/$PROJECT_ID/myimage:$SHORT_SHA'
提交构建
gcloud builds submit --config cloudbuild.yaml .
其他云平台:
- AWS ECR + CodeBuild:通过
buildspec.yml配置。 - Azure ACR Tasks:使用
acr build或 YAML 定义。 - GitHub Actions / GitLab CI:直接调用
docker/build-push-action。
使用 BuildKit(更高效、安全的构建引擎)
Docker 18.09+ 内置 BuildKit,可通过环境变量启用。
# 启用 BuildKit DOCKER_BUILDKIT=1 docker build -t myapp:latest . # 或通过配置 daemon.json 永久启用
优势:并行构建、跳过无用阶段、更好的缓存管理。
使用 Podman / Buildah(无守护进程替代方案)
适用于不需要 Docker 守护进程的环境(如 Kubernetes 节点)。
Podman(命令行兼容 Docker)
podman build -t myapp:latest . podman run --rm myapp:latest
Buildah(专为构建镜像设计)
buildah bud -t myapp:latest .
高级技巧与最佳实践
多阶段构建(减少镜像体积)
# 第一阶段:编译 FROM golang:1.21 AS builder WORKDIR /app COPY . . RUN go build -o myapp # 第二阶段:最小运行环境 FROM alpine:3.18 WORKDIR /app COPY --from=builder /app/myapp . CMD ["./myapp"]
利用缓存层
- 将不变的层(如
apt-get update、依赖安装)放在前面。 - 使用
.dockerignore排除不必要的文件(如node_modules、.git)。
非 root 用户运行(安全)
RUN useradd -m -u 1000 myuser USER myuser
构建参数(--build-arg)
ARG APP_VERSION=latest ENV APP_VERSION=$APP_VERSION
构建时:--build-arg APP_VERSION=1.0
常见问题排查
| 问题 | 原因 | 解决 |
|---|---|---|
| 构建很慢 | 网络差/缓存未利用 | 使用国内镜像加速器;按缓存最佳实践调整 Dockerfile |
| 镜像过大 | 未清理临时文件 | 使用多阶段构建;单行命令中合并 RUN 并清理(&& rm -rf /var/lib/apt/lists/*) |
| 构建失败(权限/权限不足) | CNI 网络插件或存储驱动问题 | 重启 Docker;检查 daemon.json 配置;使用 --privileged 临时测试 |
| 依赖下载慢 | 基础镜像源问题 | 设置镜像源(如 npm config set registry https://registry.npmmirror.com) |
最常用的命令组合
# 一个完整的构建流程 cd /path/to/your/project # 1. 检查 Dockerfile cat Dockerfile # 2. 构建镜像 docker build -t myapp:1.0.0 . # 3. 本地测试 docker run -d -p 8080:3000 --name test-container myapp:1.0.0 # 4. 推送至仓库 docker push myregistry.com/myapp:1.0.0 # 5. 清理临时容器 docker rm -f test-container
根据你的具体技术栈和部署环境,选择适合的工具(Docker、Podman、云服务 Build),建议从简单的单阶段 Dockerfile 开始,逐步引入多阶段构建和 BuildKit 优化。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。