同一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),因为容器内端口相互独立,不会冲突。
- Pre-Prod环境:保留
步骤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/443prod.yml中让Proxy映射宿主机80/443- 启动时分别执行:
docker-compose -f prod.yml up -d docker-compose -f preprod.yml up -d
内容的提问来源于stack exchange,提问作者pappu_kutty
相关产品推荐
相关产品推荐

