Odpowiedzi:
Zgodnie z odniesieniem do dokowania ,
Ujawnij porty . Podaj oba porty (HOST: CONTAINER) lub tylko port kontenerowy (zostanie wybrany losowy port hosta).
Mój docker-compose.yml
wygląda jak:
mysql:
image: mysql:5.7
ports:
- "3306"
Jeśli to zrobię docker-compose ps
, będzie to wyglądać następująco:
Name Command State Ports
-------------------------------------------------------------------------------------
mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:32769->3306/tcp
Ujawnij porty bez publikowania ich na komputerze hosta - będą one dostępne tylko dla powiązanych usług. Można określić tylko port wewnętrzny.
Porty nie są narażone na hosty, tylko na inne usługi.
mysql:
image: mysql:5.7
expose:
- "3306"
Jeśli to zrobię docker-compose ps
, będzie to wyglądać następująco:
Name Command State Ports
---------------------------------------------------------------
mysql_1 docker-entrypoint.sh mysqld Up 3306/tcp
expose
Dockerfiles: „Instrukcja EXPOSE tak naprawdę nie publikuje portu. Działa jako rodzaj dokumentacji ...” docs.docker.com/engine/reference/builder/#expose
docker-compose run
, definicja portu w docker-compose.yml
jest domyślnie ignorowana . Użyj docker-compose up
lub podaj parametr--service-ports
porty :
wystawiać :
Porty W tej sekcji można zdefiniować mapowanie między serwerem hosta a kontenerem Docker.
ports:
- 10005:80
Oznacza to, że aplikacja działająca w kontenerze jest widoczna na porcie 80. Ale system / jednostka zewnętrzna nie może uzyskać do niej dostępu, dlatego należy ją odwzorować na port serwera hosta.
Uwaga: musisz otworzyć port hosta 10005 i zmodyfikować reguły zapory, aby umożliwić podmiotom zewnętrznym dostęp do aplikacji.
Mogą użyć
http: // {host IP}: 10005
coś takiego
EKSPOZYCJA Służy wyłącznie do zdefiniowania portu, na którym aplikacja działa w kontenerze dokera.
Możesz to również zdefiniować w pliku dokera. Zasadniczo dobrą i powszechnie stosowaną praktyką jest definiowanie EKSPOZYCJI wewnątrz pliku docker, ponieważ bardzo rzadko ktoś uruchamia je na innym porcie niż domyślny 80 port
ports
Sekcja opublikuje porty hosta. Docker skonfiguruje przekierowanie dla określonego portu z sieci hosta do kontenera. Domyślnie jest to realizowane za pomocą procesu proxy przestrzeni użytkownika (docker-proxy
), który nasłuchuje na pierwszym porcie i przekazuje do kontenera, który musi nasłuchiwać w drugim punkcie. Jeśli kontener nie nasłuchuje na porcie docelowym, nadal zobaczysz, że coś nasłuchuje na hoście, ale odmówiono połączenia, jeśli spróbujesz połączyć się z tym portem hosta, z nieudanego przekazania do kontenera.
Uwaga: kontener musi nasłuchiwać na wszystkich interfejsach sieciowych, ponieważ ten serwer proxy nie działa w sieciowej przestrzeni nazw kontenera i nie może osiągnąć 127.0.0.1 wewnątrz kontenera. Metodą IPv4 jest skonfigurowanie aplikacji do nasłuchiwania0.0.0.0
.
Należy również pamiętać, że opublikowane porty nie działają w przeciwnym kierunku. Nie można połączyć się z usługą na hoście z kontenera, publikując port. Zamiast tego znajdziesz błędy dokera próbujące nasłuchiwać na już używanym porcie hosta.
Wystawić to dokumentacja. Ustawia metadane na obrazie, a podczas działania także na kontenerze. Zazwyczaj konfigurujesz to w Dockerfile za pomocą EXPOSE
instrukcji, która służy jako dokumentacja dla użytkowników uruchamiających twój obraz, aby mogli wiedzieć, na których portach domyślnie nasłuchuje twoja aplikacja. Po skonfigurowaniu z plikiem tworzenia te metadane są ustawiane tylko w kontenerze. Widoczne porty można zobaczyć po uruchomieniu docker inspect
na obrazie lub kontenerze.
Istnieje kilka narzędzi opartych na odsłoniętych portach. W oknie dokowanym-P
flaga opublikuje wszystkie odsłonięte porty w przejściowych portach na hoście. Istnieją również różne zwrotne serwery proxy, które domyślnie używają odsłoniętego portu podczas wysyłania ruchu do aplikacji, jeśli nie ustawisz jawnie portu kontenera.
Oprócz tych zewnętrznych narzędzi, expose nie ma żadnego wpływu na tworzenie sieci między kontenerami. Potrzebujesz tylko wspólnej sieci dokerów i połączenia z portem kontenera, aby uzyskać dostęp do jednego kontenera z drugiego. Jeśli ta sieć została utworzona przez użytkownika (np. Nie jest to domyślna nazwa sieci mostowej bridge
), możesz użyć DNS, aby połączyć się z innymi kontenerami.
Całkowicie zgadzam się z odpowiedziami wcześniej. Chciałbym tylko wspomnieć, że różnica między ekspozycją a portami jest częścią koncepcji bezpieczeństwa w oknie dokowanym. To idzie w parze z siecią dokerów. Na przykład:
Wyobraź sobie aplikację z interfejsem WWW i zapleczem bazy danych. Świat zewnętrzny potrzebuje dostępu do interfejsu WWW (być może na porcie 80), ale tylko sam interfejs potrzebuje dostępu do hosta bazy danych i portu. Korzystając z mostka zdefiniowanego przez użytkownika, tylko port internetowy musi zostać otwarty, a aplikacja bazy danych nie potrzebuje żadnych portów otwartych, ponieważ interfejs internetowy może do niego dotrzeć za pośrednictwem mostu zdefiniowanego przez użytkownika.
Jest to częsty przypadek użycia podczas konfigurowania architektury sieci w oknie dokowanym. Na przykład w domyślnej sieci pomostowej żadne porty nie są dostępne ze świata zewnętrznego. Dlatego możesz otworzyć punkt wewnętrzny z „portami”. Używając „ujawnij” definiujesz komunikację w sieci. Jeśli chcesz udostępnić domyślne porty, nie musisz definiować „narażania” w pliku skompilowania dokera.
expose
wdocker-compose
? O ile mi wiadomo, nie trzeba określać ekspozycji, aby porty były dostępne dla połączonych usług.