使用HAProxy和Docker进行动态DNS解析

问题描述:

我试图在Docker主机中设置HAProxy。使用HAProxy和Docker进行动态DNS解析

使用HAProxy的1.7和码头工人1.12

我haproxy.cfg样子:

# Simple configuration for an HTTP proxy listening on port 81 on all 
# interfaces and forwarding requests to a single backend "servers" with a 
# single server "server1" listening on 127.0.0.1:8000 
global 
    daemon 
    maxconn 256 

resolvers docker 
    # nameserver dnsmasq 127.0.0.1:53 
    nameserver dns 127.0.0.1:53 

defaults 
    mode http 
    timeout connect 5000ms 
    timeout client 50000ms 
    timeout server 50000ms 
    default-server init-addr none 

frontend http-in 
    bind *:80 
    default_backend www_somedomain1_com 

    # Define hosts 
    acl host_www_somedomain1_com hdr(host) -i somedomain1.com 
    acl host_www_somedomain1_com hdr(host) -i www.somedomain1.com 
    acl host_www_somedomain2_com hdr(host) -i www.somedomain2.com 

    ## figure out which one to use 
    use_backend www_somedomain1_com if host_www_somedomain1_com 
    use_backend www_somedomain2_com if host_www_somedomain2_com 

backend www_somedomain1_com 
    # Utilizing the Docker DNS to resolve below host 
    # server server1 www-somedomain1-com maxconn 32 check port 80 
    server server1 www-somedomain1-com resolvers docker check maxconn 32 

backend www_somedomain2_com 
    # Utilizing the Docker DNS to resolve below host 
    # server server1 www-somedomain2-com maxconn 32 check resolvers docker resolve-prefer ipv4 
    server server1 www-somedomain2-com maxconn 32 check port 80 

我想用多克的嵌入式DNS系统 - 这,在我的理解,只使用一个用户时启用定义网络。

所以我创建了一个网络(使用默认的桥式驱动器)

docker network create mynetwork 

当我跑我的两个命名泊坞窗的容器,(我-HAProxy的和WWW-somedomain1-COM),我将它们添加到网络--net标志。

泊坞窗运行命令:

docker run --name myhaproxy --net mynetwork -p 80:80 -d haproxy 
docker run --name www-somedomain1-com --net mynetwork -d nginx 

我知道泊坞DNS是功能性的,因为我可以从一个容器解析到其他的时候我在bash shell上他们跳。我无法在HAProxy中获得正确的组合/配置以启用动态DNS解析。

HAProxy的统计页面始终显示下游后端为棕色/解析问题....

一些事情帮助: - “默认服务器的init-地址无”有助于通过HAProxy的配置检查启动。

任何指导非常感谢!

+0

您可以发布您'泊坞窗run'命令?任何你没有使用docker-compose这个环境的理由? – jmiraglia

+0

你可以在容器内运行dig/nslookup吗? – Baptiste

+0

你也可以在套接字上发布“show stat resolvers”以获得DNS解析统计信息的转储,我们可以看到报告了哪种类型的errros – Baptiste

我也在项目中使用nginx和haproxy。既然你可能会开始使用docker-compose,我想我会为此发布我的docker-compose.yaml。

version: "2" 

networks: 
    main: 

volumes: 
    jsdoc-data: 
    driver: local 
    coverage-data: 
    driver: local 

services: 
    nginx: 
    build: ../nginx 
    depends_on: 
     - haproxy 
    networks: 
     - main 
    ports: 
     - 80:80 
     - 443:443 
    volumes: 
     - jsdoc-data:/www/jsdoc 
     - coverage-data:/www/coverage 

    haproxy: 
    image: dockercloud/haproxy:1.5.3 
    ports: 
     - 80 
     - 1936:1936 
    links: 
     - app 
    networks: 
     - main 
    volumes: 
     - /var/run/docker.sock:/var/run/docker.sock 
    environment: 
     - MODE=http 
     - STATS_PORT=1936 
     - STATS_AUTH=username:password 

我觉得你的问题是,你正在使用127.0.0.1:53为您解析DNS,当它需要127.0.0.11:53为泊坞窗桥接网络。

这里是我的dev的搬运工东西HAProxy的设置:

global 
    quiet 

defaults 
    log global 
    mode http 
    option forwardfor 
    timeout connect 60s 
    timeout client 60s 
    timeout server 60s 
    default-server init-addr none 

resolvers docker_resolver 
    nameserver dns 127.0.0.11:53 

frontend https-proxy 
    bind 0.0.0.0:80 
    bind 0.0.0.0:443 ssl crt /usr/local/etc/haproxy/dev_server.pem 
    redirect scheme https if !{ ssl_fc } 

    acl is_api_server hdr(host) -i mywebsite 

    use_backend api_server if is_api_server 

backend api_server 
    server haproxyapi api-server-dev:80 check inter 10s resolvers docker_resolver resolve-prefer ipv4