单IP多域名对应不同Docker容器的最简实现方案咨询
最简解决方案:用反向代理实现域名路由到不同Docker容器
嗨,这个问题我太熟了!你之前用的那个com.docker.ucp.mesh.http标签是针对Docker企业版UCP集群的,单节点服务器这么用肯定会踩坑——一来你把多个容器都绑定到主机的80端口,后面的容器根本启动不了(端口冲突);二来那个标签没做域名的精准区分,自然所有域名请求都被导向第一个启动的容器了。
下面给你两个最简方案,按上手难度排序:
方案一:Nginx Proxy Manager(最省心,图形化操作)
这是新手友好度拉满的工具,不用写复杂配置,点点鼠标就能搞定域名路由,还能自动申请HTTPS证书。
步骤:
- 创建专属Docker网络(让反向代理和你的业务容器能互相访问):
docker network create proxy-network - 启动Nginx Proxy Manager容器:
docker run -d \ --name nginx-proxy-manager \ --restart=always \ -p 80:80 \ -p 81:81 \ -p 443:443 \ -v ./nginx-proxy-manager/data:/data \ -v ./nginx-proxy-manager/letsencrypt:/etc/letsencrypt \ --network proxy-network \ jc21/nginx-proxy-manager:latest - 配置域名路由:
- 访问服务器IP的81端口(比如
http://你的服务器IP:81),默认账号是admin@example.com,密码changeme,登录后记得改密码。 - 点击左侧
Hosts->Proxy Hosts->Add Proxy Host:- Domain Names:填你的第一个域名,比如
my1.example.com - Forward Hostname/IP:填你第一个业务容器的名称(比如
container_1)或者容器内部IP - Forward Port:填容器的内部端口(比如
8080) - 要HTTPS的话,直接在
SSL标签页选Request a new SSL certificate,勾选Force SSL和HTTP/2 Support,自动生成Let's Encrypt证书。
- Domain Names:填你的第一个域名,比如
- 重复上面的操作,给剩下四个域名分别配置对应的容器和端口。
- 访问服务器IP的81端口(比如
- 启动你的业务容器:
不用再绑定主机的80端口了,只要加入同一个proxy-network,命名好容器就行:
剩下四个容器同理,只需要改docker run -d \ --name container_1 \ --restart=always \ --network proxy-network \ 你的镜像名:版本--name和镜像名。
方案二:Traefik(自动发现,适合命令行爱好者)
Traefik是轻量级的云原生反向代理,能自动识别Docker容器的路由标签,不用手动配置反向代理规则。
步骤:
- 创建专属Docker网络:
docker network create traefik-network - 创建Traefik的配置文件
traefik.yml(放在服务器某个目录下,比如./traefik):api: dashboard: true entryPoints: web: address: ":80" websecure: address: ":443" providers: docker: endpoint: "unix:///var/run/docker.sock" exposedByDefault: false certificatesResolvers: letsencrypt: acme: email: "你的邮箱@example.com" storage: acme.json httpChallenge: entryPoint: web - 启动Traefik容器:
访问docker run -d \ --name traefik \ --restart=always \ -p 80:80 \ -p 443:443 \ -p 8080:8080 \ -v ./traefik/traefik.yml:/etc/traefik/traefik.yml \ -v ./traefik/acme.json:/acme.json \ -v /var/run/docker.sock:/var/run/docker.sock \ --network traefik-network \ traefik:latesthttp://你的服务器IP:8080就能看到Traefik的仪表盘。 - 启动带路由标签的业务容器:
每个容器启动时添加Traefik的标签,指定对应的域名和端口:
剩下四个容器只需要改docker run -d \ --name container_1 \ --restart=always \ --network traefik-network \ --label "traefik.enable=true" \ --label "traefik.http.routers.container1.rule=Host(`my1.example.com`)" \ --label "traefik.http.routers.container1.entrypoints=web,websecure" \ --label "traefik.http.routers.container1.tls.certresolver=letsencrypt" \ --label "traefik.http.services.container1.loadbalancer.server.port=8080" \ 你的镜像名:版本--name、标签里的container1和域名my1.example.com、端口即可。
关键注意点
- 所有容器必须和反向代理(Nginx Proxy Manager/Traefik)在同一个Docker网络里,这样才能互相访问。
- 确保你的五个域名都正确解析到服务器的公网IP。
- 不要给业务容器绑定主机的80/443端口,把端口控制权交给反向代理。
内容的提问来源于stack exchange,提问作者Bartłomiej Bartnicki
相关产品推荐
相关产品推荐

