在 Docker 中,在同一台服务器上部署多个项目是非常常见且推荐的做法。Docker 提供了容器化隔离的能力,使得多个项目可以互不干扰地运行在同一台主机上。
下面是一个完整的指南,帮助你理解如何使用 Docker 在同一台服务器上部署多个项目。
✅ 一、基本原理
Docker 容器之间默认是网络隔离的,但可以通过 Docker 网络(network)机制实现容器间的通信。每个项目可以作为一个或多个容器运行,通过不同的端口、服务名等方式区分。
✅ 二、常见的几种方式
方法 1:使用多个 docker-compose.yml 文件(推荐)
这是最常用的方式,适用于微服务架构或多项目的管理。
步骤:
-
为每个项目创建独立目录
/opt/projects/ ├── project-a │ └── docker-compose.yml ├── project-b │ └── docker-compose.yml └── ... -
编写各自的
docker-compose.yml文件示例:
project-a/docker-compose.ymlversion: '3' services: web: image: my-web-app ports: - "8080:80" db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example networks: - project-a-net networks: project-a-net: driver: bridge示例:
project-b/docker-compose.ymlversion: '3' services: backend: image: my-backend-api ports: - "8000:8000" redis: image: redis networks: - project-b-net networks: project-b-net: driver: bridge -
分别启动项目
cd /opt/projects/project-a docker-compose up -d cd /opt/projects/project-b docker-compose up -d -
查看运行状态
docker ps
方法 2:使用不同端口映射
如果你不想用 docker-compose,也可以直接使用 docker run 命令,注意指定不同的端口。
# 启动第一个 Web 项目
docker run -d -p 8080:80 --name web-project1 nginx
# 启动第二个 Web 项目
docker run -d -p 8081:80 --name web-project2 nginx
这样两个 Nginx 就可以通过 http://server-ip:8080 和 http://server-ip:8081 分别访问。
方法 3:使用反向统一入口(Nginx / Traefik)
当有多个 Web 项目时,推荐使用反向来管理访问入口,比如:
- 使用域名分流:
- project1.example.com → 容器A
- project2.example.com → 容器B
示例:使用 Nginx 反向配置
server {
listen 80;
server_name project1.example.com;
location / {
proxy_pass http://localhost:8080;
}
}
server {
listen 80;
server_name project2.example.com;
location / {
proxy_pass http://localhost:8081;
}
}
✅ 三、注意事项
| 注意事项 | 说明 |
|---|---|
| 端口冲突 | 不同项目不能绑定相同的宿主机端口,如都用了 -p 80:80 会报错。 |
| 网络隔离 | 默认不同 compose 文件中的服务无法互相访问,可通过自定义网络解决。 |
| 资源限制 | 如果项目很多,需要考虑 CPU、内存和磁盘 IO 的分配与监控。 |
| 日志管理 | 推荐使用日志驱动或将日志输出到文件,便于排查问题。 |
✅ 四、高级技巧(可选)
- 共享网络模式:某些情况下可以使用
--network container:name_or_id实现容器间共享网络。 - Docker Swarm / Kubernetes:如果项目数量庞大,建议使用编排工具进行统一管理。
- 环境变量分离:使用
.env文件管理不同项目的配置。
✅ 总结
| 部署方式 | 适用场景 | 是否推荐 |
|---|---|---|
| 多个 docker-compose.yml | 微服务、多项目 | ✅ 推荐 |
| 多个 docker run 命令 | 简单测试、临时部署 | ✅ 一般 |
| 反向 + 多端口 | Web 应用多项目 | ✅ 强烈推荐 |
| Docker Swarm/Kubernetes | 企业级大规模部署 | ✅ 高级推荐 |
如果你能提供具体项目类型(比如:Web API、前端应用、数据库等),我可以给出更具体的部署示例。欢迎继续提问!
ECLOUD博客