2016-06-27 1 views
0

Я использую Docker для Windows (используя Hyper-V, а не Docker Toolkit для Windows). То, что я хотел бы сделать, - это развернуть 3+ докер-контейнеры с одним и тем же набором доступных портов.Докер для Windows: склейка нескольких контейнеров-докеров локально с одинаковыми номерами портов

После того, как я создаю первый контейнер для докеров, у меня есть http://docker:8091 (или http://10.0.75.2:8091), и все в порядке. Теперь, что я хочу сделать, это развернуть еще один контейнер с тем же номером порта. Итак, что-то вроде http://docker2:8091, или http://10.0.75.3:8091). А потом еще один на докер3 или * .4: 8091.

(Обратите внимание, что это кусок торта, чтобы развернуть три контейнера с открытыми портами, переназначенными в какой-либо другой случайный порт, но я хотел бы сохранить номера портов).

Я попытался добавить сетевой адаптер в MobyLinuxVM с помощью диспетчера Hyper-V, но это, похоже, сломает Docker, и мне нужно переустановить его, чтобы он снова работал.

Я попытался развернуть еще один экземпляр Hyper-V с докерной машиной (docker-machine create -d hyperv --hyperv-virtual-switdch DockerNAT AnotherBox), но это просто блокируется примерно на полпути и не работает. (Основываясь на том, что я читаю на форумах, намерение с docker-машиной на Docker для Windows не для меня так и не смогло это сделать, это просто для управления виртуальными машинами в облаке).

Итак ... есть ли способ сделать то, что я пытаюсь сделать?

+1

Вы пытаетесь отобразить несколько контейнеров в порт той же самой системе хост-? Для tcp это невозможно, http://stackoverflow.com/a/1694148/740175 –

+1

Что вы пытаетесь сделать с этим? Если вы хотите собрать кластер для репликации службы, вы должны искать Docker Swarm –

+1

Это похоже на то, что вы хотите запустить 3 веб-сервера на порту 8091. Docker предоставляет контейнерам порты хост-машины. Вы можете иметь одни и те же порты в контейнерах, но когда вы их раскрываете, они должны быть разными, чтобы избежать конфликтов. – stacksonstacks

ответ

1

Для того, чтобы опубликовать порт, докер использует бинарный докер-прокси для пересылки в контейнер, эффективно, как:

docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8091 -container-ip 172.17.0.2 -container-port 8091 

Очевидно, что он привязывается ко всем интерфейсам в этом примере, но я предполагаю, что это будет возможно привязываться к конкретным интерфейсам.

Если у вас есть 3 интерфейса на вашем хосте, и соответствующую запись DNS, это нечто, что можно сделать, это нравится:

docker-proxy -proto tcp -host-ip 10.0.75.2 -host-port 8091 -container-ip 172.17.0.2 -container-port 8091 
docker-proxy -proto tcp -host-ip 10.0.75.3 -host-port 8091 -container-ip 172.17.0.3 -container-port 8091 
docker-proxy -proto tcp -host-ip 10.0.75.4 -host-port 8091 -container-ip 172.17.0.4 -container-port 8091 
+0

В этом случае мне нужно несколько интерфейсов хоста (например, несколько LAN-карт или что-то еще)? –

+0

Да, я думал, вы намекнули на это в своем вопросе, учитывая, что вы указали два отдельных ips. Просто несколько интерфейсов, не обязательно несколько LAN-карт. –

1

Да, есть способ, используя обратный прокси. Вы можете использовать Nginx или HAProxy внутри контейнера или намного проще, вы можете использовать изображение Nginx, которое автоматически перенастраивается автоматически для обратного прокси-сервера ваших контейнеров: https://hub.docker.com/r/jwilder/nginx-proxy/.

+0

Выглядит многообещающе, но не может заставить его работать. Я попробовал: docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy, а затем запустить docker -e VIRTUAL_HOST = cb1.localhost -e VIRTUAL_PORT = 8091 -p 8091: 8091 -d - имя cb1 couchbase. Если я приведу cb1.localhost: 8091 в браузере, я получаю 404 (я модифицировал свой файл хостов Windows, чтобы направить cb1.localhost на 10.0.75.2, и я также попробовал 127.0.0.1) –

+1

Ваша couchbase не проксимирована, потому что она сопоставляется с портом 8091 хоста. Вы должны публично отображать 8091 на прокси-сервере ('docker run -d -p 80:80 -p 8091: 8091 -v ...') и выставлять только 8091 на контейнере couchbase ('docker run -e VIRTUAL_HOST = cb1.localhost -e VIRTUAL_PORT = 8091 --expose = 8091'). Он должен работать таким образом. – Shanoor

+0

получил, кажется, работает отлично, спасибо за вашу помощь. Вы знаете, могу ли я сопоставить несколько виртуальных портов, и если да, то как? –

Смежные вопросы