在一台服务器上管理多个 Docker 应用,核心思路是隔离、编排、监控与自动化。以下是系统化的实践方案:
✅ 一、基础准备
-
统一安装 Docker(推荐 v20+)
# Ubuntu/Debian curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER newgrp docker # 或重新登录 -
启用 Docker Compose(v2.x 已内置)
检查版本:docker compose version
✅ 二、项目组织策略(关键!)
📁 目录结构建议
/opt/docker-apps/
├── web-frontend/
│ ├── docker-compose.yml
│ ├── .env
│ └── nginx.conf
├── api-backend/
│ ├── docker-compose.yml
│ └── app.py
├── database/
│ └── postgres/
│ ├── docker-compose.yml
│ └── init.sql
└── monitoring/
└── prometheus-grafana/
└── docker-compose.yml
✅ 优势:
- 每个应用独立
docker-compose.yml,避免配置冲突 .env文件隔离敏感信息(如 DB 密码)- 便于按服务重启/备份/迁移
✅ 三、常用操作命令
| 场景 | 命令 |
|---|---|
| 启动单个应用 | cd /opt/docker-apps/web-frontend && docker compose up -d |
| 查看所有容器 | docker ps -a --format "table {{.Names}}t{{.Status}}" |
| 日志聚合查看 | docker compose logs -f --tail=50(在对应目录)或全局: journalctl -u docker + docker logs $(docker ps -q) |
| 批量停止所有自定义容器 | docker stop $(docker ps -aq --filter "label=com.docker.compose.project" | grep -v '^$') |
| 清理未使用资源 | docker system prune -a --volumes(⚠️谨慎!先确认无重要数据) |
💡 提示:为每个
docker-compose.yml添加labels实现统一识别:labels: - "com.example.app=web-frontend" - "com.example.env=production"
✅ 四、进阶管理方案
🔹 方案 A:Docker Compose Profile(轻量级多环境)
同一 compose 文件支持不同配置集:
# docker-compose.yml
services:
app:
image: myapp
profiles: ["dev", "prod"]
deploy:
resources:
limits:
cpus: '0.5' # dev 默认限制
restart: unless-stopped
db:
profiles: ["prod"] # 仅 prod 启用
image: postgres:15
启动方式:
docker compose --profile dev up -d # 开发模式
docker compose --profile prod up -d # 生产模式
🔹 方案 B:Traefik 反向X_X + Let’s Encrypt(多域名 HTTPS)
- 部署 Traefik 作为入口网关
- 各服务通过标签自动注册路由:
labels: - "traefik.http.routers.web-frontend.rule=Host(`app.example.com`)" - "traefik.http.services.web-frontend.loadbalancer.server.port=80" - "traefik.http.middlewares.ssl-redirect.redirectscheme.scheme=https" - 自动申请 SSL 证书(需公网 IP + DNS 解析)
🔹 方案 C:CI/CD 自动化部署
结合 GitHub Actions / GitLab CI:
# .github/workflows/deploy.yml
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy to server
run: |
ssh user@server "cd /opt/docker-apps/api-backend && docker compose pull && docker compose up -d --force-recreate"
✅ 五、监控与运维建议
| 工具 | 用途 |
|---|---|
| Portainer | Web UI 可视化管理(适合中小规模) |
| Prometheus + Grafana | 指标采集 + 仪表盘(CPU/内存/请求延迟) |
| Logspout / Loki | 集中式日志收集 |
| Healthcheck 脚本 | 自定义健康检查(如定期 ping 数据库) |
示例:在 docker-compose.yml 中添加健康检查:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
timeout: 10s
retries: 3
⚠️ 注意事项
- 资源限制:为每个服务设置 CPU/内存上限,防止单应用拖垮服务器
deploy: resources: limits: cpus: '1.0' memory: 512M - 数据安全:卷持久化路径避免
/tmp,优先用/data/volumes/xxx - 网络隔离:不同应用用独立网络(
networks:定义),减少横向攻击风险 - 定期更新:建立镜像扫描流程(Trivy / Grype),及时修复漏洞
需要我针对你的具体场景(如:微服务架构?静态网站集群?含数据库的单体应用?)提供定制化 docker-compose.yml 模板或部署脚本吗?
CLOUD技术笔记