首页 > 解决方案 > NGINX 如何解析 Docker DNS 主机名?

问题描述

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

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

码头工人-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/;
              }
        }
}

标签: dockernginxdocker-composeload-balancing

解决方案


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

推荐阅读