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

如何在Docker中通过不同公网URL共享同一端口运行多容器?

当然可以实现!不过得靠反向代理做域名路由

直接像你尝试的那样给两个容器都绑定主机的8090端口会立刻冲突——因为同一台机器上的TCP端口只能被一个进程占用。正确的思路是用反向代理容器作为统一入口,它绑定主机的8090端口,然后根据请求的域名,把流量转发到对应的后端容器。

最省心的工具是jwilder/nginx-proxy这个镜像,它会自动监听Docker容器的启停事件,读取容器的VIRTUAL_HOST环境变量,自动生成Nginx反向代理配置,完全不用手动改配置文件。

具体实现步骤

1. 启动反向代理容器

先运行代理容器,它负责接收所有8090端口的请求,并根据域名转发:

docker run -d -p 8090:80 --name nginx-proxy -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
  • -p 8090:80:把主机的8090端口映射到代理容器的80端口(代理内部用80处理请求)
  • -v /var/run/docker.sock:/tmp/docker.sock:ro:挂载Docker的socket文件,让代理能实时感知容器的变化,自动更新路由配置

2. 启动你的业务容器

现在启动两个静态站点容器,不需要再绑定主机的8090端口,只需要设置VIRTUAL_HOST指定对应的域名即可:

# 第一个站点
docker run --name test1 -e VIRTUAL_HOST=site1.example.com -e AUTHOR="test1" -d dockersamples/static-site

# 第二个站点
docker run --name test2 -e VIRTUAL_HOST=site2.example.com -e AUTHOR="test2" -d dockersamples/static-site

3. 配置域名解析

你需要让site1.example.com和site2.example.com指向运行Docker的主机IP:

  • 如果是本地测试,可以修改本地hosts文件:
    • Linux/macOS:编辑/etc/hosts,添加两行:
      <你的主机IP> site1.example.com
      <你的主机IP> site2.example.com
      
    • Windows:编辑C:\Windows\System32\drivers\etc\hosts(需要管理员权限),添加同样的内容

测试访问

现在你就可以通过以下地址访问两个不同的站点了:

  • http://site1.example.com:8090
  • http://site2.example.com:8090

为什么你原来的命令不行?

你原来的命令里两个容器都加了-p 8090:80,这会尝试把主机的8090端口同时映射到两个容器的80端口,Docker会直接报错,因为端口已经被第一个容器占用了。用反向代理后,只有代理容器绑定主机的8090端口,后端容器的端口不需要暴露给主机,而是由代理内部转发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:34:13