Ujawnij porty . Podaj oba porty (HOST: CONTAINER) lub tylko port kontenerowy (zostanie wybrany losowy port hosta).
Porty wymienione w docker-compose.yml będą współużytkowane przez różne usługi uruchomione przez docker-compose.
Porty będą narażone na hosta na losowy port lub dany port.
Mój docker-compose.ymlwyglą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
czy możliwe byłoby eto wyjaśnić, jakie są zalety wyszczególnienia exposew docker-compose? O ile mi wiadomo, nie trzeba określać ekspozycji, aby porty były dostępne dla połączonych usług.
Juicy
3
Czy nie powinno to oznaczać, że odsłonięte porty będą dostępne tylko dla usług w tej samej sieci dokerów (łączenie jest zastępowane w przypadku większości części) ?.
Czy porty zastępują jakiekolwiek ustawienia na poziomie zapory? Właśnie zauważyłem, że nie otworzyłem portów dla mysql na firewallu, ale były one dostępne zdalnie. Miałem Porty ustawione na „3306: 3306” zamiast ekspozycji.
TekiusFanatikus
3
I pamiętaj, jeśli używasz docker-compose run, definicja portu w docker-compose.ymljest domyślnie ignorowana . Użyj docker-compose uplub podaj parametr--service-ports
Juha Untinen
177
porty :
Aktywuje kontener w celu nasłuchiwania określonych portów ze świata poza dokerem (może to być ta sama maszyna hosta lub inna maszyna) ORAZ dostępny świat w dokerze.
Można podać więcej niż jeden port (dlatego porty nie są portami)
wystawiać :
Aktywuje kontener, aby nasłuchiwał określonego portu tylko ze świata wewnątrz dokera ORAZ niedostępnego świata poza dokerem.
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
portsSekcja 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.
Expose
Wystawić to dokumentacja. Ustawia metadane na obrazie, a podczas działania także na kontenerze. Zazwyczaj konfigurujesz to w Dockerfile za pomocą EXPOSEinstrukcji, 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 inspectna 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.expose
Dockerfiles: „Instrukcja EXPOSE tak naprawdę nie publikuje portu. Działa jako rodzaj dokumentacji ...” docs.docker.com/engine/reference/builder/#exposedocker-compose run
, definicja portu wdocker-compose.yml
jest domyślnie ignorowana . Użyjdocker-compose up
lub podaj parametr--service-ports
porty :
wystawiać :
źródło
Porty W tej sekcji można zdefiniować mapowanie między serwerem hosta a kontenerem Docker.
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ć
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
źródło
Porty
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łuchiwania
0.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.
Expose
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 uruchomieniudocker 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.źródło
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:
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.
źródło