我正在使用 docker compose 来启动和动态扩展数据库。容器都位于同一网络中,并且运行一些不同的镜像,有些可以扩展,有些则不能。有没有一种方法可以从其他 docker 中“查看”某个网络上“x”类型的所有容器,以便我可以在它们之间有效地进行负载平衡/等等?
最佳答案
如果您碰巧知道它们的名称,则可以使用 docker DNS 解析器来发现它们。无论如何,这实际上可能是您想要使用负载均衡器做的事情。想想 Nginx 上游指令或 HAProxy 后端。
services:
app:
image: nginx
deploy:
replicas: 2
networks:
default:
name: sample
如果部署此功能,您可以从同一网络查询 docker DNS 解析器,以获取各个应用容器的 IP 地址。
$ docker compose up -d
$ docker run --network sample --rm tutum/dnsutils dig +short app
172.22.0.3
172.22.0.2
您实际上可以告诉 nginx 或 HAProxy 等负载均衡器使用 docker 解析器进行服务发现。
这并没有告诉您应用程序容器具有哪些功能,但我认为这也并不重要。除非我误解了你的问题并且还有更多内容。
Compose 已将这些副本添加到相同的 alias 下到网络。这也是为什么我可以只查询 app
,尽管容器名称实际上是 project_app_1
和 project_app_2
。
$ docker run --network sample --rm tutum/dnsutils dig +short sample_app_1
172.22.0.3
因此,您实际上获得了 DNS 循环作为 compose 提供的内置解决方案。
如果您希望将不同服务之间的负载均衡器作为一个实体进行负载平衡,您甚至可以更进一步。输入 x 或输入 y。
services:
app:
image: nginx
deploy:
replicas: 2
networks:
default:
aliases:
- nginx
other:
image: nginx
deploy:
replicas: 2
networks:
default:
aliases:
- nginx
networks:
default:
name: sample
docker run --network sample --rm tutum/dnsutils dig +short nginx
172.22.0.2
172.22.0.4
172.22.0.5
172.22.0.3
您可以如上所述将其与负载平衡器配对。 IE。 haproxy。
例如,您可以有一个像这样的配置文件。
resolvers docker
nameserver dns1 127.0.0.11:53
resolve_retries 3
timeout resolve 1s
timeout retry 1s
hold other 10s
hold refused 10s
hold nx 10s
hold timeout 10s
hold valid 10s
hold obsolete 10s
global
log fd@2 local2
stats timeout 2m
spread-checks 15
defaults
log global
mode http
option httplog
timeout connect 5s
timeout check 5s
timeout client 2m
timeout server 2m
listen stats
bind *:4450
stats enable
stats uri /
stats refresh 15s
stats show-legends
stats show-node
frontend default
bind *:8080
default_backend nginx
backend nginx
balance leastconn
option httpchk GET /
server-template nginx- 10 nginx:80 resolvers docker init-addr libc,none check inter 30s
如果您将其烘焙到 HAProxy 镜像中或为了简单起见而挂载文件,您将获得适当的负载均衡器而不是 DNS 循环。您可以有不同的负载平衡算法和 session 亲和性/持久性。
services:
app:
&nginx
image: nginx
deploy:
replicas: 2
networks:
default:
aliases:
- nginx
other: *nginx
lb:
image: haproxy:2.5-alpine3.15
ports:
- 8000:8080
- 4450:4450
volumes:
- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
现在我们可以在端口 4450 上的统计页面上看到 4 个具有 nginx 别名的实例。
您还可以查看此答案,其中包含相关信息并显示了 HAProxy 旁边的一些其他策略。 How does service discovery work with modern docker/docker-compose? .
这个答案展示了 docker CLI 的别名,因此您可能会了解 compose 在那里做什么。 how are compose services implemented?
在 Kubernetes 中,您几乎可以使用相同的东西。 Kubernetes 还有自己的 DNS 解析器和服务抽象来获取 VIP 或 DNS 循环行为。其余部分必须来自外部实现,例如入口 Controller 。
关于docker - 动态发现 Docker Compose,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70907192/