强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

第 17 章:Docker 容器化

第 17 章:Docker 容器化

17.1 Docker 基础

Dockerfile 最佳实践

# 基础镜像
FROM denoland/deno:2.0

# 设置工作目录
WORKDIR /app

# 复制依赖文件(利用缓存层)
COPY deno.json .
COPY deno.lock .

# 缓存依赖
RUN deno install

# 复制源代码
COPY . .

# 暴露端口
EXPOSE 8000

# 启动命令
CMD ["deno", "run", "--allow-net", "--allow-env", "main.ts"]

多阶段构建

# ====== 构建阶段 ======
FROM denoland/deno:2.0 AS builder

WORKDIR /app
COPY deno.json deno.lock ./
COPY src/ ./src/

# 编译为独立可执行文件
RUN deno compile \
  --allow-net \
  --allow-env \
  --allow-read \
  --output server \
  src/main.ts

# ====== 生产阶段 ======
FROM debian:bookworm-slim AS production

# 安装 ca-certificates(HTTPS 请求需要)
RUN apt-get update && \
    apt-get install -y --no-install-recommends ca-certificates && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app

# 从构建阶段复制编译后的可执行文件
COPY --from=builder /app/server .

# 设置非 root 用户
RUN useradd -r -s /bin/false deno
USER deno

EXPOSE 8000

CMD ["./server"]

多阶段构建的优势

阶段大小说明
构建阶段~800MB包含 Deno、源码
生产阶段~80MB只有可执行文件

17.2 缓存优化

利用层缓存

FROM denoland/deno:2.0

WORKDIR /app

# 第 1 层:依赖文件(变化最少)
COPY deno.json deno.lock ./

# 第 2 层:缓存依赖(只在依赖变化时重建)
RUN deno install --allow-scripts

# 第 3 层:源代码(变化最频繁)
COPY . .

CMD ["deno", "run", "--allow-net", "main.ts"]

依赖缓存目录

# 指定缓存目录
ENV DENO_DIR=/deno-dir
RUN mkdir -p $DENO_DIR

# 在缓存层中预下载依赖
COPY deno.json deno.lock ./
RUN deno install

17.3 Docker Compose

基本配置

# docker-compose.yml
version: "3.8"

services:
  app:
    build: .
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgres://user:password@db:5432/mydb
      - NODE_ENV=production
    depends_on:
      - db
      - redis
    restart: unless-stopped

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  postgres_data:

完整的 Dockerfile(生产级)

FROM denoland/deno:2.0 AS builder

WORKDIR /app
COPY deno.json deno.lock ./
COPY src/ ./src/
COPY static/ ./static/

# 编译
RUN deno compile \
  --allow-net \
  --allow-env \
  --allow-read \
  --output server \
  src/main.ts

# 生产镜像
FROM debian:bookworm-slim

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
      ca-certificates \
      tini && \
    rm -rf /var/lib/apt/lists/*

RUN useradd -r -s /bin/false deno

WORKDIR /app
COPY --from=builder --chown=deno:deno /app/server .
COPY --from=builder --chown=deno:deno /app/static ./static

USER deno
EXPOSE 8000

# 使用 tini 作为 PID 1(正确处理信号)
ENTRYPOINT ["tini", "--"]
CMD ["./server"]

17.4 安全最佳实践

镜像安全

实践说明
使用官方基础镜像denoland/deno:2.0
最小化镜像使用多阶段构建,只保留必要文件
非 root 用户使用 USER deno 运行应用
扫描漏洞使用 docker scan 或 Trivy
固定版本使用具体版本而非 latest

运行时安全

# docker-compose.yml — 安全配置
services:
  app:
    build: .
    security_opt:
      - no-new-privileges:true
    read_only: true
    tmpfs:
      - /tmp
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 512M

17.5 本章小结

要点说明
基础镜像denoland/deno:2.0
多阶段构建构建 + 生产分离
缓存优化依赖层在源码层之前
Compose管理多容器应用
安全非 root、最小权限、资源限制

📖 扩展阅读


下一章第 18 章:最佳实践 → Deno 开发的综合最佳实践。