łączenie z kontenera dokera do hosta dokera


10

Mam konfigurację, w której prowadzę wszystkie części mojej witryny w kontenerach dokerów. Mój nginx, który nasłuchuje na portach 80 i 443, działa w kontenerze.

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           

Chcę skonfigurować serwer proxy do usługi w innym kontenerze. Ten kontener jest powiązany z portem 3000 na hoście:

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      

Moje iptables na hoście dokera wyglądają tak:

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         

Z poziomu kontenera nie jestem w stanie połączyć się z portem 3000 na hoście z powodu konfiguracji iptables.

Nie chcę otwierać portu 3000 na publicznym Internecie.

Czy istnieje sposób otwarcia bezpośredniego mostu między kontenerem a hostem na porcie 3000?

Czy powinienem zmodyfikować moje iptables, aby akceptować je z zakresu IP dokerów?

Odpowiedzi:


5

Wszystko czego potrzebujesz to możliwości łącza Dockera [przestarzałe]

Po prostu pozbądź się wszystkich skomplikowanych rzeczy, które próbowałeś zrobić i zacznij używać nazwanych kontenerów, a następnie połącz je ze sobą.


Przyjrzałem się możliwościom linków dokujących, ale jeśli dobrze rozumiem, występują pewne problemy. 1. Jeśli dziecko zostanie ponownie uruchomione, otrzyma nowy adres IP. Następnie wszyscy rodzice tego dziecka musieliby zostać zrestartowani, aby uzyskać nowe zmienne środowiskowe. 2. Muszę dodać logikę do mojej aplikacji, aby odczytać te zmienne środowiskowe w celu nawiązania połączeń.
user3133475,

Zrestartowany kontener ( docker restart your_container) powinien zachować swój adres IP. Tylko jeśli uruchomisz nowy kontener na podstawie danego obrazu, otrzyma on nowy adres IP ( docker run -d image command).
Elias Probst

2
To kiedyś było prawdą, ale przynajmniej od wersji dokera 1.0 „restart dokera” nadaje kontenerowi nowy adres IP. Po prostu wciśnij to w niektórych skryptach, które polegały na tym, że poprzednie zachowanie IP nie zmieniało się.
jamshid

1
Chociaż myślę, że jest to prawdopodobnie właściwa rzecz dla PO, przyszedłem tutaj, szukając odpowiedzi na postawione pytanie. tzn. jak połączyć się z usługą na hoście.
mc0e,

2

Odpowiedź Eliasa jest poprawna, ale link jest długi i mylący. Oto proste podsumowanie:

Najpierw uruchom kontener, aby połączyć i nazwij go:

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

Następnie uruchom drugi kontener, łącząc go z pierwszym kontenerem:

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

Łącze z pierwszego pojemnika do drugiego pojemnika jest wstawiane /etc/hosts. Możesz więc używać go jak nazwy hosta. Na przykład:

sudo docker run --name web --link db:db training/webapp ping db
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.