You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一VPS部署Prod与Pre-Prod Docker环境的方案咨询

可行部署方案

方案一:统一反向代理容器做域名转发(推荐)

这是生产环境最常用的方案,既能解决端口冲突,又能提供友好的访问方式。

  • 步骤1:创建共享Docker网络
    让Prod和Pre-Prod的所有容器加入同一个自定义网络,容器间可通过名称直接通信,无需暴露宿主机端口:

    docker network create app-shared-network
    
  • 步骤2:调整容器部署逻辑

    • Pre-Prod环境:保留pre-prod-db、pre-prod-app、pre-prod-ui容器,但不映射宿主机端口,启动时指定加入app-shared-network。
    • Prod环境:部署prod-db、prod-app、prod-ui容器,同样不映射宿主机端口,加入共享网络。容器内部端口可与Pre-Prod重复(比如Prod的app用8080,UI用9080),因为容器内端口相互独立,不会冲突。
  • 步骤3:部署统一Nginx反向代理
    只运行一个Nginx容器,占用宿主机80/443端口,挂载自定义配置和SSL证书,通过域名区分两个环境的流量:

    # 生产环境域名配置
    server {
        listen 80;
        server_name prod.yourdomain.com;
        return 301 https://$server_name$request_uri;
    }
    server {
        listen 443 ssl;
        server_name prod.yourdomain.com;
        ssl_certificate /etc/nginx/certs/prod-cert.pem;
        ssl_certificate_key /etc/nginx/certs/prod-key.pem;
    
        location /api/ {
            proxy_pass http://prod-app:8080/api/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
        location / {
            proxy_pass http://prod-ui:9080/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    
    # 预生产环境域名配置
    server {
        listen 80;
        server_name preprod.yourdomain.com;
        return 301 https://$server_name$request_uri;
    }
    server {
        listen 443 ssl;
        server_name preprod.yourdomain.com;
        ssl_certificate /etc/nginx/certs/preprod-cert.pem;
        ssl_certificate_key /etc/nginx/certs/preprod-key.pem;
    
        location /api/ {
            proxy_pass http://pre-prod-app:8081/api/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
        location / {
            proxy_pass http://pre-prod-ui:9081/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    

    启动Nginx容器时,挂载配置、证书目录并加入共享网络:

    docker run -d \
        --name unified-proxy \
        --network app-shared-network \
        -p 80:80 \
        -p 443:443 \
        -v /your/local/nginx.conf:/etc/nginx/nginx.conf \
        -v /your/local/certs:/etc/nginx/certs \
        nginx:alpine
    

方案二:端口偏移映射(适合内部测试/临时场景)

如果不想配置域名和统一代理,可给Prod环境容器映射不同的宿主机端口:

  • Prod Proxy容器:映射宿主机8080(对应容器内80)和4433(对应容器内443)
  • Prod App容器:映射宿主机8082(对应容器内8080)
  • Prod UI容器:映射宿主机9082(对应容器内9080)

这种方式的缺点是访问时需要带端口号(比如https://your-vps-ip:4433),体验较差,不适合对外公开的生产环境。

方案三:Docker Compose分环境编排

编写两个独立的Compose文件(prod.yml和preprod.yml),分别定义两个环境的服务:

  • preprod.yml中把Proxy的端口改为8080/4433,避免占用80/443
  • prod.yml中让Proxy映射宿主机80/443
  • 启动时分别执行:
    docker-compose -f prod.yml up -d
    docker-compose -f preprod.yml up -d
    

内容的提问来源于stack exchange,提问作者pappu_kutty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 17:23:12