如何使用端口转发使用DNS名称连接到docker容器
我有两个redis容器在同一台机器m1上运行 container1的端口映射为6379到6400如何使用端口转发使用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
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端口的进程?是的,我错过了这个。我想我会选择链接容器。谢谢。我想我会按照马库斯的建议把集装箱连接起来。谢谢。我想我会按照马库斯的建议把集装箱连接起来。