【问题标题】:How to use port forwarding to connect to docker container using DNS name如何使用端口转发使用 DNS 名称连接到 docker 容器
【发布时间】:2016-02-02 17:52:33
【问题描述】:

我有 2 个 redis 容器在同一台机器 m1 上运行。

container1 的端口映射为 6379 到 6400

docker run -d -p 6379:6400 myredisimage1

container2 的端口映射为 6379 到 7500

docker run -d -p 6379:7500 myredisimage2

我正在寻找其他机器 m2 可以使用不同的 DNS 名称但相同的端口号与机器 m1 通信的解决方案。

redis.container1.com:6379
redis.container2.com:6379

我想将该请求重定向到机器 m1 内的适当容器。

这有可能实现吗?

【问题讨论】:

  • 最好将您尝试通信的容器链接到这些容器。然后,您使用主机文件中发布的 DNS 名称直接与内部端口通信。为什么不能监听 6379 端口的进程?
  • 是的,我错过了这个。我想我会选择链接容器。

标签: dns docker port portforwarding


【解决方案1】:

这是可能的,但很老套。首先,问问自己是否真的需要这样做,或者是否可以只为容器使用不同的端口。无论如何,如果您确实需要这样做,方法如下:

每个 docker 容器都有自己的可从主机访问的 IP 地址。 AFAIK,这些是在运行时伪随机生成的,但可以通过 docker inspect $CONTAINER_ID 访问它们,例如:

docker inspect e804af2472ca
[
{
    "Id": "e804af2472ca605dec0035f45d3bd05c1fbccee31e6c09381b0c16657378932f",
    "Created": "2016-02-02T21:34:12.49059198Z",
    ...
        "Gateway": "172.17.0.1",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        **"IPAddress": "172.17.0.6"**,
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        ...
    }
}
]

在这种情况下,我们知道该容器可从主机访问的 ip 地址是 172.17.0.1。该 IP 地址完全可以从主机使用,因此您可以将 redis.container1.com 代理到它,并将 redis.container2.com 代理到您的其他 IP。每次盒子启动时您都需要重新加载代理地址,所以这绝对不是理想的,但它应该可以工作。

再次,我的总体建议是不要这样做。

【讨论】:

  • 谢谢。我想我会按照 Marcus 的建议来链接容器。
【解决方案2】:

我不确定我是否正确。 但是你怎么能在同一个端口上启动两个容器呢?

在我看来,这应该通过使用负载平衡器来解决。尝试 HAProxy 并为每个域名设置两个 acl。

我会选择这样的东西:(使用 docker-compose)

Docker Copose 设置以部署 docker 镜像:

redis-1:
    container_name: redis-1
    image: myredis
    restart: always
    expose: 
        - "6400"

redis-2:
    container_name: redis-2
    image: myredis
    restart: always
    expose: 
        - "6400"

haproxy:
    container_name: haproxy
    image: million12/haproxy
    restart: always
    command: -n 500
    ports:
        - "6379:6379"
    links:
        - redis-1:redis.server.one
        - redis-2:redis.server.two
    volumes:
        - /path/to/my/haproxy.cfg:/etc/haproxy/haproxy.cfg

然后自定义 haproxy 配置:

    global
      chroot /var/lib/haproxy
      user haproxy
      group haproxy
      # Default SSL material locations
      ca-base /etc/ssl/certs
      crt-base /etc/ssl/private
      # Default ciphers to use on SSL-enabled listening sockets.
      ssl-default-bind-ciphers AES256+EECDH:AES256+EDH:AES128+EDH:EECDH:!aNULL:!eNULL:!LOW:!DES:!3DES:!RC4
      spread-checks 4
      tune.maxrewrite 1024
      tune.ssl.default-dh-param 2048
    defaults
      mode    http
      balance roundrobin
      option  dontlognull
      option  dontlog-normal
      option  redispatch
      maxconn 5000
      timeout connect 10s
      timeout client  25s
      timeout server  25s
      timeout queue   30s
      timeout http-request 10s
      timeout http-keep-alive 30s
      # Stats
      stats enable
      stats refresh 30s
      stats hide-version
    frontend http-in
      bind *:6379
      mode tcp
      acl is_redis1 hdr_end(host) -i redis.server.one
      acl is_redis2 hdr_end(host) -i redis.server.two
      use_backend redis1 if is_redis1
      use_backend redis2 if is_redis2
      default_backend redis1 

    backend redis1
      server r1 redis.server.one:6379

    backend redi2 
      server r2 redis.server.two:6379

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2016-03-08
    • 1970-01-01
    相关资源
    最近更新 更多