Skip to content
On this page

Docker 容器化实践

Docker 已经成为现代应用部署的标准工具,本文将介绍一些 Docker 容器化的最佳实践。

编写高效的 Dockerfile

使用多阶段构建

多阶段构建可以减小最终镜像的大小。

shell
# 第一阶段:构建
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 第二阶段:运行
FROM node:16-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm install --only=production
EXPOSE 3000
CMD ["npm", "start"]

使用 .dockerignore 文件

创建 .dockerignore 文件来排除不需要的文件,减小构建上下文。

node_modules
npm-debug.log
.DS_Store
.git
.gitignore
build

使用具体的标签

使用具体的标签而不是 latest,确保构建的可重复性。

shell
# 正确的做法
FROM node:16.14.0-alpine

# 错误的做法
FROM node:latest

优化镜像大小

使用 Alpine 基础镜像

Alpine 镜像体积小,安全性高。

shell
FROM alpine:3.14

减少层数

合并多个 RUN 指令,减少镜像层数。

shell
# 正确的做法
RUN apk add --no-cache \
    gcc \
    g++ \
    make \
    python3

# 错误的做法
RUN apk add --no-cache gcc
RUN apk add --no-cache g++
RUN apk add --no-cache make
RUN apk add --no-cache python3

清理临时文件

在同一个 RUN 指令中清理临时文件,避免产生额外的层。

shell
RUN apk add --no-cache curl \
    && curl -sL https://github.com/example/app/releases/download/v1.0.0/app.tar.gz | tar -xz \
    && apk del curl

容器编排

使用 Docker Compose

对于多容器应用,使用 Docker Compose 进行编排。

yaml
version: '3'
services:
  web:
    build: .
    ports:
      - "80:80"
    depends_on:
      - db
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: app

使用环境变量

使用环境变量来配置容器,避免硬编码。

shell
ENV NODE_ENV=production
ENV PORT=3000

安全最佳实践

扫描镜像漏洞

使用工具扫描镜像中的安全漏洞。

bash
docker scan myapp:latest

以非 root 用户运行

在容器中以非 root 用户运行应用,提高安全性。

shell
FROM node:16-alpine
RUN adduser -D appuser
USER appuser
WORKDIR /app

限制容器资源

为容器设置资源限制,避免资源耗尽。

yaml
# docker-compose.yml
services:
  web:
    image: myapp:latest
    resources:
      limits:
        cpus: '0.5'
        memory: '512M'

监控和日志

使用日志驱动

配置适当的日志驱动,便于日志收集和分析。

yaml
# docker-compose.yml
services:
  web:
    image: myapp:latest
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

监控容器状态

使用 Docker 内置的监控工具或第三方工具监控容器状态。

bash
docker stats

通过遵循这些最佳实践,可以构建更加高效、安全、可维护的 Docker 容器化应用。