2016-02-02 2 views
1

У меня есть 2 контейнера redis, работающих на одной машине m1.Как использовать переадресацию портов для подключения к контейнеру докеров, используя DNS-имя

container1 имеет сопоставление портов 6379 до 6400

docker run -d -p 6379:6400 myredisimage1 

container2 имеет отображение порта 6379 на 7500

docker run -d -p 6379:7500 myredisimage2 

Я искал решение, где другая машина м2 может связываться с машиной m1, используя разные DNS, но тот же номер порта.

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

и я хотел бы перенаправить этот запрос на соответствующие контейнеры внутри машины m1.

Можно ли это достичь?

+1

It может быть лучше всего связать контейнеры, с которыми вы пытаетесь связаться, в эти контейнеры. Затем вы разговариваете с внутренним портом напрямую с DNS-именем, опубликованным в вашем файле hosts. Почему вы не можете прослушивать процесс на порту 6379? –

+0

Я пропустил это. Я думаю, что поеду со связыванием контейнеров. –

ответ

0

Это возможно, но хакки. Во-первых, спросите себя, действительно ли вам нужно это сделать, или если вам удастся просто использовать разные порты для контейнеров. В любом случае, если вам это абсолютно необходимо, вот как это сделать:

Каждый контейнер докеры получает свой собственный 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. Вам нужно будет перезагружать адрес прокси-сервера каждый раз, когда коробка поднимается, поэтому это определенно не будет идеальным, но оно должно работать.

Опять же, моя рекомендация в целом не делает этого.

+0

спасибо. Думаю, я пойду с тем, что Маркус предложил связать контейнеры. –

0

Я не уверен, верну ли вы вам. Но как вы могли бы запустить два контейнера, работающих на одном и том же порту?

Мне кажется, что это должно решаться с помощью балансировки нагрузки. Попробуйте HAProxy и настройте два acl для каждого имени домена.

Я бы с чем-то вроде этого: (Использование докер-создания сообщения) настройки

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 CONFIG:

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 
Смежные вопросы