在一个服务器上部署多个项目并运行多个 Docker 容器是一种非常常见且高效的实践。以下是详细的步骤和最佳实践,帮助你实现这一目标。
✅ 一、准备工作
-
安装 Docker 和 Docker Compose
# 安装 Docker sudo apt update sudo apt install docker.io -y sudo systemctl enable docker sudo systemctl start docker # 添加当前用户到 docker 组(避免每次使用 sudo) sudo usermod -aG docker $USER # 重新登录或执行:newgrp docker # 安装 Docker Compose sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
✅ 二、为每个项目创建独立的目录结构
建议每个项目一个独立目录,例如:
/srv/projects/
├── project-a/
│ ├── docker-compose.yml
│ └── .env
├── project-b/
│ ├── docker-compose.yml
│ └── .env
└── project-c/
├── docker-compose.yml
└── nginx.conf
✅ 三、使用 docker-compose.yml 部署多个项目
示例:Project A(Node.js 应用)
# /srv/projects/project-a/docker-compose.yml
version: '3.8'
services:
web:
image: node:16-alpine
working_dir: /app
volumes:
- ./app:/app
ports:
- "3000:3000"
environment:
- NODE_ENV=production
command: npm start
示例:Project B(Python Flask + Nginx)
# /srv/projects/project-b/docker-compose.yml
version: '3.8'
services:
backend:
build: ./flask-app
ports:
- "5000"
environment:
- FLASK_ENV=production
nginx:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- backend
✅ 四、使用不同端口避免冲突
确保每个项目的容器暴露的端口不冲突:
| 项目 | 外部端口 | 内部服务 |
|---|---|---|
| Project A | 3000 | Node.js |
| Project B | 8080 | Nginx → Flask (5000) |
| Project C | 80 | Web Server |
⚠️ 注意:不要让多个服务绑定同一个外部端口(如都用 80)。
✅ 五、使用 Nginx 反向X_X统一入口(推荐)
如果你希望所有项目共用 80/443 端口,可通过 Nginx 反向X_X按域名分发请求。
1. 创建反向X_X项目
mkdir /srv/projects/reverse-proxy
cd /srv/projects/reverse-proxy
2. 编写 docker-compose.yml
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./conf.d:/etc/nginx/conf.d
- ./ssl:/etc/nginx/ssl
restart: unless-stopped
3. 配置虚拟主机(按域名)
# /srv/projects/reverse-proxy/conf.d/project-a.conf
server {
listen 80;
server_name a.yourdomain.com;
location / {
proxy_pass http://host.docker.internal:3000; # 或使用自定义网络连接其他容器
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
💡 提示:也可以将各项目注册到同一个 Docker 自定义网络中,通过服务名通信。
✅ 六、使用 Docker 自定义网络(高级)
让多个项目容器之间安全通信:
# 创建共享网络
docker network create app-network
# 在 compose 文件中指定网络
# services:
# web:
# networks:
# - app-network
#
# networks:
# app-network:
# external: true
✅ 七、常用命令管理多个项目
# 进入项目目录启动
cd /srv/projects/project-a
docker-compose up -d
# 查看状态
docker-compose ps
# 停止
docker-compose down
# 查看日志
docker-compose logs -f
全局查看所有容器:
docker ps
✅ 八、安全与维护建议
-
使用
.env文件管理环境变量# .env DB_PASSWORD=secret123 PORT=3000在
docker-compose.yml中引用${DB_PASSWORD} -
定期更新镜像
docker-compose pull && docker-compose up -d -
资源限制(可选)
deploy: resources: limits: memory: 512M cpus: '0.5' -
日志轮转
在daemon.json中配置日志大小限制。
✅ 九、可选工具增强管理
-
Portainer:图形化管理多个容器
docker run -d -p 9000:9000 --name portainer -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce -
Watchtower:自动更新镜像
docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
✅ 总结
| 目标 | 方法 |
|---|---|
| 部署多个项目 | 每个项目独立 docker-compose.yml |
| 避免端口冲突 | 使用不同外部端口或 Nginx 反向X_X |
| 统一访问入口 | Nginx 根据域名路由 |
| 容器间通信 | Docker 自定义网络 |
| 易于管理 | Portainer / Watchtower 辅助 |
如果你提供具体项目类型(如 Vue + Spring Boot + Django),我可以给出更具体的部署方案。欢迎继续提问!
CLOUD云