docker - 动态发现 Docker Compose

标签 docker dynamic docker-compose

我正在使用 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_1project_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 stats

您还可以查看此答案,其中包含相关信息并显示了 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/

相关文章:

docker - 两个docker容器之间的执行命令

c# - 已编译的 Dynamic Linq Func<> *没有*参数的缓存委托(delegate)?

postgresql - 使用 Docker/Docker compose 运行 Postgres 迁移

android - 如何以编程方式创建布局文件

asp.net - 无法使用 docker-compose 连接到 postgresql

node.js - 为什么docker-compose env_file不起作用,而环境却起作用?

docker - Composer 无法加载包无效的版本字符串

macos - 从 Docker OS X beta 连接到 rethinkdb(或在 http 端口上运行的任何其他应用程序)

xml - 在 Python 中输出 os.system 并使用它在 xml 文件中创建文本节点

c - 通过引用将动态二维数组传递给另一个函数来分配动态二维数组