我有两项服务,web
和helloworld
。以下是我的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
在网络中的index.html
内,我点击了一个按钮,打开http://helloworld
。但是,我的按钮最终会转到helloworld.com
而不是正确的服务。当我执行localhost:5001
和localhost:5000
时,这两项服务都可以正常运行。我错过了什么吗?
答案 0 :(得分:3)
Docker用于服务发现的嵌入式DNS用于容器到容器的网络连接。对于来自docker外部的连接(例如,从您的浏览器),您需要发布端口(例如文件中的5000和5001)并连接到该已发布的端口。
要使用容器到容器网络,您需要在Web容器内部进行DNS查找,并且需要从Web到helloworld的连接,而不是从浏览器到容器。
编辑:从您的评论中,您可能会发现反向代理很有帮助。 Traefik和nginx-proxy是两个例子。您可以将这些配置为按主机名或虚拟路径转发到容器,在您的情况下,我认为基于路径的路由将更容易。生成的撰写文件类似于:
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
以上所有都是未经测试的,我的头部配置,但应该让你朝着正确的方向。使用PathPrefixStrip规则,您可以在Web中创建一个链接到" / helloworld"哪个将转到另一个容器。由于链接没有主机名或端口,因此它将转到您已使用的相同traefik主机名/端口。