2015-05-07 13 views
15

Mam demona na moim hoście działającym na jakimś porcie (tj. 8008), a mój kod normalnie współdziała z demonem, kontaktując się na przykład localhost: 8008.Jak mogę przekazać port localhost na moim kontenerze do localhost na moim hoście?

Mam konteneryzacji mojego kodu, ale jeszcze nie daemona. Jak mogę przekazać localhost: 8008 na moim kontenerze do localhost: 8008 na hoście uruchamiającym kontener (a więc i demona).

Poniżej podano netstat -tlnp na moim hostie . Chciałbym pojemnik do przekazania localhost: 2009 na localhost: 2009 na hoście

Proto Recv-Q Send-Q Local Address   Foreign Address   State  PID/Program name    
tcp  0  0 127.0.0.1:2009   0.0.0.0:*    LISTEN  22547/ssh  
tcp6  0  0 :::22     :::*     LISTEN  -    
tcp6  0  0 ::1:2009    :::*     LISTEN  22547/ssh    

Odpowiedz

-2

docker run -d --name <NAME OF YOUR CONTAINER> -p 8008:8008 <YOUR IMAGE>

To opublikuje portu 8008 w pojemniku do 8008 na gospodarza.

+1

Mówi się, że adres jest już używany?Chcę localhost: 8008 na moim kontenerze do przekazania do localhost: 8008 na hoście – Setheron

+0

Może coś jest już nasłuchuje na porcie '8008' na twoim hoście. Możesz sprawdzić, wpisując 'netstat -tlnp', jeśli host jest hostem Linux. Jeśli jest coś, co już nasłuchuje na porcie '8008' na twoim hoście, będziesz musiał go najpierw zatrzymać. –

13

Tak więc musisz pomyśleć o tym, że kontenery Docker mają własny stos sieciowy (chyba że wyraźnie powiesz, aby udostępnić stos hosta za pomocą --net=host). Oznacza to, że porty muszą być widoczne zarówno w kontenerze dokowania, jak i na zewnątrz (documentation) po podłączeniu do portów hosta. Porty ujawnione na kontenerze muszą być jawnie powiązane z portami hosta (z -p xxxx:yyyy w komendzie docker run) lub niejawnie (przy użyciu EXPOSE w pliku Dockerfile i przy użyciu -P w wierszu poleceń), tak jak mówi here. Jeśli plik Dockerfile nie zawiera EXPOSE 8008 lub nie podasz --expose 8008 w poleceniu docker run, twój kontener nie będzie mógł rozmawiać ze światem zewnętrznym, , nawet jeśli użyjesz -p 8008:8008 w swoim poleceniu docker run!

Tak, aby uzyskać TCP/8008 na komputerze połączonym z tcp/8008 na pojemniku, trzeba EXPOSE 8008 wewnątrz Dockerfile (i wtedy docker build kontenera) OR --expose 8008 w swoim docker run command. Ponadto należy albo użyć -P do niejawnego lub -p 8008:8008, aby jawnie połączyć ten odsłonięty port kontenera z portem hosta. Przykładem docker run Polecenie to zrobić może wyglądać następująco:

docker run -it --expose 8008 -p 8008:8008 myContainer

Jest poręczny, aby pamiętać, że w opcji wiersza poleceń -p 8008:8008 kolejność tej operacji jest -p HOST_PORT:CONTAINER_PORT. Nie zapomnij także, że nie będziesz mógł skorzystać z SSH w swoim kontenerze z innego komputera w Internecie, chyba że ten port zostanie odblokowany na iptables na hoście. Zawsze zapominam o tym i marnuję pół godziny, zanim pamiętam, że zapomniałem o iptables -A INPUT ... dla tego konkretnego portu TCP na maszynie hosta. Ale powinieneś być w stanie SSH z hosta do kontenera bez reguły iptables, ponieważ używa pętli zwrotnej dla połączeń lokalnych. Powodzenia!

+1

Więc myślę, że potrzebuję kolejnej reguły firewalla, aby przekazać ją do localhosta. – Setheron

+0

Dodałem trochę więcej informacji. Trzeba tylko dodać regułę iptables na hoście, jeśli próbujesz ssh do swojego kontenera z innego komputera w Internecie. Powinieneś móc ssh do swojego kontenera, jeśli używasz ssh z komputera-hosta. – L0j1k

+1

Demon tylko słucha na localhost. Mogę połączyć się z portem 8008 z adresu IP mojego hosta, ale wtedy muszę przekazać dalej do localhost nic – Setheron

0

Nie jestem pewien, czy możesz to zrobić tylko z ustawieniami dockera. Jeśli mój niezadowolony jest prawidłowy, wystawienie portu nie jest tym, czego szukasz. Zamiast tego, ustanowienie przekierowania portów ssh z kontenera do hosta może być odpowiedzią.

Powiązane problemy