2016-08-22 3 views
5

Рассмотрим следующий docker-compose.ymlКак открыть сеть Docker на главной машине?

version: '2' 
services: 
    serv1: 
     build: . 
     ports: 
      - "8080:8080" 
    links: 
     - serv2 

    serv2: 
     image: redis 
     ports: 
      - "6379:6379" 

Я fowarding порты на хосте, чтобы управлять моими услугами, но услуги могут получить доступ друг к другу, просто используя сеть докер по умолчанию. Например, программа, работающая на serv1, может получить доступ к redis:6379, и некоторая магия DNS сделает эту работу. Я хотел бы добавить мой хост в эту сеть, чтобы я мог обращаться к портам контейнера по имени своего порта: port.

+0

https://www.npmjs.com/package/docker-machine-dns –

+2

В настоящее время Docker сообщит вам продолжать использовать привязку портов. Нет ничего, чтобы открыть внутренний DNS или связать с хостом докера, который я видел. И правила брандмауэра по умолчанию блокируют вас от прямого доступа извне хоста и заставляют вас проходить через эту привязку к порту. Комментарий Nehal показывает разрешающие хосты докеров, а artworkad показывает привязку к порту, которую вы уже делаете. – BMitch

ответ

3

Вы можете сделать это, запустив Dns прокси (как Dnsmasq) в контейнере, который находится в той же сети, что и приложение. Затем укажите ваши хосты dns в контейнере ip, и вы сможете разрешать имена хостов, как если бы вы были в контейнере в сети.

https://github.com/hiroshi/docker-dns-proxy - один из примеров этого.

1

Я не уверен, правильно ли я вас понимаю. Вы хотите, например, ваш сервер redis будет доступен не только из контейнеров, находящихся в одной сети, но также из-за пределов контейнера, используя ваш IP-адрес хоста?

Для достижения этой цели вы должны использовать разоблачить команду, как описано здесь https://docs.docker.com/compose/compose-file/#/expose

expose: 
    - "6379" 

Так

ports: 
    - "6379:6379" 
expose: 
    - "6379" 

должен сделать трюк.

Инструкция EXPOSE информирует Docker о том, что контейнер прослушивает указанные сетевые порты во время выполнения. EXPOSE не делает порты контейнера доступным для хоста. Для этого вы должны использовать либо флаг -p, чтобы опубликовать ряд портов, либо флаг -P до опубликовать все открытые порты. Вы можете указать один номер порта, а опубликовать его под другим номером.

из https://docs.docker.com/engine/reference/builder/#expose

+0

Не совсем, я хотел бы иметь доступ к любому порту, который мне нравится в контейнерах, без привязки к портам хоста. Например, если есть веб-сервер, работающий на 8080 на serv1, я бы хотел пойти в браузере моего хоста и указать на serv1: 8080 вместо localhost: 8080. Таким образом, мне не нужно было бы редактировать файл-док-файл каждый раз, когда мне нужен доступ к новому порту. – polvoazul

+0

Обратите внимание, что это происходит между контейнерами. В моем контейнере serv1 я могу получить доступ к демонам redis через serv2: 6379. Не нужно раскрывать порты в предвидении или что-то еще, они находятся в одной сети, это просто работает. Мне хотелось бы, чтобы это поведение было на хосте. – polvoazul

+0

@polvoazul я понимаю. Но я думаю, что вы не можете смешивать обнаружение внутренних сервисов через DNS с предоставлением услуг хосту (что делается через привязку порта). Также я сомневаюсь, что это хорошая практика, чтобы выставить только все порты.Поэтому для доступа к сервисам с хоста я думаю, что на привязках портов не очень хорошо (по крайней мере, я не знаю такого способа). –

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