Docker-compose不能parsingDNS来纠正服务

我有两个服务, webhelloworld 。 以下是我的docker-compose YAML文件:

 version: "3" services: helloworld: build: ./hello volumes: - ./hello:/usr/src/app ports: - 5001:80 web: build: ./web volumes: - ./web:/usr/share/nginx/html ports: - 5000:80 depends_on: - helloworld 

在web的index.html里面,我点了一个button打开http://helloworld 。 但是,我的button结束了去helloworld.com而不是正确的服务。 当我做localhost:5001localhost:5000时,这两个服务都正常工作。 我错过了什么吗?

Docker用于服务发现的embedded式DNS用于容器到容器的联网。 对于从docker以外的连接(例如从您的浏览器),您需要发布端口(例如文件中的5000和5001)并连接到该发布的端口。

要使用容器到容器联网,您需要在Web容器内部进行DNS查找,并且需要从web到helloworld而不是从浏览器到容器的连接。


编辑:从您的评论,你可能会发现反向代理有帮助。 Traefik和nginx-proxy就是两个例子。 您可以configuration这些以通过主机名或虚拟path转发到容器,在您的情况下,我认为基于path的路由会更容易。 生成的组合文件将如下所示:

 version: "3" services: traefik: image: traefik command: --docker --docker.watch volumes: - /var/lib/docker.sock:/var/lib/docker.sock ports: - 8080:80 helloworld: build: ./hello volumes: - ./hello:/usr/src/app labels: - traefik.frontend.rule=PathPrefixStrip:/helloworld - traefik.port=80 web: build: ./web volumes: - ./web:/usr/share/nginx/html labels: - traefik.frontend.rule=PathPrefixStrip:/ - traefik.port=80 

以上所有内容都没有经过我的头顶configuration,但应该让你朝正确的方向发展。 使用PathPrefixStrip规则,您可以在Web中创build一个链接到“/ helloworld”,该链接将转到另一个容器。 而且由于链接没有主机名或端口,它将转到您已经使用的相同的traefik主机名/端口。