🐳 Docker 容器化革命#
Docker 作为容器化技术的代表,彻底改变了软件开发和部署的方式,实现了"一次构建,到处运行"的梦想。
✨ 容器化优势#
- 环境一致性: 开发、测试、生产环境完全一致
- 快速部署: 秒级启动和停止
- 资源隔离: 应用间相互独立,互不影响
- 版本控制: 镜像版本管理,支持回滚
🚀 基础概念#
1. 核心组件#
# 镜像 (Image)
docker images # 查看本地镜像
docker pull nginx:latest # 拉取镜像
docker rmi nginx:latest # 删除镜像
# 容器 (Container)
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器
docker run nginx:latest # 运行容器
docker stop <container_id> # 停止容器
2. 镜像构建#
# Dockerfile 示例
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 复制 package.json
COPY package*.json ./
# 安装依赖
RUN npm ci --only=production
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 3000
# 启动命令
CMD ["npm", "start"]
🏗️ 多阶段构建#
1. 优化镜像大小#
# 多阶段构建示例
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 生产阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
2. 安全优化#
# 使用非 root 用户
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:18-alpine
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
WORKDIR /app
COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next
COPY --from=builder --chown=nextjs:nodejs /app/public ./public
USER nextjs
EXPOSE 3000
CMD ["npm", "start"]
🔧 容器编排#
1. Docker Compose#
# docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://user:pass@db:5432/myapp
depends_on:
- db
volumes:
- ./logs:/app/logs
db:
image: postgres:15
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
postgres_data:
2. 服务管理#
# 启动服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f web
# 停止服务
docker-compose down
🌐 网络配置#
1. 网络模式#
# 创建自定义网络
docker network create my-network
# 运行容器并指定网络
docker run --network my-network --name web nginx:latest
# 查看网络信息
docker network inspect my-network
2. 端口映射#
# 随机端口映射
docker run -P nginx:latest
# 指定端口映射
docker run -p 8080:80 nginx:latest
# 绑定特定 IP
docker run -p 127.0.0.1:8080:80 nginx:latest
💾 数据管理#
1. 卷挂载#
# 命名卷
docker run -v my-data:/app/data nginx:latest
# 绑定挂载
docker run -v /host/path:/container/path nginx:latest
# 只读挂载
docker run -v /host/path:/container/path:ro nginx:latest
2. 数据持久化#
# docker-compose.yml 中的卷配置
services:
app:
image: myapp:latest
volumes:
- app_data:/app/data
- ./config:/app/config:ro
- ./logs:/app/logs
volumes:
app_data:
driver: local
driver_opts:
type: none
o: bind
device: /host/path/to/data
🔒 安全最佳实践#
1. 镜像安全#
# 使用官方基础镜像
FROM node:18-alpine
# 定期更新基础镜像
# 使用特定版本标签
FROM node:18.19.0-alpine3.18
# 扫描安全漏洞
# docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
# aquasec/trivy image myapp:latest
2. 运行时安全#
# 限制容器资源
docker run --memory=512m --cpus=1 nginx:latest
# 禁用特权模式
docker run --security-opt=no-new-privileges nginx:latest
# 只读文件系统
docker run --read-only nginx:latest
🚀 生产部署#
1. 镜像仓库#
# 推送到 Docker Hub
docker tag myapp:latest username/myapp:latest
docker push username/myapp:latest
# 推送到私有仓库
docker tag myapp:latest registry.company.com/myapp:latest
docker push registry.company.com/myapp:latest
2. 部署策略#
# 蓝绿部署
docker run -d --name app-green -p 8080:80 myapp:latest
# 测试新版本
curl http://localhost:8080/health
# 切换流量
docker stop app-blue
docker run -d --name app-blue -p 80:80 myapp:latest
docker stop app-green
📊 监控和日志#
1. 容器监控#
# 查看容器资源使用
docker stats
# 查看容器详细信息
docker inspect <container_id>
# 实时日志
docker logs -f <container_id>
2. 日志聚合#
# docker-compose.yml 日志配置
services:
app:
image: myapp:latest
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
🎯 最佳实践总结#
- 镜像优化: 使用多阶段构建,减少镜像大小
- 安全加固: 非 root 用户运行,定期更新基础镜像
- 资源管理: 合理设置内存和 CPU 限制
- 数据持久化: 使用命名卷而非绑定挂载
- 网络隔离: 创建自定义网络,限制端口暴露
- 监控日志: 配置日志轮转和监控告警
- 版本管理: 使用语义化版本标签
📚 学习资源#
掌握 Docker 容器化技术,让你的应用部署更加高效和可靠!