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

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

container1有端口映射6379到6400

docker run -d -p 6379:6400 myredisimage1 

container2有端口映射6379到7500

 docker run -d -p 6379:7500 myredisimage2 

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

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

我想redirect到机器m1内的适当的容器。

这有可能实现吗?

这是可能的,但哈克。 首先,问问自己是否真的需要这样做,或者如果只是使用不同的端口来容器,就可以逃脱。 无论如何,如果你确实需要这样做,这里是如何:

每个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。 每当盒子上升时,你都需要重新加载代理地址,所以这绝对不是理想的,但它应该工作。

再次,我的build议总的来说是不要这样做。

我不知道我是否正确。 但是,你怎么能启动两个在同一个端口工作的容器?

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

我会去这样的事情:(使用docker撰写)

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 

然后自定义haproxyconfiguration:

  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