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

时间:2016-12-14 21:21:44

标签: docker haproxy

我正在尝试在Docker主机中设置HAProxy。

使用HAProxy 1.7和Docker 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

我想使用Docker的嵌入式DNS系统 - 据我所知,只有在使用用户定义的网络时才启用。

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

docker network create mynetwork

当我运行我的两个命名的docker容器(my-haproxy和www-somedomain1-com)时,我将它们添加到带有--net标志的网络中。

Docker运行命令:

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

我知道Docker dns是有用的,因为当我在bash shell中跳转时,我可以从一个容器解析到另一个容器。我无法在HAProxy中获得正确的组合/配置以启用动态DNS解析。

HAProxy stats页面始终将下游后端显示为棕色/分辨率问题....

有些有帮助的事情:   - “default-server init-addr none”有助于在启动时传递haproxy配置检查。

非常感谢任何指导!

2 个答案:

答案 0 :(得分:4)

我认为您的问题是,您的解析器dns正在使用ObservableCollection<T>,而对于docker bridge网络,它需要HttpConfiguration

这是我对开发者的haproxy设置:

// Add custom formatter - add at the top so it fires first!
// This leaves the old one in place so JsonValue/JsonObject/JsonArray still are handled
config.Formatters.Insert(0, new CustomJsonNetFormatter());

答案 1 :(得分:0)

我也在项目中使用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