Docker 容器化部署实践
为什么要容器化
传统部署方式常常面临”在我机器上能跑”的问题。Docker 通过将应用及其依赖打包成镜像,确保了环境的一致性。
编写 Dockerfile
一个 Node.js 项目的多阶段构建示例:
# 构建阶段
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 AS runner
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/index.js"]多阶段构建的好处是最终镜像只包含运行时必要的文件,体积更小。
Docker Compose 编排
对于多服务应用,使用 Docker Compose 来编排:
version: "3.8"
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://db:5432/myapp
depends_on:
- db
- redis
db:
image: postgres:16-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
- POSTGRES_DB=myapp
- POSTGRES_PASSWORD=secret
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
pgdata:常用命令速查
| 命令 | 说明 |
|---|---|
docker build -t myapp . | 构建镜像 |
docker run -d -p 3000:3000 myapp | 后台运行容器 |
docker compose up -d | 启动所有服务 |
docker compose logs -f web | 查看服务日志 |
docker system prune -a | 清理未使用资源 |
生产环境注意事项
- 不要在镜像中存储敏感信息,使用环境变量或 secrets
- 设置健康检查确保服务可用性
- 限制容器资源使用,避免单个容器耗尽主机资源
- 使用
.dockerignore排除不必要的文件
容器化是现代应用部署的基础,掌握 Docker 能让你的部署流程更加可靠和高效。
