docker-编写微服务容器间api与nginx代理通信
docker-compose microservice inter-container api communication with nginx proxy
我正在尝试构建一个 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:
http://hostname/
始终表示 http://hostname:80/
(即 TCP 端口 80 是 HTTP URLs 的默认端口)。因此,如果您希望一个容器能够以 http://othercontainer/
的形式访问另一个容器,则另一个容器需要 运行 在端口 80 上运行某种 HTTP 守护程序(这可能意味着它至少需要在其容器中以 root 身份启动)。
如果您的 nginx 代理成功路由到所有容器,则仅通过它路由所有容器间流量并没有错(在上一代技术中,我们将其称为 服务总线).在 Docker 中没有简单的方法可以做到这一点,但您可以将其配置为标准 HTTP 代理。
我建议使所有出站服务 URL 在任何情况下都可配置,可能作为环境变量。您可以想象在开发环境中想要 运行 多个服务(在这种情况下服务 URL 可能是 http://localhost:9002
),或者在纯 Docker 环境中你显示 (http://otherservice:9000
),或在混合多主机 Docker 设置中 (http://other.host.example.com:9002
),或在 Kubernetes 中 (http://otherservice.default.svc.cluster.local:9000
)。
我正在尝试构建一个 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:
http://hostname/
始终表示 http://hostname:80/
(即 TCP 端口 80 是 HTTP URLs 的默认端口)。因此,如果您希望一个容器能够以 http://othercontainer/
的形式访问另一个容器,则另一个容器需要 运行 在端口 80 上运行某种 HTTP 守护程序(这可能意味着它至少需要在其容器中以 root 身份启动)。
如果您的 nginx 代理成功路由到所有容器,则仅通过它路由所有容器间流量并没有错(在上一代技术中,我们将其称为 服务总线).在 Docker 中没有简单的方法可以做到这一点,但您可以将其配置为标准 HTTP 代理。
我建议使所有出站服务 URL 在任何情况下都可配置,可能作为环境变量。您可以想象在开发环境中想要 运行 多个服务(在这种情况下服务 URL 可能是 http://localhost:9002
),或者在纯 Docker 环境中你显示 (http://otherservice:9000
),或在混合多主机 Docker 设置中 (http://other.host.example.com:9002
),或在 Kubernetes 中 (http://otherservice.default.svc.cluster.local:9000
)。