如何在一个服务器上部署多个项目,搭建多个docker?

在一个服务器上部署多个项目并运行多个 Docker 容器是一种非常常见且高效的实践。以下是详细的步骤和最佳实践,帮助你实现这一目标。


✅ 一、准备工作

  1. 安装 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

✅ 八、安全与维护建议

  1. 使用 .env 文件管理环境变量

    # .env
    DB_PASSWORD=secret123
    PORT=3000

    docker-compose.yml 中引用 ${DB_PASSWORD}

  2. 定期更新镜像

    docker-compose pull && docker-compose up -d
  3. 资源限制(可选)

    deploy:
     resources:
       limits:
         memory: 512M
         cpus: '0.5'
  4. 日志轮转
    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),我可以给出更具体的部署方案。欢迎继续提问!