通过 Dockerfile 模板、多阶段构建、安全加固、生产最佳实践、Docker Compose 模式以及故障排除指南增强 Docker。
Docker Plus. 增强Docker的模板, 安全加固, 以及生产最佳做法.是一项面向实际任务的技能,主要用于Features.;Dockerfile 模板: 通用语言的准备使用模板. 多级构建 : Op。
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
增强版 Docker:内置模板、安全加固及生产环境最佳实践。
| 任务 | 命令 |
|---|---|
| 构建 | docker build -t app:latest . |
| 运行 | docker run -d -p 8080:80 app:latest |
| 查看日志 | docker logs -f container_name |
| 进入容器执行命令 | docker exec -it container_name sh |
| 清理系统资源 | docker system prune -af |
# 构建阶段 FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . RUN npm run build # 生产阶段 FROM node:20-alpine WORKDIR /app RUN addgroup -g 1001 -S nodejs && adduser -S nextjs -u 1001 COPY --from=builder --chown=nextjs:nodejs /app/dist ./dist COPY --from=builder --chown=nextjs:nodejs /app/node_modules ./node_modules USER nextjs EXPOSE 3000 CMD ["node", "dist/index.js"]
# 构建阶段 FROM python:3.11-slim AS builder WORKDIR /app COPY requirements.txt . RUN pip install --user --no-cache-dir -r requirements.txt # 生产阶段 FROM python:3.11-slim WORKDIR /app RUN groupadd -r appuser && useradd -r -g appuser appuser COPY --from=builder /root/.local /root/.local COPY . . ENV PATH=/root/.local/bin:$PATH USER appuser EXPOSE 8000 CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
# 构建阶段 FROM golang:1.21-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 GOOS=linux go build -o main . # 生产阶段 FROM alpine:3.18 RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=builder /app/main . CMD ["./main"]
# 构建阶段 FROM rust:1.72 AS builder WORKDIR /app COPY . . RUN cargo build --release # 生产阶段 FROM debian:bookworm-slim RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && rm -rf /var/lib/apt/lists/* COPY --from=builder /app/target/release/myapp /usr/local/bin/ CMD ["myapp"]
# 阶段 1:依赖安装 FROM node:20-alpine AS deps WORKDIR /app COPY package*.json ./ RUN npm ci # 阶段 2:构建 FROM node:20-alpine AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . RUN npm run build # 阶段 3:生产运行 FROM node:20-alpine WORKDIR /app COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules CMD ["node", "dist/index.js"]
# 以非 root 用户运行 RUN addgroup -g 1001 -S appgroup && adduser -u 1001 -S appuser -G appgroup USER appuser # 文件系统设为只读 RUN chmod -R 555 /app # 卸载不必要的软件包 RUN apt-get purge -y --auto-remove curl wget # 设置正确权限 RUN chown -R appuser:appgroup /app
# 不在镜像中存储密钥 ARG DB_PASSWORD ENV DB_PASSWORD=$DB_PASSWORD # 使用具体版本号(避免使用 latest) FROM node:20.10.0-alpine3.18 # 扫描漏洞 RUN apk add --no-cache trivy # 启用健康检查(作为安全扫描的一部分) HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 CMD curl -f http://localhost:8080/health || exit 1
version: '3.8'
services:
app:
build: .
ports:
- "8080:8080"
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://user:pass@db:5432/app
depends_on:
db:
condition: service_healthy
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
db:
image: postgres:15-alpine
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=app
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d app"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 CMD curl -f http://localhost:8080/health || exit 1
# 使用 JSON 格式日志 RUN npm install winston # 输出日志至 stdout/stderr(容器日志标准方式) CMD ["node", "dist/index.js"]
# 运行时设置资源限制 docker run -d --name app --memory="512m" --cpus="0.5" --pids-limit=100 -p 8080:8080 app:latest
| 问题 | 解决方案 |
|---|---|
| 容器立即退出 | 检查日志:docker logs container_name |
| 端口已被占用 | 停止已有容器,或修改端口映射 |
| 因内存不足被 OOM 终止 | 增加内存限制(--memory) |
| 权限拒绝(Permission denied) | 检查文件所有权及 Dockerfile 中的 USER 指令 |
| DNS 解析失败 | 使用自定义网络,而非默认 bridge 网络 |
# 查看容器实时日志(最近 100 行) docker logs -f --tail 100 container_name # 检查容器详细配置 docker inspect container_name # 进入容器执行交互式命令 docker exec -it container_name sh # 查看容器资源使用情况 docker stats container_name # 查看容器内进程列表 docker top container_name