подключение из Docker-контейнера к Docker-хосту

10

У меня есть настройки, где я запускаю все части моего сайта в докер-контейнерах. Мой nginx, который прослушивает порты 80 и 443, работает в контейнере.

363292a98545        scivm/nginx-django-scivmcom:latest   /usr/bin/supervisord   12 days ago         Ghost               0.0.0.0:40001->22/tcp, 88.198.57.112:443->443/tcp, 88.198.57.112:80->80/tcp     lonely_feynmann           

Я хочу настроить прокси для службы в другом контейнере. Этот контейнер связан с портом 3000 на хосте:

b38c8ef72d0a        mazzolino/strider-dind:latest        wrapdocker /usr/bin/   41 minutes ago      Up 41 minutes       0.0.0.0:3000->3000/tcp, 22/tcp, 27017/tcp                                       distracted_einstein      

Мои iptables на хосте докера выглядят так:

root@Ubuntu-1204-precise-64-minimal /var/run # iptables -L
Chain INPUT (policy ACCEPT) target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:8000
DROP       all  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Из-за контейнера я не могу подключиться к порту 3000 на хост-компьютере из-за конфигурации iptables.

Я не хочу открывать порт 3000 для публичного интернета.

Есть ли способ открыть прямой мост между контейнером и хостом через порт 3000?

Или я должен изменить свои iptables, чтобы принимать из диапазона IP-адресов докера?

user3133475
источник

Ответы:

5

Все, что вам нужно, это возможности ссылок Docker [устарело]

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

Элиас Пробст
источник
Я взглянул на возможности соединения с докером, но если я правильно понял, у него есть некоторые проблемы. 1. Если ребенок будет перезапущен, он получит новый IP-адрес. Затем нужно перезапустить всех родителей этого ребенка, чтобы получить новые переменные среды. 2. Я должен добавить логику в свое приложение, чтобы читать эти переменные окружения, чтобы устанавливать соединения.
user3133475
Перезапущенный контейнер ( docker restart your_container) должен сохранить свой IP-адрес. Только если вы запустите новый контейнер на основе заданного изображения, он получит новый IP ( docker run -d image command).
Элиас Пробст
2
Раньше это было правдой, но, по крайней мере, с docker 1.0 «перезапуск docker» дает контейнеру новый IP-адрес. Просто поразите это в некоторых скриптах, которые основывались на прежнем поведении ip, не меняющемся.
Джамшид
1
Хотя я думаю, что это, вероятно, является правильным решением для ОП, я пришел сюда в поисках ответа на поставленный вопрос. т.е. как связать с сервисом на хосте.
mc0e
2

Ответ Элиаса верен, но связь длинная и запутанная. Вот простое резюме:

Сначала запустите контейнер для ссылки и назовите его:

sudo docker run -d --name db training/postgres

Затем запустите другой контейнер, связав его с первым контейнером:

sudo docker run -d -P --name web --link db:db training/webapp python app.py

Ссылка от первого контейнера до второго контейнера вставлена ​​в /etc/hosts. Таким образом, вы можете использовать его как имя хоста. Например:

sudo docker run --name web --link db:db training/webapp ping db
Рон Ромеро
источник