Jaka jest różnica między portami tworzenia dokerów a ekspozycjami

461

Jaka jest różnica między opcjami portsiexposedocker-compose.yml

bibstha
źródło

Odpowiedzi:

527

Zgodnie z odniesieniem do dokowania ,

Porty definiuje się jako:

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

Narażenie jest zdefiniowane jako:

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
bibstha
źródło
24
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) ?.
miau
8
@Juicy Myślę, że jest podobny do exposeDockerfiles: „Instrukcja EXPOSE tak naprawdę nie publikuje portu. Działa jako rodzaj dokumentacji ...” docs.docker.com/engine/reference/builder/#expose
tsauerwein
1
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 :

  1. 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.
  2. Można podać więcej niż jeden port (dlatego porty nie są portami)

wprowadź opis zdjęcia tutaj

wystawiać :

  1. Aktywuje kontener, aby nasłuchiwał określonego portu tylko ze świata wewnątrz dokera ORAZ niedostępnego świata poza dokerem.
  2. Można podać więcej niż jeden port

wprowadź opis zdjęcia tutaj

Mehraj Malik
źródło
3
Pamiętaj, że expose zezwala na wiele portów - docs.docker.com/compose/compose-file/#expose - jednak podajesz tylko port wewnętrzny, a nie wewnętrzny + zewnętrzny
Stuart Moore
Ale co zrobić, jeśli chcę uzyskać dostęp do zewnętrznego świata z mojego kontenera? stackoverflow.com/questions/61322256/…
gstackoverflow
25

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

sorabzon
źródło
19

Porty

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.

BMitch
źródło
3

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.

medTech
źródło