Network (sieť) umožnuje prepojiť porty z vnútra kontajnera do hostiteľského systému a vytvárať siete medzi kontajnermi.
Otvorenie portu pre hostiteľský systém
V predošlej časti sme si ukázali zdieľanie dát (volume). Otvoriť sa tiež môže port, na ktorom prebieha sieťová komunikácia. Napríklad webový server Nginx prijíma dopyty na porte číslo 80
, ale zatiaľ iba v kontajneri. Presunieme sa do priečinka ~/docker-test
(prvý riadok) a tam s nezmeneným konfiguračným súborom Dockerfile
zostavíme (druhý riadok) a spustíme (tretí riadok) kontajner s názvom nginx-test
, podobne ako v predošlej časti.
Tentokrát ale ešte v treťom riadku pridáme nastavenie -p 80:80
, ktoré komunikáciu na porte 80
v kontajneri (číslo pred dvojbodkou) zverejní aj na porte 8080
na hostiteľskom systéme (číslo za dvojbodkou):
cd ~/docker-test
docker build -t nginx-test .
docker run -d -v ~/docker-test/html:/usr/share/nginx/html -p 80:8080 nginx-test
Odteraz sa už nemusíme prihlasovať do kontajnera, aby sme cez webový server Nginx načítali obsah súboru index.html
z priečinka ~/docker-test/html
. Stačí, keď na hostiteľskom systéme spustíme príkaz:
curl localhost:8080
Obsah súboru index.html
je teraz prístupný z kontajnera a tiež z hostiteľského počítača.
Ak ale potrebujeme zabezpečiť, aby kontajner dokázal komunikovať aj s inými kontajnermi (nie len s hostiteľským systémom), siahneme po konfigurácii siete (network).
Sieť medzi kontajnermi
Vďaka sieti (network) dokážeme vytvoriť izolovaný kanál, na ktorom sú schopné kontajnery medzi sebou komunikovať. Bežne sa takýto kanál využíva napríklad vtedy, keď v jednom kontajneri máme spustený webový server a v druhom zase databázový server. Ak webový server z prvého kontajnera potrebuje získať údaje z databázy z druhého kontajnera, musíme oba kontajnery zaradiť pod rovnakú sieť. My si to ale zjednodušíme a budeme pracovať iba s kontajnermi webového servera Nginx. Vytvorme si teda sieť pod názvom siet-test
:
docker network create siet-test
Overíme si, či sa sieť vytvorila:
docker network ls
Zostavíme a spustíme 2 kontajneri pod názvami nginx-test-1
(prvé 2 riadky) a nginx-test-2
(posledné 2 riadky) a oba pomocou nastavenia --net=siet-test
pridáme do siete s názvom siet-test
. Za predpokladu, že sme v priečinku ~/docker-test
a nezmenili sme obsah konfiguračného súboru Dockerfile
, spustíme tieto 4 príkazy:
docker build -t nginx-test-1 .
docker run -d --net=siet-test nginx-test-1
docker build -t nginx-test-2 .
docker run -d --net=siet-test nginx-test-2
Zistíme IP adresy kontajnerov priradených do siete s názvom siet-test
:
docker network inspect siet-test
V časti Containers hľadáme pri každom z dvoch kontajnerov IPv4Address
(tu 172.18.0.2
a 172.18.0.3
, u vás sa môžu líšiť). Prvá IP adresa patrí kontajneru nginx-test-
1 a druhá nginx-test-2
.
Zistíme ID kontajnerov (prvý riadok; vaše sa budú líšiť) a prihlásime sa do kontajnera nginx-test-1
s IP adresou 172.18.0.2
(druhý riadok):
docker ps
docker exec -it d5cef9ab1115 bash
Teraz už len zostáva overiť, či sa nám načíta súbor index.html
cez webový server Nginx v kontajneri nginx-test-1
s IP adresou 172.18.0.2
z kontajnera nginx-test-2
s IP adresou 172.18.0.3
:
curl 172.18.0.3
Ak sa zobrazil obsah súboru index.html
, znamená to, že oba kontajnery spolu dokážu komunikovať cez sieť. Kontajner nginx-test-1
aj nginx-test-2
sme teda úspešne pridali do spoločnej izolovanej siete siet-test
, v ktorej sa vidia a dokážu si vymieňať informácie.
Zhrnutie
Ukázali sme si ako kontajner otvoriť pomocou portu a aby kontajnery dokázali komunikovať medzi sebou po vyhradenej vnútornej sieti.