如何使用端口转发使用DNS名称连接到docker容器

如何使用端口转发使用DNS名称连接到docker容器,dns,docker,port,portforwarding,Dns,Docker,Port,Portforwarding,我有两个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.c

我有两个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中的适当容器

这有可能实现吗?

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

每个docker容器都可以从主机访问自己的ip地址。好的,它们是在运行时伪随机生成的,但是可以通过执行
docker inspect$CONTAINER\u 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,并对其他ip使用代理服务器redis.container2.com。每次盒子打开时,您都需要重新加载代理地址,所以这肯定不是理想的,但它应该可以工作


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

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

每个docker容器都可以从主机访问自己的ip地址。好的,它们是在运行时伪随机生成的,但是可以通过执行
docker inspect$CONTAINER\u 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,并对其他ip使用代理服务器redis.container2.com。每次盒子打开时,您都需要重新加载代理地址,所以这肯定不是理想的,但它应该可以工作


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

我不确定是否正确。 但是,如何启动两个容器,使它们都在同一个端口上工作

在我看来,这应该通过使用负载平衡器来解决。尝试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

我不确定我是否理解正确。 但是,如何启动两个容器,使它们都在同一个端口上工作

在我看来,这应该通过使用负载平衡器来解决。尝试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

最好将您试图从中进行通信的容器链接到这些容器。然后使用主机文件中发布的DNS名称直接与内部端口通信。为什么你听不到6379端口的进程?是的,我错过了这个。我想我将使用链接容器。最好将您试图从中进行通信的容器链接到这些容器。然后使用主机文件中发布的DNS名称直接与内部端口通信。为什么你听不到6379端口的进程?是的,我错过了这个。我想我会选择链接容器。谢谢。我想我会按照马库斯的建议把集装箱连接起来。谢谢。我想我会按照马库斯的建议把集装箱连接起来。