Network (síť) umožňuje propojit porty z vnitřku kontejneru do hostitelského systému a vytvářet sítě mezi kontejnery.
Otevření portu pro hostitelský systém
V předešlé části jsme si ukázali sdílení dat (volume). Otevřít se též může port, na kterém probíhá síťová komunikace. Například webový server Nginx přijímá dotazy na portu číslo 80
, ale zatím pouze v kontejneru. Přesuneme se do složky ~/docker-test
(první řádek) a tam s nezměněným konfiguračním souborem Dockerfile
sestavíme (druhý řádek) a spustíme (třetí řádek) kontejner s názvem nginx-test
, podobně jako v předešlé časti.
Tentokrát ale ještě ve třetím řádku přidáme nastavení -p 80:80
, které komunikaci na portu 80
v kontejneru (číslo před dvojtečkou) zveřejní i na portu 8080
na hostitelském systému (číslo za dvojtečkou):
cd ~/docker-test
docker build -t nginx-test .
docker run -d -v ~/docker-test/html:/usr/share/nginx/html -p 80:8080 nginx-test
Odteď se už nemusíme přihlašovat do kontejneru, abychom přes webový server Nginx načítali obsah souboru index.html
ze složky ~/docker-test/html
. Stačí, když na hostitelském systému spustíme příkaz:
curl localhost:8080
Obsah souboru index.html
je teď přístupný z kontejneru a též z hostitelského počítače.
Pokud ale potřebujeme zabezpečit, aby kontejner dokázal komunikovat i s jinými kontejnery (nejen s hostitelským systémem), sáhneme po konfiguraci sítě (network).
Síť mezi kontejnery
Díky síti (network) dokážeme vytvořit izolovaný kanál, na kterém jsou schopné kontejnery mezi sebou komunikovat. Běžně se takový kanál využívá například tehdy, když v jednom kontejneru máme spuštěný webový server a v druhém zase databázový server. Když webový server z prvního kontejneru potřebuje získat údaje z databáze z druhého kontejneru, musíme oba kontejnery zařadit pod stejnou síť. My si to ale zjednodušíme a budeme pracovat pouze s kontejnery webového serveru Nginx. Vytvořme si tedy síť pod názvem sit-test
:
docker network create sit-test
Ověříme si, jestli se síť vytvořila:
docker network ls
Sestavíme a spustíme 2 kontejnery pod názvy nginx-test-1
(první 2 řádky) a nginx-test-2
(poslední 2 řádky) a oba pomocí nastavení --net=sit-test
přidáme do sítě s názvem sit-test
. Za předpokladu, že jsme ve složce ~/docker-test
a nezměnili jsme obsah konfiguračního souboru Dockerfile
, spustíme tyto 4 příkazy:
docker build -t nginx-test-1 .
docker run -d --net=sit-test nginx-test-1
docker build -t nginx-test-2 .
docker run -d --net=sit-test nginx-test-2
Zjistíme IP adresy kontejnerů přiřazených do sítě s názvem sit-test
:
docker network inspect sit-test
V časti Containers hledáme u každého ze dvou kontejnerů IPv4Address
(tu 172.18.0.2
a 172.18.0.3
, u vás se mohou lišit). První IP adresa patří kontejneru nginx-test-
1 a druhá nginx-test-2
.
Zjistíme ID kontejnerů (první řádek; vaše se budou lišit) a přihlásíme se do kontejneru nginx-test-1
s IP adresou 172.18.0.2
(druhý řádek):
docker ps
docker exec -it d5cef9ab1115 bash
Teď už jen zůstává ověřit, jestli se nám načítá soubor index.html
přes webový server Nginx v kontejneru nginx-test-1
s IP adresou 172.18.0.2
z kontejneru nginx-test-2
s IP adresou 172.18.0.3
:
curl 172.18.0.3
Pokud se zobrazil obsah souboru index.html
, znamená to, že oba kontejnery spolu dokážu komunikovat přes síť. Kontejner nginx-test-1
i nginx-test-2
jsme tedy úspěšně přidali do společné izolované sítě sit-test
, ve které se vidí a dokážou si vyměnit informace.
Shrnutí
Ukázali jsme si, jak kontejner otevřít pomocí portu a aby kontejnery dokázaly komunikovat mezi sebou po vyhrazené vnitřní síti.