0%

Docker 实用技巧与最佳实践

Docker 实用技巧与最佳实践

Docker 已经成为现代软件开发和部署的核心工具。在实际使用中,掌握一些实用技巧可以大大提高开发效率。本文整理了常用的 Docker 技巧和最佳实践,帮助你在日常工作中更加高效地使用 Docker。

一、Dockerfile 优化技巧

1. 多阶段构建(Multi-stage Build)

多阶段构建可以显著减小最终镜像的体积:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
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/index.js"]

2. 利用构建缓存

合理利用 Docker 的分层缓存机制,避免重复安装依赖:

1
2
3
4
5
6
7
# 优化前
RUN npm install # 每次都重新安装

# 优化后
COPY package.json package-lock.json ./
RUN npm ci # 依赖文件不变时使用缓存
COPY . .

3. 合并 RUN 指令

减少镜像层数,合并相关的 RUN 命令:

1
2
3
4
5
6
7
8
9
10
# 不推荐
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get clean

# 推荐
RUN apt-get update && \
apt-get install -y curl && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*

二、镜像管理技巧

1. 清理无用镜像和容器

定期清理可以释放磁盘空间:

1
2
3
4
5
6
7
8
9
10
11
# 删除停止的容器
docker container prune

# 删除未使用的镜像
docker image prune

# 删除所有悬空镜像
docker image prune -a

# 清理构建缓存
docker builder prune

2. 查看镜像大小

1
2
3
4
5
# 查看所有镜像及其大小
docker images

# 查看镜像各层大小
docker history <image-name>

3. 使用 alpine 基础镜像

Alpine Linux 镜像体积小(约 5MB),是构建小型镜像的理想选择:

1
2
3
4
5
# Ubuntu: ~70MB
FROM ubuntu:22.04

# Alpine: ~5MB
FROM alpine:3.18

三、容器运行技巧

1. 资源限制

防止容器耗尽主机资源:

1
2
3
4
docker run -d \
--memory="512m" \
--cpus="1.0" \
nginx

2. 健康检查(Health Check)

确保容器正常运行:

1
2
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1

在 Docker Compose 中:

1
2
3
4
5
6
7
services:
web:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3

3. 自动重启策略

1
2
3
services:
app:
restart: unless-stopped # always, on-failure, unless-stopped

四、数据持久化技巧

1. 使用命名卷

1
2
3
4
5
6
7
docker run -v mydata:/app/data nginx

# 列出所有卷
docker volume ls

# 查看卷详情
docker volume inspect mydata

2. 使用绑定挂载(Bind Mount)

1
2
# 开发时方便实时修改
docker run -v $(pwd)/app:/app -w /app node npm run dev

3. 卷备份和恢复

1
2
3
4
5
# 备份
docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar czf /backup/data-backup.tar.gz /data

# 恢复
docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar xzf /backup/data-backup.tar.gz -C /data

五、网络配置技巧

1. 使用自定义网络

1
2
3
4
5
6
# 创建自定义网络
docker network create mynetwork

# 运行容器并连接到网络
docker run -d --network mynetwork nginx
docker run -d --network mynetwork redis

2. 端口映射优化

1
2
3
4
5
# 随机映射宿主机端口
docker run -P nginx

# 指定映射范围
docker run -p 8080-8085:80 nginx

3. 容器间通信

1
2
3
# 使用容器名称通信
docker run -d --name web nginx
docker run -d --link web:web node app.js

六、Docker Compose 实用技巧

1. 环境变量管理

1
2
3
4
5
6
7
8
9
10
11
version: '3.8'

services:
app:
environment:
- NODE_ENV=${NODE_ENV:-production}
- DB_HOST=db
- DB_PORT=5432
env_file:
- .env.local
- .env.production

2. 依赖关系管理

1
2
3
4
5
6
7
services:
web:
depends_on:
db:
condition: service_healthy
redis:
condition: service_started

3. 配置共享

1
2
3
4
5
6
7
8
9
10
11
12
volumes:
node_modules:

services:
frontend:
volumes:
- node_modules:/app/node_modules
- ./frontend:/app
backend:
volumes:
- node_modules:/app/node_modules
- ./backend:/app

七、调试技巧

1. 查看容器日志

1
2
3
4
5
6
7
8
# 查看实时日志
docker logs -f <container-name>

# 查看最近 100 行
docker logs --tail 100 <container-name>

# 查看特定时间段的日志
docker logs --since 2024-01-30T10:00:00 <container-name>

2. 进入容器调试

1
2
3
4
5
# 进入运行中的容器
docker exec -it <container-name> sh

# 以特定用户运行命令
docker exec -u node -it <container-name> npm run test

3. 在容器内运行一次性命令

1
2
3
4
5
# 运行单次命令后退出
docker run --rm alpine ls -la

# 挂载当前目录运行命令
docker run --rm -v $(pwd):/workdir -w /workdir alpine ls

八、安全最佳实践

1. 不要以 root 用户运行容器

1
2
3
4
5
6
7
FROM alpine:3.18

# 创建非 root 用户
RUN addgroup -S appuser && \
adduser -S appuser -G appuser

USER appuser

2. 最小化镜像

1
2
3
4
# 不需要就移除
RUN apk add --no-cache git && \
git clone ... && \
apk del git

3. 使用 .dockerignore

类似于 .gitignore,排除不必要的文件:

1
2
3
4
5
6
.git
.gitignore
node_modules
npm-debug.log
Dockerfile
.dockerignore

九、性能优化技巧

1. 使用 .dockerignore 优化构建上下文

1
2
3
4
5
# .dockerignore 文件内容
node_modules
*.md
.git
.env.local

2. 选择合适的基础镜像

1
2
3
4
5
6
7
8
# 最小体积
FROM alpine:3.18

# 带完整工具
FROM debian:bookworm-slim

# 特定语言运行时
FROM node:18-alpine

3. 多架构构建

1
2
FROM --platform=linux/amd64 node:18-alpine AS builder-amd64
FROM --platform=linux/arm64 node:18-alpine AS builder-arm64

十、常用命令速查表

命令 说明
docker ps 列出运行中的容器
docker ps -a 列出所有容器(包括停止的)
docker images 列出所有镜像
docker rmi <image> 删除镜像
docker rm <container> 删除容器
docker exec -it <container> sh 进入容器
docker logs <container> 查看容器日志
docker stats 查看容器资源使用情况
docker system df 查看 Docker 磁盘使用情况

总结

掌握这些 Docker 技巧可以帮助你: - 提高效率:快速构建、部署和调试 - 节省资源:优化镜像大小和容器资源使用 - 增强安全性:遵循最佳实践保护系统安全 - 简化管理:使用 Docker Compose 和工具简化操作

建议在日常工作中逐步实践这些技巧,逐步建立自己的 Docker 使用习惯。


相关阅读: - OpenDDS QoS 策略完整指南 - OpenDDS 学习指南

标签: #Docker #DevOps #容器技术 #最佳实践