Appearance
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 容器化应用。