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:

[[email protected] /]# dnf -y install httpd
[[email protected] /]# 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.