Docker platforma dovoluje sestavit aplikaci z komponent a tu pak distribuovat jako celek, beze změn mezi testovacím a produkčním prostředím. Pojďme se podívat, jak se to dělá.
V minulém díle jsme se podívali na to, jak si na své Fedoře nainstalovat Docker démon, jak z Docker Hubu stáhnout obraz s Fedorou a jak se takovému kontejneru podívat na zoubek. Dnes se podíváme na zoubek tomu, jak takový obraz vytvořit.
Vytvoření kontejneru pomocí docker commit
Nejdříve si spustíme docker container se základní Fedorou:
$ sudo docker pull fedora $ sudo docker run -ti fedora bash
Nyní můžeme nainstalovat například Apache HTTPD démon a vytvořit jednu HTML stránku:
[root@053a7955d5f9 /]# dnf -y install httpd [root@053a7955d5f9 /]# echo "Pozdrav z kontejneru" >/var/www/html/index.html
V druhém terminálu teď uděláme něco, co připomíná práci s gitem. Nejdříve zjistíme identifikátor běžícího kontejneru, kterým je vždy hash a nějaký čitelný identifikátor (pokud není tento specifikován, je vytvořena náhodná kombinace dvou slov, která je občas celkem legrační):
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 053a7955d5f9 fedora "bash" 32 minutes ago Up 32 minutes stupefied_ptolemy
Potom pomocí příkazu commit zmrazíme běžící kontejner a vytvoříme tak obraz:
$ sudo docker commit 053a7955d5f9 fb521036220790890a074e162ee15d367c35adbe74e202c7c6905900624b6f26
Vrácený hash je unikátní identifikátor nového obrazu a tomuto můžeme přiřadit nějaké hezčí jméno tímto způsobem:
$ sudo docker tag fb52103622079 pozdrav
Jak je vidět, docker rozumí i libovolnému unikátnímu prefixu, takže není nutné pracovat s kompletním hashem.
Spuštění vytvořeného obrazu
Nyní můžeme takto vytvořený obraz spustit znovu a navíc uvedeme dvě věci:
- příkaz, který se má spustit (v našem případě httpd)
- parametr -p 8080:80, kterým namapujeme port uvnitř kontejneru (80) ven (8080), takže kontejner bude sloužit jako malá mikroslužba běžící na portu 8080 na hostovi:
docker run -p 8080:80 pozdrav httpd -D FOREGROUND
No a v dalším terminálu už se můžeme přesvědčit, že právě spuštěný docker kontejner funguje jako aplikace (k dispozici na síťovém portu a servírující v tomto případě statický obsah):
$ wget localhost:8080 $ cat index.html Pozdrav z kontejneru
Vytváření obrazů pomocí příkazu commit se sice může občas hodit, ale je potřeba si uvědomit, že vytváření obrazů tímto způsobem není možné vždy zreprodukovat. Proto se podíváme na jiný, lepší způsob, jak vytvářet obrazy.
Vytváření obrazů pomocí docker build
Stejně jako pro vytváření RPM balíků máme RPM SPEC soubor, pro vytváření Docker obrazů máme Dockerfile. Pro stejný obraz, jaký jsme vytvořili výše pomocí
docker commit
bude Dockerfile vypadat takto:
FROM fedora RUN dnf -y install httpd RUN echo "Pozdrav z kontejneru podruhe" >/var/www/html/index.html CMD ["httpd", "-DFOREGROUND"]
Obraz potom vytvoříme a zároveň pojmenujeme tímto příkazem:
$ sudo docker build -t pozdrav-2 .
Nyní můžeme obraz použít stejným způsobem, jako v prvním případě. V tomto případě máme nicméně reprodukovatelný obraz:
docker run -p 8080:80 pozdrav-2
(všimněte si, že nyní nemusíme specifikovat příkaz httpd, ten jsme totiž v Dockerfilu spefikovali jako výchozí.
A v druhém terminálu můžeme opět vyzkoušet:
$ wget localhost:8080 $ cat index.html Pozdrav z kontejneru podruhe
Pozor na cache Docker démona
Během provádění
docker build
vidíme, že každý příkaz je označen hashem a při opětovném buildění jsou jednotlivé řádky prováděny rychleji (pokud se Dockerfile nezměnil). Je to tím, že Docker démon každý řádek bere jako jednu vrstvu a tu ukládá do cache paměti. To může být zdrojem problémů, protože i výstup příkazu
dnf install ...
je cachován a tím pádem může výsledný obraz obsahovat stará data. Doporučuji proto při vytváření obrazu použít volbu
--no-cache=true
.
Tímto tipem uzavíráme základní informace o vytváření obrazů, s tímto jste připraveni na vytváření jednoduchých obrazů. Jak vytvářet komplikovanější obrazy zjistíte v dokumentaci Dockeru.
29. 1. 2016 at 14:39
typo: „s“ Docker Hubu stáhnout -> „z“ Docker Hubu stáhnout
1. 2. 2016 at 22:14
Diky!