第 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 开发的综合最佳实践。