- Praktický úvod do Docker a kontejnerů (1) – od instalace po první kontejnery
- Praktický úvod do Docker a kontejnerů (2) – propojování
- Praktický úvod do Docker a kontejnerů (3) – víc najednou aneb něco užitečného s Docker Compose
- Praktický úvod do Docker a kontejnerů (4) – jak z nich získat maximum
- Praktický úvod do Docker a kontejnerů (5) – Docker Machine
- Praktický úvod do Docker a kontejnerů (6) – cluster hostitelů s Docker Swarm
- Praktický úvod do Docker a kontejnerů (7) – scheduler v Docker Swarm
- Praktický úvod do Docker a kontejnerů (8) – váš vlastní registr obrazů
- Praktický úvod do Docker a kontejnerů (9) – multi-host networking
- Praktický úvod do Docker a kontejnerů (10) – Windows kontejnery s Docker API
- Praktický úvod do Docker a kontejnerů (11) – Windows kontejnery s PowerShell
- Praktický úvod do Docker a kontejnerů (12) – Windows Hyper-V kontejner
- Praktický úvod do Docker a kontejnerů (13) – Swarm mode, service, balancing, scaling (v1.12)
Kontejnery
Tento seriál bude hodně o praktickém zkoušení, takže teoretický úvod téměř přeskočíme. Kontejner je zjednodušeně řečeno virtualizace, u které se ovšem nesimuluje veškerý hardware, nad kterým potom běží celý virtuální počítač. Kontejnery sdílejí kernel hosta a jejich (mimochodem velmi robustní) izolace využívá mnoha Linux technologií současně jako jsou namespace (oddělení síťové komunikace) nebo cgroups. Kontejner je velmi malý, snadno přenositelný, extrémně rychle startuje a je podstatně efektivnější co do využití zdrojů. Docker dává kontejnerům jednoduchost ovládání, přináší inkrementální obrazy, obsahuje networking (v zásadě NAT a port forwarding), propojování, sdílení, jednoduchou tvorbu a hub (místo, kde můžete obrazy sdílet s ostatními).
V první části seriálu se zaměříme na základní instalaci a práci s kontejnery, v druhé se pustíme do složitějších situací, jako je kooperace několika kontejnerů. To podstatné přijde v části třetí, kde se zaměřím na mentalitu a praktiky využití kontejnerů – v ten moment už budeme mít za sebou první zkušenost a to, co se vám bude v prvních dvou dílech zdát třeba podivné (pokud srovnáte s klasickou virtualizací), tak začne dávat velký smysl. Kontejnery fungují jinak, než VM – je nesmysl snažit se je k takovému chování donutit. Cíl je opačný – kontejnery (a po přidání orchestrace i celé PaaS – Platform as a Service) jsou nástroje pro nový styl v IT, správě i vývoji. Změňte hru, zkuste si to v tomto seriálu.
Instalace a první kontejner
Začneme z jednoduché VM (Docker může běžet na bare metal i ve VM) třeba s Ubuntu Server 14.04 a nainstalujeme cURL (jednoduchý “prohlížeč”):
sudo apt-get update sudo apt-get install curl
Docker se dá nainstalovat velmi jednoduchým skriptem – napište tohle a čekejte:
wget -qO- https://get.docker.com/ | sh
Hotovo. Pokud chcete, aby bylo možné Docker ovládat i z běžného uživatelského účtu (ne pouze root nebo přes sudo), zadejte například pro existujícího uživatele cloudsvet toto:
usermod -aG docker cloudsvet
Teď se musíte odhlásit, aby změna v nastavení účtu zafungovala. Připojte se jako uživatel cloudsvet a spustíme si svůj první kontejner. Zadejte:
cloudsvet@ubuntu:~$ docker run hello-world Unable to find image 'hello-world:latest' locally Pulling repository docker.io/library/hello-world af340544ed62: Download complete 535020c3e8ad: Download complete Status: Downloaded newer image for hello-world:latest Hello from Docker. This message shows that your installation appears to be working correctly. ....
Co se stalo? Příkazem docker run hello-world jsme řekli, že chceme spustit kontejner obsahující obraz s názvem hello-world (obrazy kontejnerů mohou mít různé tagy označující třeba verze; protože jsme nic konkrétního neuvedli, použije se image s tagem latest). Docker se ho pokusil najít lokálně a neuspěl, takže ho stáhl z Internetu z Docker hub (veřejný repositář obrazů). Jakmile ho stáhl, vytvořil kontejner a ten spustil (kontejner má nějaké vstupní místo – skript nebo proces). Skript uvnitř kontejneru nám pouze vypsal zprávu, ovšem z vnitřku kontejneru. Gratuluji – právě jste viděli svůj první spuštěný kontejner. Mimochodem skript doběhl do konce a tím se kontejner vypnul (kontejnery běží jen dokud běží proces, který byl na úvodu spuštěn).
Spusťte teď “docker run hello-world” ještě jednou (tedy vytvořte další kontejner s tímto obrazem). Za jak dlouho jste dostali výstup? Rychle? Protože už je vše stažené, tak jste právě viděli, jak dokáže kontejner nastartovat za pár milisekund – tohle s VM nejde!
Vytvořte si vlastní kontejner
Ukažme si jak teď funguje interaktivní přístup do kontejneru a také vrstvení. Využijeme hotový obraz s torzem nějakého Linux OS, třeba Debian. Parametrem -it řekneme, že se chceme interaktivně připojit a také uvedeme, že proces, který se má nastartovat, je bash (tedy příkazová řádka Linuxu). Zadejte tohle:
cloudsvet@ubuntu:~$ docker run -it --name mujDebian debian bash
Hned jak se všechno stáhne, ocitnete se uvnitř kontejneru v Debian prostředí:
root@d1cbba435b85:/#
Všimněte si, že kontejner vidí síťové rozhraní, ale to je virtuální a jeho IP adresa je jiná, než na hostujícím počítači. Docker zajišťuje sdílení přístupu ven z kontejneru, takže uvnitř můžete třeba stahovat balíčky nebo aktualizace. Pokud ale má kontejner nabízet nějakou službu přístupnou zvenku, budeme mu to muset říct – ale o tom až později.
root@d1cbba435b85:/# ip ad 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 150: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:4a brd ff:ff:ff:ff:ff:ff inet 172.17.0.74/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:4a/64 scope link valid_lft forever preferred_lft foreve
Pojďme třeba nainstalovat jednoduchý statický webový server:
root@d1cbba435b85:/# apt-get update && apt-get install lighttpd -y Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB] Get:2 http://httpredir.debian.org jessie InRelease [134 kB] ... iSetting up lighttpd (1.4.35-4) ... invoke-rc.d: policy-rc.d denied execution of start. Setting up rename (0.20-3) ... update-alternatives: using /usr/bin/file-rename to provide /usr/bin/rename (rename) in auto mode Setting up spawn-fcgi (1.6.4-1) ... Processing triggers for libc-bin (2.19-18) ... Processing triggers for systemd (215-17+deb8u1) ... root@d1cbba435b85:/#
V hlavním adresáři teď vytvořme jednoduchý konfigurační soubor a také primitivní stránku:
root@d1cbba435b85:/# echo 'server.document-root="./"' > lighttpd.conf root@d1cbba435b85:/# echo 'server.port=80' >> lighttpd.conf root@d1cbba435b85:/# echo " <H1>Tohle je muj web</H1> " > index.html
Hotovo – vyskočte příkazem exit. Všimněte si, že tím se kontejner vypnul (skončil jeho vstupní proces), takže v seznamu běžících nebude:
cloudsvet@ubuntu:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESS
Ale najdeme ho takhle:
cloudsvet@ubuntu:~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d1cbba435b85 debian "bash" 7 minutes ago Exited (0) 8 seconds ago mujDebian c0ddfdbbc56d hello-world "/hello" 27 minutes ago Exited (0) 27 minutes ago fervent_joness
Pojďme teď z toho kontejneru udělat nový image. Na rozdíl od klasické VM k tomu dojde vždy (povinně) přírůstkovým způsobem – tzn. výsledný image bude jako základ mít náš image debian a nad ním přidanou vrstvu, ve které jsou změny, které jsme společně provedli (tedy instalace web serveru a vytvoření souborů). Jake změny to jsou? Zadejte tento příkaz:
cloudsvet@ubuntu:~$ docker diff mujDebian ... C /var/log/dpkg.log A /var/log/lighttpd A /var/www A /var/www/html A /var/www/html/index.lighttpd.html
Uložme (proveďme commit) tohle všechno jako nový obraz, který pojmenujeme jako cloudsvet:mujWebImage:
cloudsvet@ubuntu:~$ docker commit mujDebian cloudsvet:mujWebImage a837d01b0c703826857d71d75ccdf07cfa7b1f5196f918275cc1458fef0a5168
Prohlédněme si uložené image:
cloudsvet@ubuntu:~$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE cloudsvet mujWebImage a837d01b0c70 23 seconds ago 184 MB hello-world latest af340544ed62 9 days ago 960 B debian latest 9a61b6b1315e 4 weeks ago 125.2 MB
Můžeme tedy spustit nový kontejner s tímto onrazem. Tentokrát to uděláme s volbou -d, která spustí kontejner “odpojený”, tedy na pozadí. Dále použijeme volbu -p, protože chceme, aby bylo možné zvenku přistoupit na službu, kterou kontejner nabízí. V našem případě to bude uvnitř kontejneru náš jednoduchý web běžící na portu 80, který směrem ven Docker poskytne na IP adrese hostujícího systému na portu 9080:
hp@ubuntu:~$ docker run -d -p 9080:80 --name mujWeb cloudsvet:mujWebImage lighttpd -D -f lighttpd.conf caa56b5d20272dbe4da8329918d7b859d69fe8acbd62aabfe6d6cf1f1231e369
Opět si všimněte rychlého startu – do pár milisekund můžete hned vyzkoušet:
cloudsvet@ubuntu:~$ curl 127.0.0.1:9080/index.html <H1>Tohle je muj web</H1>
Kontejner nám pěkně běží:
cloudsvet@ubuntu:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES caa56b5d2027 cloudsvet:mujWebImage "lighttpd -D -f light" 28 seconds ago Up 27 seconds 0.0.0.0:9080->80/tcp mujWeb
Automatické vytváření kontejneru
Kontejner, který jsme společně vytvořili má některé nepříjemnosti a v tomto díle se zaměříme (zatím jen) na to, že je statický. Co když budete chtít novější verzi web serveru nebo začít z jiné verze Debianu? Co když vám konfigurace web serveru nevyhovuje a potřebujete jinou? Budete kvůli tomu dělat kontejner takto ručně znova? To není ideální. Co kdybychom proces vytváření obrazu kontejneru, který bude mít stejný výsledek, automatizovali? Díky tomu ho vytvoříme jedním příkazem a jednoduše můžeme změnit verze nebo konfigurační soubory.
Vytvořte si nový adresář v host systému a v něm konfigurační soubor lighttpd.conf a index.html – tyto budeme automaticky kopírovat dovnitř kontejneru. Následně vytvořte soubor “Dockerfile” s tímto obsahem:
FROM debian RUN apt-get update && apt-get install lighttpd -y EXPOSE 80 ADD lighttpd.conf . ADD index.html . CMD lighttpd -D -f lighttpd.conf
V části FROM říkáme, z jakého kontejneru chceme vycházet (což může být jako v tomto případě oficiální kontejner, ale klidně i kontejner vašeho kamaráda). Příkaz RUN po nastartování debian kontejneru provede operace, které určíme a zakončí je commitem (tedy vytvoří celou novou vrstvu – je tedy dobré dát například všechny instalace balíčků do jednoho RUN). Příkaz EXPOSE říká, že uvnitř kontejneru běží něco zajímavého na portu 80. ADD přidává soubory z lokálního adresáře do kontejneru. Nakonec CMD je výchozí vstupní proces, tedy příkaz, který se provede po startu hotového kontejneru a v našem případě spustí lighttpd (abychom to nemuseli zadávat při spuštění ručně).
Teď už můžeme svůj kontejner vybudovat:
cloudsvet@ubuntu:~/docker/DalsiWeb$ docker build -t cloudsvet:dalsiWeb . Sending build context to Docker daemon 4.096 kB Step 0 : FROM debian ---> 9a61b6b1315e Step 1 : RUN apt-get update && apt-get install lighttpd -y ... ---> 31a346be2ea2 Step 2 : EXPOSE 80 ... ---> 5f370af6c3bc Step 3 : ADD lighttpd.conf . ---> bab76958ae94 Removing intermediate container 4049abc3ffdd Step 4 : ADD index.html . ---> 2a566fc6050a Removing intermediate container 243b5ecf4d60 Step 5 : CMD lighttpd -D -f lighttpd.conf ---> Running in a6371f211a63 ---> d502f2ae62c6 Removing intermediate container a6371f211a63 Successfully built d502f2ae62c6
Podívejte se, že náš nový image existuje a spusťte nový kontejner tentokrát s argumentem -P (vnitřní port jsme specifikovali přes EXPOSE při budování a tento přepínač mu přiřadí nějaký z volných portů na host systému), podívejte se, na kterém externím portu najdeme náš web server a vyzkoušejte ho.
cloudsvet@ubuntu:~/docker/DalsiWeb$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE cloudsvet dalsiWeb d502f2ae62c6 About an hour ago 184.1 MB ... cloudsvet@ubuntu:~$ docker run -d -P --name dalsiWebKontejner2 cloudsvet:dalsiWeb c9a7add778ec656f9dc4749783345a57f400b51c1971683dec8f976da91017f1 cloudsvet@ubuntu:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c9a7add778ec cloudsvet:dalsiWeb "/bin/sh -c 'lighttpd" 2 seconds ago Up 1 seconds 0.0.0.0:32768->80/tcp dalsiWebKontejner2 cloudsvet@ubuntu:~$ curl 127.0.0.1:32768/index.html <H1>Tohle je druhy web</H1>
Dokáže tohle vaše VM? 🙂
Dnes jsme si ukázali úplné základy – nejlepší je si to vyzkoušet! Příště si předvedeme některé velmi důležité pokročilejší věci (například jak si spolu kontejnery popovídají, jak můžete využít hotových kontejnerů pro získání databáze či redakčního systému nebo jak popsat několik kontejnerů a jejich vztahy v jediném souboru). Ve čtvrté, z mého pohledu nejdůležitější části, se pokusím shrnout některé praktiky a myšlenkové postupy, které jsou základem úspěšného využití těchto technologií v praxi. Současně zjistíme, že kontejnery samotné jsou velmi užitečné (stejně jako se to před lety zjistilo u VM), ale to pravé z nich dostanete až po nasazení automatizace a orchestrace celého aplikačního prostředí – tedy PaaS. K Docker se ještě vrátíme a v páté části poznáme provisioning hostitelů s Docker Machine, v šesté a sedmé spojíme hostitele do clusteru s Docker Swarn a v osmé se zaměříme na multi-host overlay networking. A to ještě nebude všechno.
Diky, fakt pekne napsany, uz se tesim na pokracovani …
Díky! Už je tam další 🙂
http://www.cloudsvet.cz/?p=266
[…] minulém díle jsme si Docker nainstalovali a rozjeli pár kontejnerů. Dnes pokračujeme dál, vrhněte se do […]
[…] první díle jsme se naučili základy Dockeru a v druhém jejich propojování. Dnes budeme pokračovat, ale […]
[…] stránkách cloudsvet jsme v seriálu Praktický úvod do Docker poměrně detailně prošli vlastnosti kontejnerů. Ukázali jsme si řadu velmi zajímavých […]
“`
sudo curl -sSL https://get.docker.com/ | sh
“`
Az mi doslo zle. Ako moze niekto toto vobec propagovat? To je ako povedat: “tu je root konzola, robte si co chcete”.
“`
usermod -aG docker cloudsvet
“`
Je lepsie (bezpecnejsie) si nakonfigurovat pristup k dockeru cez sudo.
http://www.projectatomic.io/blog/2015/08/why-we-dont-let-non-root-users-run-docker-in-centos-fedora-or-rhel/
Díky za komentář. Smyslem tohoto blogu jsou koncepty a architektura. Tedy jak se může člověk rychle dostat k pochopení principů a ideálně si je v labu vyzkoušet. Nejde o učebnici Linuxu. Ostatně od pátého dílů budeme instalovat výhradně přes docker-machine.
Budu rád, pokud své myšlenky na bezpečnostní doporučení sepíšete do článku, který rádi otiskneme nebo budeme referencovat. Díky za sdílení.
[…] ale prostředí z minulých částí seriálu je v tomto ohledu ruční. Jak říci který kontejner s kterým může mluvit? Používáme zde koncept profilů, či chcete-li tagů. Vytvoříte si […]
Davat link na dalsi dil do komentu neni uplne nejlepsi napad 🙂 Chtelo by to nejakou stabni kulturu, jak je to na jinych podobnych webech, napriklad sipkou odkaz na dalsi.
Nevíte o nějakém WordPress pluginu, který by mi něco takového pomohl udělat?
Tak jo, našel jsem plugin na navigace seriálem. Díky za námět. Lepší?
[…] Praktický úvod do Docker a kontejnerů (1) – od instalace po první kontejnery […]