我想做的是:
我的docker-composer文件包含几个服务,每个服务都有一个服务名称。所有服务都使用完全相同的镜像。我希望它们可以从主机通过服务名(如curl service-one、curl service-two)访问。用例是这些微服务应该可以从主机系统访问。
services:
service-one:
container_name: container-service-one
image: customimage1
service-two:
container_name: container-service-two
image: customimage1有什么问题吗?
许多教程都说这是构建微服务的方法,但通常使用端口来完成,但我需要的是服务名称而不是端口。
我尝试过的
有很多非常古老的答案(5-6年),但没有一个给出一个有效的答案。有一些想法,比如解析IP of each container and then using that,或者只是在docker容器之间内部使用主机名,或者是复杂的第三方工具,比如构建自己的DNS。感觉很奇怪,我是唯一一个需要从主机系统访问多个API的人,这感觉像是标准用例,所以我想我在这里遗漏了一些东西。
有人能告诉我下一步该怎么走吗?
发布于 2021-09-14 18:09:34
据我所知,我将从基础到高级。
对于初学者来说,属于docker网络的每个服务(默认情况下是组合文件的一部分的每个人),因此通过它们的服务名称相互访问已经“免费”了。
如果您想要使用主机本身的服务名称,您可以设置一个反向代理,如nginx,并通过服务器名称(在您的示例中等于服务名称)在运行docker容器的主机上路由适当的端口。基本思想是截获到服务器上端口80的所有通信,并通过传入的DNS名称发送通信。下面是一个例子:
合成文件:
version: "3.9"
services:
nginx-router:
image: "nginx:latest"
volumes:
- type: bind
source: ./nginx.conf
target: /nginx/nginx.conf
ports:
- "80:80"
service1:
image: "nginx:latest"
ports:
- "8080:80"
service2:
image: "httpd:latest"
ports:
- "8081:80"nginx.conf
worker_processes auto;
pid /tmp/nginx.pid;
events {
worker_connections 8000;
multi_accept on;
}
http {
server {
listen 80;
server_name 127.0.0.1;
location / {
proxy_set_header Host $host;
proxy_pass http://service1:80;
}
}
server {
listen 80;
server_name localhost;
location / {
proxy_set_header Host $host;
proxy_pass http://service2:80;
}
}
}在这个示例中,如果我的服务器名是localhost,我将路由到service2,这是一个httpd图像或Apache HTTP,我们可以让它工作,这是默认的apache图像HTML页面:

当我们通过127.0.0.1服务器名访问时,我们应该看到nginx,实际上这就是我们得到的结果:

在您的示例中,在将服务名设置为DNS记录并使用此DNS记录路由到适当的服务之后,您将使用服务名。
https://stackoverflow.com/questions/69181357
复制相似问题