我正在尝试构建一个docker-compose文件,该文件将通过其各种微服务模仿我的生产环境。我正在使用具有nginx代理的自定义网桥网络,该网络将端口80和443请求路由到正确的服务容器。 docker-compose文件和nginx conf文件一起指定端口映射,该端口映射允许代理容器将每个DNS条目的流量路由到其匹配的容器。
因此,我可以将容器名称用作DNS条目,以从主机浏览器访问每个容器服务。我还可以执行到每个容器中,并通过相同的DNS主机名ping其他容器。但是,仅靠容器名称我无法成功地从一个容器卷曲到另一个容器。
在Docker环境中运行时,似乎需要将代理端口映射附加到每个服务间API调用。在我的生产环境中,每个服务都有其自己的环境,并且可以在端口80和443上进行响应。因此,为每个服务编写的代码将忽略端口规范,而仅通过其DNS主机名调用每个服务。我宁愿不必将端口ID映射附加到整个各种代码库中的每个API调用中,以使我的服务在Docker环境中相互通信。
是否有工具或配置设置可让我的微服务容器在Docker中成功调用彼此而无需代理端口映射?
version: '3'
services:
#---------------------
# nginx proxy service
#---------------------
nginx_proxy:
image: nginx:alpine
networks:
- test_network
ports:
- "80:80"
- "443:443"
volumes:
- "./site1/site1.test.conf:/etc/nginx/conf.d/site1.test.conf"
- "./site2/site2.test.conf:/etc/nginx/conf.d/site2.test.conf"
container_name: nginx_proxy
#------------
# site1.test
#------------
site1.test:
build: alpine:latest
networks:
- test_network
ports:
- "9001:9000"
environment:
- "VIRTUAL_HOST=site1.test"
volumes:
- "./site1:/site1"
container_name: site1.test
#------------
# site2.test
#------------
site2.test:
build: alpine:latest
networks:
- test_network
ports:
- "9002:9000"
environment:
- "VIRTUAL_HOST=site2.test"
volumes:
- "./site2:/site2"
container_name: site2.test
# networks
networks:
test_network:
答案 0 :(得分:0)
new AmazonEC2()
始终表示http://hostname/
(即TCP端口80是HTTP URL的默认端口)。因此,如果您希望一个容器能够以http://hostname:80/
的身份到达另一个容器,则另一个容器需要在端口80上运行某种HTTP守护程序(这可能意味着它至少需要以root用户身份启动,它的容器)。
如果您的nginx代理成功路由到所有容器,则仅通过它路由所有容器间通信就没错(在上一代技术中,我们将其称为 service bus ) 。在Docker中没有简单的方法可以执行此操作,但是您可以将其配置为标准HTTP代理。
在任何情况下,我建议都将所有出站服务URL配置为可能是环境变量。您可以想象要在开发环境中(在这种情况下,服务URL可能是http://othercontainer/
)或在纯Docker环境(如您显示的内容(http://localhost:9002
)中一起运行多个服务,或者在混合多主机Docker设置(http://otherservice:9000
)或Kubernetes(http://other.host.example.com:9002
)中。