V tejto časti začneme kontajner používať Volume (obsah) pre prácu s perzistnentnými dátami.
V predošlej časti sme si naznačili, že ak chceme meniť obsah súboru index.html
, nastáva komplikácia. Aby sme túto komplikáciu vyriešili, súbor index.html
nebudeme kopírovať do kontajnera pri každom spustení (run) obrazu (image) nanovo. Namiesto toho jednoducho na súbor index.html
na hostiteľskom systéme odkážeme. Kontajner tak nebude obsah súboru načítavať zvnútra (zo svojho súborového systému), ale zvonka (zo súborového systému hostiteľského systému). Ide o rýchlejší spôsob spúšťania a používania obrazov (images), vďaka ktorému navyše pri vymazaní kontajnera neprídeme o potrebný obsah (napr. ten zo súboru index.html
).
Údaje zdieľame medzi kontajnerom a hostiteľským systémom, ale tiež medzi viacerými kontajnermi. No a vďaka obsahu (volume) sa údaje ukladajú iba na hostiteľský počítač (nie do kontajnera samotného), vďaka čomu sa s pribúdajúcimi údajmi nezväčšuje veľkosť kontajnera.
Zdieľame obsah medzi hostiteľským systémom a kontajnerom
Tak ako v predošlej časti, aj v tejto budeme pracovať s textovým konfiguračným súborom Dockerfile
v rovnakom priečinku ~/docker-test
a s rovnakým obrazom (image) nginx-test
. Rozdiel však bude v obsahu súboru Dockerfile
. Nebudeme už totiž kopírovať súbor index.html
z hostiteľského systému do kontajnera, iba naň odkážeme. Obsah súboru Dockerfile
si v textovom editore nano upravíme takto:
nano Dockerfile
a vložíme tieto 2 riadky:
FROM nginx
WORKDIR /usr/share/nginx/html
Príkaz z prvého riadku spustí obraz s webovým serverom Nginx. Príkaz v druhom riadku zabezpečí, že sa príkazový riadok v kontajneri celkom prakticky otvorí v priečinku html
, kde sa nachádza súbor index.html
. Takto môžeme okamžite po prihlásení do kontajnera overiť, či sa súbor index.html
nachádza v správnom priečinku a či sa jeho obsah naozaj zhoduje s tým na hostiteľskom počítači.
Súbor uložíme pomocou klávesovej skratky Ctrl + X
a následne stlačením klávesu y
a potvrdením klávesom enter.
Vytvorime priečinok s názvom html a premiestnime doň súbor index.html
:
mkdir ~/docker-test/html && mv ~/docker-test/index.html ~/docker-test/html/
Zostavíme si obraz s nastaveniami z konfiguračného súboru Dockerfile
v priečinku ~/docker-test
presne tak, ako v predošlej časti (nezabudneme skopírovať aj tú bodku na konci):
docker build -t nginx-test .
Po úspešnom zostavení obraz nginx-test
spustíme. Oproti minulej časti do procesu spustenia ale ešte pridáme jedno nastavenie, ktoré nám v kontajneri odkáže na obsah priečinku na hostiteľskom počítači (-v ~/docker-test/html:/usr/share/nginx/htm
). Dvojbodkou (:
) oddeľujeme cestu k priečinku na hostiteľskom počítači (tu ~/docker-test/html
) a cestu k priečinku v kontajneri (tu /usr/share/nginx/html
). Cesta v hostiteľskom počítači je vždy prvá (vľavo od dvojbodky) a cesta v kontajneri vždy druhá (vpravo od dvojbodky).:
docker run -d -v ~/docker-test/html:/usr/share/nginx/html nginx-test
Zistíme si ID kontajnera (12 znakov z prvého stĺpca), ktorý bol spustený z obrazu nginx-test:
docker ps
…a prihlásime sa do príkazového riadku (bash) kontajnera (vaše ID sa bude líšiť):
docker exec -it aaaf9e616e0b bash
Vďaka príkazu WORKDIR
v konfiguračnom súbore Dockerfile
sme v priečinku html
, kde sa nachádza súbor index.html
. Tu si overíme, či funguje webový server Nginx a aký je aktuálny obsah súboru index.html:
curl localhost
V predošlej časti sme si do súboru index.html uložili uvítaciu vetu “Ahoj z Docker kontajnera!”
, takže sa nám zobrazí aj teraz. Aby sme si overili, či sa zmeny v obsahu na hostiteľskom počítači prejavia okamžite aj v kontajneri (bez opätovného mazania, zostavovania a spustenia obrazu), pridáme na hostiteľskom počítači ešte jeden riadok:
echo "Túto vetu sme zapísali z hostiteľského počítača." >> ~/docker-test/html/index.html
Opäť si v kontajneri necháme vypísal aktuálny obsah súboru index.html
a zistíme, že to, čo sme zapísali na hostiteľskom počítači, sa okamžite prejaví aj v kontajneri:
curl localhost
Nemuseli sme už teda kontajner zastaviť, znovu zostaviť a spustiť obraz, ale stačilo iba zmeniť obsah súboru na hostiteľskom počítači. Uzavretý kontajner z predošlej časti sme teraz otvorili tak, aby dokázal čítať a zapisovať v súboroch na hostiteľskom počítači. Okrem tejto výhody získavame ďalšiu: Aj po zastavení kontajnera a vymazaní obrazu budeme mať obsah súboru index.html
stále zachovaný, či už sme robili zmeny v kontajneri alebo na hostiteľskom počítači.
Zhrnutie
Ukázali sme si ako kontajner do kontajnera pridávať dáta pomocou obsahu (volume) tak, aby dokázal čítať a zapisovať v súboroch na hostiteľskom systéme.