【问题标题】:How does NGINX resolve the Docker DNS hostnames?NGINX 如何解析 Docker DNS 主机名?
【发布时间】:2021-02-02 00:16:14
【问题描述】:

我想更好地理解这个过程,但在这里找不到解释。
我有一个app 应用程序,它将容器 ID 打印为/ 上的 http 响应,类似于 jwilder/whoami 图像。
我在 compose 上使用 --scale app=2 使用 nginx 对这个应用程序进行负载平衡。它使用 Nginx 的默认 Round-Robin 方法在 2 个(或 N 个)应用程序之间正确循环。
Docker 和 Nginx 究竟如何解析和负载均衡 nginx-conf 中的 http://app/ URL?

编辑:更具体地说,nginx如何知道http://app/主机名后面有2个ip地址。

docker-compose.yml

version: "3.9"

services: 
  app:
    build:
      context: ./Dockerfile
      dockerfile: Dockerfile-Application
    expose: 
      - "80"
    networks: 
      - application-net

  loadbalancer:
    image: nginx:latest
    depends_on: 
      - app
    ports: 
      - "80:80"
    volumes: 
      - ./cfg/nginx.conf:/etc/nginx/nginx.conf:ro
    networks: 
      - application-net

networks: 
  application-net:
    ipam:
      driver: default
      config: 
        - subnet: "10.150.1.0/24"

nginx.conf

user  nginx;

events {
    worker_connections   1000;
}
http {
        server {
              listen 80;
              location / {
                proxy_pass http://app:80/;
              }
        }
}

【问题讨论】:

    标签: docker nginx docker-compose load-balancing


    【解决方案1】:

    Docker 和 Nginx 究竟如何解析和负载均衡 nginx-conf 中的 http://app/ URL?

    Docker 运行您的应用程序用来解析容器名称的 DNS 服务。这就是为什么对于在默认 bridge 网络以外的网络上启动的容器,您会看到 resolv.conf 没有指向您的常规 DNS 服务器:

    $ docker run --rm --net=net0 alpine cat /etc/resolv.conf | grep nameserver
    nameserver 127.0.0.11
    

    【讨论】:

    • 那很好,但我的问题是,Nginx 怎么知道app 主机名后面有 2 个(或 N 个)容器运行
    • 没有!这个答案就是整个故事。请记住,DNS 响应可以包含多个地址;如果有多个 app 容器,nginx 只询问主机名 app 并接收包含多个结果的响应。
    • 啊,对。那个我完全忘记了。谢谢!将您的答案标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2019-04-30
    • 2019-08-17
    相关资源
    最近更新 更多