Docker 容器化实践指南
Docker 是目前最流行的容器化平台之一,它可以帮助开发者快速构建、部署和运行应用程序。本文将详细介绍 Docker 的核心概念和实践方法。
基础概念
1. 核心组件
- 镜像(Image): 只读的应用程序模板
- 容器(Container): 镜像的运行实例
- 仓库(Repository): 存储镜像的地方
- Dockerfile: 构建镜像的配置文件
2. 容器 vs 虚拟机
| 特性 | 容器 | 虚拟机 |
|---|
| 启动时间 | 秒级 | 分钟级 |
| 资源占用 | 小 | 大 |
| 隔离性 | 进程级 | 系统级 |
| 性能 | 高 | 中等 |
3. 架构原理
- 客户端-服务器架构
- 命令行客户端
- 守护进程(Docker daemon)
REST API
安装与配置
1. 安装 Docker
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh
brew install docker
|
2. 配置加速器
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://mirror.ccs.tencentyun.com"] } EOF
sudo systemctl restart docker
|
3. 用户权限
sudo usermod -aG docker $USER
newgrp docker
|
常用命令
1. 镜像管理
docker pull nginx:latest
docker images
docker rmi nginx:latest
docker build -t my-app:1.0 .
docker push my-app:1.0
|
2. 容器操作
docker run -d -p 8080:80 --name my-app my-app:1.0
docker ps
docker stop my-app
docker start my-app
docker rm my-app
|
3. 数据管理
docker run -d -v /host/path:/container/path nginx
docker volume create my-data
docker volume ls
|
Dockerfile 最佳实践
1. 基础示例
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./ RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
|
2. 多阶段构建
FROM node:18 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;"]
|
3. 优化技巧
- 使用具体的基础镜像版本
- 合并 RUN 命令减少层数
- 利用 .dockerignore 排除无关文件
- 使用多阶段构建减少镜像大小
Docker Compose
1. 基础配置
version: '3.8' services: web: build: . ports: - "3000:3000" environment: - NODE_ENV=production depends_on: - db db: image: postgres:13 environment: POSTGRES_DB: myapp POSTGRES_USER: user POSTGRES_PASSWORD: password volumes: - postgres_data:/var/lib/postgresql/data
volumes: postgres_data:
|
2. 常用命令
docker-compose up -d
docker-compose ps
docker-compose logs -f
docker-compose down
|
3. 环境变量管理
DB_HOST=localhost DB_PORT=5432 NODE_ENV=development
services: web: env_file: - .env
|
高级应用
1. 网络配置
docker network create my-network
docker run -d --name web --network my-network nginx docker run -d --name db --network my-network postgres
|
2. 资源限制
docker run -d --name my-app \ --memory="512m" \ --cpus="0.5" \ my-app:1.0
|
3. 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD curl -f http://localhost:3000/health || exit 1
|
监控与日志
1. 容器监控
docker stats
docker inspect my-app
|
2. 日志管理
docker logs -f my-app
docker run --log-driver=json-file \ --log-opt max-size=10m \ --log-opt max-file=3 \ my-app:1.0
|
3. 监控工具
- Portainer: Docker 管理界面
- cAdvisor: 容器资源监控
- Prometheus + Grafana: 完整监控解决方案
安全最佳实践
1. 镜像安全
- 使用官方基础镜像
- 定期更新基础镜像
- 扫描镜像漏洞
- 最小化镜像大小
2. 容器安全
- 以非 root 用户运行
- 限制容器权限
- 使用命名空间隔离
- 定期更新 Docker 版本
3. 网络安全
- 使用自定义网络
- 限制端口暴露
- 配置防火墙规则
- 使用 TLS 加密
生产环境部署
1. Docker Swarm
docker swarm init
docker stack deploy -c docker-compose.yml myapp
|
2. Kubernetes
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: my-app:1.0 ports: - containerPort: 3000
|
3. CI/CD 集成
name: Build and Push Docker Image on: push: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Build Docker image run: docker build -t my-app:latest . - name: Push Docker image run: | docker tag my-app:latest my-dockerhub/my-app:latest docker push my-dockerhub/my-app:latest
|
Docker 容器化技术已经成为现代软件开发的标准实践,掌握 Docker 可以大大提高开发效率和部署可靠性。