У меня есть настройка, в которой я запускаю все части моего веб-сайта в контейнерах Docker. Мой 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 на хосте docker выглядят так:
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-адреса из диапазона Docker?
решение1
Все, что вам нужно, это Docker'sвозможности связи[устаревшее]
Просто избавьтесь от всех сложных вещей, которые вы пытались сделать, и начните использовать именованные контейнеры, а затем связывайте их друг с другом.
решение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