V této časti začneme v kontejneru používat Volume (obsah) pro práci s perzistentními daty.
V předešlé části jsme si naznačili, že když chceme měnit obsah souboru index.html
, nastává komplikace. Abychom tuto komplikaci vyřešili, soubor index.html
nebudeme kopírovat do kontejneru při každém spuštění (run) obrazu (image) nanovo. Namísto toho jednoduše na soubor index.html
na hostitelském systému odkážeme. Kontejner tak nebude obsah souboru načítat zevnitř (ze svého souborového systému), ale zvenku (ze souborového systému hostitelského systému). Jde o rychlejší způsob spouštění a používání obrazů (images), díky kterému navíc při vymazaní kontejneru nepřijdeme o potřebný obsah (např. ten ze souboru index.html
).
Údaje sdílíme mezi kontejnerem a hostitelským systémem, ale též mezi vícerými kontejnery. No a díky obsahu (volume) se údaje ukládají pouze na hostitelský počítač (ne do kontejneru samotného), díky čemuž se s přibývajícími údaji nezvětšuje velikost kontejneru.
Sdílíme obsah mezi hostitelským systémem a kontejnerem
Tak jako v předešlé časti, i v této budeme pracovat s textovým konfiguračním souborem Dockerfile
ve stejné složce ~/docker-test
a se stejným obrazem (image) nginx-test
. Rozdíl však bude v obsahu souboru Dockerfile
. Nebudeme už totiž kopírovat soubor index.html
z hostitelského systému do kontejneru, pouze na něj odkážeme. Obsah souboru Dockerfile
si v textovém editoru nano upravíme takto:
nano Dockerfile
a vložíme tyto 2 řádky:
FROM nginx
WORKDIR /usr/share/nginx/html
Příkaz z prvního řádku spustí obraz s webovým serverem Nginx. Příkaz v druhém řádku zabezpečí, že se příkazový řádek v kontejneru celkem prakticky otevře ve složce html
, kde se nachází soubor index.html
. Takto můžeme okamžitě po přihlášení do kontejneru ověřit, jestli se soubor index.html
nachází ve správné složce a jestli se jeho obsah doopravdy shoduje s tím na hostitelském počítači.
Soubor uložíme pomocí klávesové zkratky Ctrl + X
a následně stlačením klávesy y
a potvrzením klávesou enter.
Vytvoříme složku s názvem html a přemístíme do ní soubor index.html
:
mkdir ~/docker-test/html && mv ~/docker-test/index.html ~/docker-test/html/
Sestavíme si obraz s nastaveními z konfiguračního souboru Dockerfile
ve složce ~/docker-test
přesně tak, jako v předešlé části (nezapomeneme zkopírovat i tu tečku na konci):
docker build -t nginx-test .
Po úspěšném sestavení obraz nginx-test
spustíme. Oproti minulé části do procesu spuštění ale ještě přidáme jedno nastavení, které nám v kontejneru odkáže na obsah složky na hostitelském počítači (-v ~/docker-test/html:/usr/share/nginx/htm
). Dvojtečkou (:
) oddělujeme cestu ke složce na hostitelském počítači (zde ~/docker-test/html
) a cestu ke složce v kontejneru (zde /usr/share/nginx/html
). Cesta v hostitelskému počítači je vždy první (vlevo od dvojtečky) a cesta v kontejneru vždy druhá (vpravo od dvojtečky).:
docker run -d -v ~/docker-test/html:/usr/share/nginx/html nginx-test
Zjistíme si ID kontejneru (12 znaků z prvního sloupce), který byl spuštěný z obrazu nginx-test:
docker ps
…a přihlásíme se do příkazového řádku (bash) kontejneru (vaše ID se bude lišit):
docker exec -it aaaf9e616e0b bash
Díky příkazu WORKDIR
v konfiguračním souboru Dockerfile
jsme ve složce html
, kde se nachází soubor index.html
. Zde si ověříme, jestli funguje webový server Nginx a jaký je aktuální obsah souboru index.html:
curl localhost
V předešlé části jsme si do souboru index.html uložili uvítací větu “Ahoj z Docker kontejneru!”
, takže se nám zobrazí i teď. Abychom si ověřili, jestli se změny v obsahu na hostitelském počítači projeví okamžitě i v kontejneru (bez opětovného mazaní, sestavování a spouštění obrazu), přidáme na hostitelském počítači ještě jeden řádek:
echo "Tuto větu jsme zapsali z hostitelského počítače." >> ~/docker-test/html/index.html
Opět si v kontejneru necháme vypsat aktuální obsah souboru index.html
a zjistíme, že to, co jsme zapsali na hostitelském počítači, se okamžitě projeví i v kontejneru:
curl localhost
Nemuseli jsme už tedy kontejner zastavit, znovu sestavit a spustit obraz, ale stačilo pouze změnit obsah souboru na hostitelském počítači. Uzavřený kontejner z předešlé části jsme teď otevřeli tak, aby dokázal číst a zapisovat v souborech na hostitelském počítači. Kromě této výhody získáváme další: I po zastavení kontejneru a vymazaní obrazu budeme mít obsah souboru index.html
stále zachovaný, jestli už jsme dělali změny v kontejneru nebo na hostitekském počítači.
Shrnutí
Ukázali jsme si, jak do kontejneru přidávat data pomocí obsahu (volume) tak, aby dokázal číst a zapisovat v souborech na hostitelském systému.