підключення від контейнера докера до хоста докера


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, щоб прийняти з діапазону icker ip?

Відповіді:


5

Все, що вам потрібно - це можливості посилання Докера [застаріле]

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


Я переглянув можливості докерного посилання, але якщо я правильно розумію, у нього є деякі проблеми. 1. Якщо дитина перезапущена, вона отримає нову ip адресу. Тоді всі батьки цієї дитини повинні бути перезапущені також для отримання нових варіабелів середовища. 2. Я повинен додати логіку до своєї програми, щоб прочитати ці змінні середовища, щоб встановити з'єднання.
користувач3133475

Перезапущений контейнер ( docker restart your_container) повинен зберігати його IP-адресу. Тільки якщо ви запустите новий контейнер на основі заданого зображення, він отримає новий IP ( docker run -d image command).
Ілля Пробст

2
Це було правдою, але принаймні, як докер 1.0, "перезавантаження докера" надає контейнеру нову 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.