Po instalacji Dockera masz domyślnie 3 sieci:
docker network ls
NETWORK ID NAME DRIVER SCOPE
f3be8b1ef7ce bridge bridge local
fbff927877c1 host host local
023bb5940080 none null local
Staram się, żeby to było proste. Jeśli więc domyślnie uruchamiasz kontener, zostanie on utworzony wewnątrz sieci mostka (docker0).
$ docker run -d jenkins
1498e581cdba jenkins "/bin/tini -- /usr..." 3 minutes ago Up 3 minutes 8080/tcp, 50000/tcp friendly_bell
W dockerfile z jenkins porty 8080
i 50000
są odsłonięte. Te porty są otwarte dla kontenera w jego sieci mostowej. Więc wszystko w tej sieci mostu może uzyskać dostęp do kontenera na porcie 8080
i 50000
. Wszystko w sieci mostka znajduje się w prywatnym zasięgu "Subnet": "172.17.0.0/16",
Jeśli chcesz uzyskać do nich dostęp z zewnątrz, musisz zmapować porty -p 8080:8080
. Spowoduje to zmapowanie portu kontenera do portu twojego prawdziwego serwera (sieci hosta). Zatem dostęp do twojego serwera 8080
będzie kierowany do twojej sieci mostowej na porcie 8080
.
Teraz masz także swoją sieć hosta. Co nie umożliwia kontenerowania sieci kontenerów. Jeśli więc uruchomisz kontener w sieci hosta, będzie on wyglądał tak (jest to pierwszy):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1efd834949b2 jenkins "/bin/tini -- /usr..." 6 minutes ago Up 6 minutes eloquent_panini
1498e581cdba jenkins "/bin/tini -- /usr..." 10 minutes ago Up 10 minutes 8080/tcp, 50000/tcp friendly_bell
Różnica dotyczy portów. Twój kontener znajduje się teraz w Twojej sieci hosta. Więc jeśli otworzysz port 8080
na swoim hoście, natychmiast uzyskasz dostęp do kontenera.
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 8080 -j ACCEPT
Otworzyłem port 8080
w mojej zaporze i kiedy teraz uzyskuję dostęp do mojego serwera na porcie 8080
, uzyskuję dostęp do moich Jenkins. Myślę, że ten blog jest również przydatny, aby lepiej to zrozumieć.
--net=host
w pliku Dockerfile?docker build --network=host
. Określona sieć hosta dla kompilacji platformy Docker służy tylko do pobierania pakietów, które są niezbędne do zbudowania obrazu. Jeśli chcesz uruchomić kontener w sieci hosta, nadal musisz zdefiniować opcję --network = host.network_mode: "host"
(ref - docs.docker.com/compose/compose-file/#network_mode )Ta
--net=host
opcja służy do tego, aby programy wewnątrz kontenera Dockera wyglądały tak, jakby były uruchomione na samym hoście, z perspektywy sieci. Pozwala kontenerowi na większy dostęp do sieci niż normalnie.Zwykle musisz przekazywać porty z komputera hosta do kontenera, ale gdy kontenery współużytkują sieć hosta, każda aktywność sieciowa ma miejsce bezpośrednio na komputerze-hoście - tak jak gdyby program działał lokalnie na hoście zamiast wewnątrz pojemnik.
Chociaż oznacza to, że nie musisz już ujawniać portów i mapować ich na porty kontenerów, oznacza to, że musisz edytować swoje Dockerfiles, aby dostosować porty, na których nasłuchuje każdy kontener, aby uniknąć konfliktów, ponieważ nie możesz mieć dwóch kontenerów działających na tym samym port hosta. Jednak prawdziwym powodem tej opcji jest uruchamianie aplikacji wymagających dostępu do sieci, który jest trudny do przekazania do kontenera na poziomie portu.
Na przykład, jeśli chcesz uruchomić serwer DHCP, musisz mieć możliwość nasłuchiwania ruchu rozgłoszeniowego w sieci i wyodrębnienia adresu MAC z pakietu. Te informacje są tracone podczas procesu przekierowania portów, więc jedynym sposobem na uruchomienie serwera DHCP wewnątrz platformy Docker jest uruchomienie kontenera jako
--net=host
.Ogólnie rzecz biorąc,
--net=host
jest potrzebne tylko wtedy, gdy uruchamiasz programy o bardzo specyficznych, nietypowych potrzebach sieciowych.Wreszcie, z punktu widzenia bezpieczeństwa, kontenery Docker mogą nasłuchiwać na wielu portach, mimo że reklamują (ujawniają) tylko jeden port. Zwykle jest to w porządku, ponieważ przekazujesz tylko jeden oczekiwany port, jednak jeśli użyjesz
--net=host
, otrzymasz wszystkie porty kontenera nasłuchujące na hoście, nawet te, które nie są wymienione w pliku Dockerfile. Oznacza to, że będziesz musiał dokładnie sprawdzić kontener (zwłaszcza jeśli nie jest twój, np. Oficjalny dostarczony przez projekt oprogramowania), aby upewnić się, że nieumyślnie nie ujawnisz dodatkowych usług na komputerze.źródło
--net=host
kontenery będą go widzieć, ale oczywiście tylko jeden program na raz może nasłuchiwać na danym porcie bez względu na to, w którym kontenerze go uruchomisz, w tej konfiguracji ).źródło
host
), jeśli istnieje możliwość uruchomienia wielu kontenerów na tym samym hoście. W innych przypadkach (gdzie izolacja sieci nie jest wymagana), wolałbym--net=host
.