2026-06-15
Docker容器化部署的完整指南
作者:Elegy
深入理解Docker容器化技术与最佳实践
Docker已经成为现代应用部署的标准工具。本文将深入讲解Docker的核心概念和生产环境的最佳实践。
🐋 Docker核心概念
镜像(Image)vs 容器(Container)
- 镜像:应用的只读模板,包含代码、运行时、库等
- 容器:镜像的运行实例,可以启动、停止、删除
# 查看本地镜像
docker images
# 运行容器
docker run -d -p 8080:80 nginx
# 查看运行中的容器
docker ps
📝 编写高效的Dockerfile
基础示例
# 使用官方Node.js镜像作为基础镜像
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 复制package.json和package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm ci --only=production
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 3000
# 启动应用
CMD ["node", "server.js"]
⚡ 优化技巧
1. 利用构建缓存
# ❌ 不好的做法 - 每次代码改动都要重新安装依赖
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN npm install
# ✅ 好的做法 - 分层构建,利用缓存
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production # 这层会被缓存
COPY . . # 只有这层需要重建
2. 多阶段构建
# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 生产阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/server.js"]
3. 减小镜像大小
# 使用Alpine Linux(更小的基础镜像)
FROM node:18-alpine
# 清理不必要的文件
RUN npm ci --only=production && \
npm cache clean --force
# 使用.dockerignore排除不必要的文件
# .dockerignore 内容:
# node_modules
# npm-debug.log
# .git
# .env
🔧 Docker Compose实战
管理多容器应用:
version: '3.8'
services:
# Web应用
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://db:5432/myapp
depends_on:
- db
- redis
volumes:
- ./logs:/app/logs
# PostgreSQL数据库
db:
image: postgres:15-alpine
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=secret
volumes:
- postgres_data:/var/lib/postgresql/data