Czy możliwe jest otwarcie portów dostępu do kontenera Docker przez hosta? Konkretnie mam MongoDB i RabbitMQ uruchomione na hoście i chciałbym uruchomić proces w kontenerze Docker, aby nasłuchiwać kolejki i (opcjonalnie) pisać do bazy danych.
Wiem, że mogę przekierować port z kontenera do hosta (przez opcję -p) i mam połączenie ze światem zewnętrznym (tj. Internetem) z kontenera Docker, ale nie chciałbym ujawniać portów RabbitMQ i MongoDB od gospodarza do świata zewnętrznego.
EDYCJA: kilka wyjaśnień:
Starting Nmap 5.21 ( http://nmap.org ) at 2013-07-22 22:39 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00027s latency).
PORT STATE SERVICE
6311/tcp open unknown
joelkuiper@vps20528 ~ % docker run -i -t base /bin/bash
root@f043b4b235a7:/# apt-get install nmap
root@f043b4b235a7:/# nmap 172.16.42.1 -p 6311 # IP found via docker inspect -> gateway
Starting Nmap 6.00 ( http://nmap.org ) at 2013-07-22 20:43 UTC
Nmap scan report for 172.16.42.1
Host is up (0.000060s latency).
PORT STATE SERVICE
6311/tcp filtered unknown
MAC Address: E2:69:9C:11:42:65 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 13.31 seconds
Musiałem zrobić tę sztuczkę, aby uzyskać jakiekolwiek połączenie internetowe z kontenerem: Moja zapora sieciowa blokuje połączenia sieciowe z kontenera Dockera na zewnątrz
EDYCJA : Ostatecznie zdecydowałem się na stworzenie niestandardowego mostu za pomocą rurociągów i nasłuchiwanie usług na adresach IP mostka. Wybrałem to podejście zamiast nasłuchiwania MongoDB i RabbitMQ na mostku docker, ponieważ zapewnia to większą elastyczność.
źródło
lo
ieth0
.Prostym, ale stosunkowo niebezpiecznym sposobem byłoby skorzystanie z
--net=host
opcjidocker run
.Ta opcja sprawia, że kontener używa stosu sieciowego hosta. Następnie możesz połączyć się z usługami działającymi na hoście, używając po prostu „localhost” jako nazwy hosta.
Jest to łatwiejsze do skonfigurowania, ponieważ nie będziesz musiał konfigurować usługi tak, aby akceptowała połączenia z adresu IP kontenera Dockera i nie będziesz musiał podawać kontenerowi Dockera konkretnego adresu IP lub nazwy hosta, z którym ma się połączyć, po prostu port.
Na przykład możesz to przetestować, uruchamiając następujące polecenie, które zakłada, że twój obraz jest wywoływany
my_image
, twój obraz zawieratelnet
narzędzie, a usługa, z którą chcesz się połączyć, znajduje się na porcie 25:Jeśli myślisz o zrobieniu tego w ten sposób, zapoznaj się z ostrzeżeniem dotyczącym bezpieczeństwa na tej stronie:
https://docs.docker.com/articles/networking/
To mówi:
źródło
--net=host
nie działa, jeśli zezwalasz procesowi kontenera na łączenie się z komputerem głównym za pomocąlocalhost
. Zamiast tego połącz kontener ze specjalną nazwą hosta tylko dla systemu MacOSdocker.for.mac.host.internal
zamiastlocalhost
. Abydocker run
to działało, nie są potrzebne żadne dodatkowe parametry . Możesz przekazać to jako zmienną env, używając,-e
jeśli chcesz, aby platforma kontenerowa była agnostyczna. W ten sposób możesz połączyć się z hostem wymienionym w env var i przekazaćdocker.for.mac.host.internal
na MacOS ilocalhost
Linux.host.docker.internal
, zobacz dokumentacjędocker run --rm -it --net=host postgres bash
następniepsql -h host.docker.internal -U postgres
Możesz także stworzyć tunel ssh.
docker-compose.yml
:docker/Dockerfile.tunnel
:config/ssh/config
:W ten sposób
elasticsearch
ma tunel do serwera z uruchomioną usługą (Elasticsearch, MongoDB, PostgreSQL) i udostępnia port 9200 z tą usługą.źródło
Miałem podobny problem z dostępem do serwera LDAP z kontenera dockera. Ustawiłem stały adres IP dla kontenera i dodałem regułę zapory.
docker-compose.yml:
reguła iptables:
iptables -A INPUT -j ACCEPT -p tcp -s 192.168.50.2 -d $192.168.50.1 --dport portnumberOnHost
Dostęp do wnętrza kontenera
dockerhost:portnumberOnHost
źródło
Jeśli MongoDB i RabbitMQ są uruchomione na hoście, port powinien już zostać ujawniony, ponieważ nie znajduje się w Dockerze.
Nie potrzebujesz tej
-p
opcji, aby udostępnić porty z kontenera do hosta. Domyślnie wszystkie porty są widoczne. Ta-p
opcja umożliwia wystawienie portu z kontenera na zewnątrz hosta.Domyślam się, że nie potrzebujesz
-p
w ogóle i powinno działać dobrze :)źródło