26.01.2015

Docker - jak na linuxové kontejnery (LXC)

Za poslední dobu při návštěvě přednášek často slýchávám slovíčko Docker. Jestli jste se k němu ještě nedostali tak teď je ta správná chvíle. Ukážu vám příklad jak rozjet projekt postavený na Djanga z kontejneru.

Co je to vlastně Docker? No není to uplně snadné vysvětlitelné, ale pokusím se o základní popis. Docker je pouze nadstavba pro linuxovými kontejnery, zkratka LXC - LinuX Container. Jen pro upřesnění nejedná se v žádném případě o virtualizaci. Mnohem bližší přirovnání by bylo něco jako chroot a virtualenv. Základní stavebním kamenem jsou zkompilovaný obrazy (images) různých distribucí nad kterým spouštíme procesy, proces běží v uzavřeném prostředí (kontejneru), ale je spuštěn jako jakýkoliv jiný - aspoň se nám tak tváří a můžeme jej vidět ve svém správci procesů. Takže nelze kontejner chápat jako samostatně běžící systém, ale spíš jako proces běžící z uzavřeného libovolného prostředí.

A jak začít? Nejprve si nainstalujeme a spustíme službu Docker. Na ukázku použijeme distribuci Fedora, ale instalační balíček  má stejný název i v Ubuntu, popřípadě jiných distribucích.

>> yum install docker -y  && service docker start

Docker sice máme nainstalovaný, ale abych jej mohli použít musíme vystupovat s administratorskými právy, což není pro práci příliš pohodlné. Tak že nastavíme uživateli přístup ke službě a to snadno přidáním do skupiny docker.

>> sudo usermod -aG docker $USER

Zkontrolujeme příkazem "id" jestli je náš uživatel přiřazen do skupiny 141(lxd)

>> id
uid=1000(pavel) gid=1000(pavel) skupiny=1000(pavel),27(sudo),132(libvirtd),135(docker),141(lxd)

Teď si ukážeme pár zakladních příkazů které se nám hodí pro začátek.

>> docker search <name> # hledání obrazu ve veřejném repozitáři
>> docker pull <name> # stáhnutí zkompilovaného obrazu

Další užitečné příkazy slouží k práci s vytvořeným kontejnerem. Pro seznam běžících kontejnerů použijeme následující příkaz, s tím že, pokud jej použijeme s parametrem -a dostaneme všechny kontejnery, tedy i ty které neběží.

>> docker ps (-a)

další příkazy nám poslouží pro práci s bežícím kontejnerem

>> docker run <hash> # spuštění
>> docker kill <hash> # zabití
>> docker attach <hash> # připojit se
>> docker rm <hash> # smazání

Základní příkazy známe. A teď trochu praktickické ukázky. Vezmeme si náhodný projekt napsaný v Django - https://github.com/pajinek/vhm. Shodou okolností je to můj projekt na manegování webových  projektů na různých systémech.

Pokud si chceme vlastní image Dockeru přidat do veřejného repozitáře, stačí se zaregistrovat na strákách https://registry.hub.docker.com/, kde je nejsnadjěnší cestou propojit automatickou kompilaci obrazu s naším guthubem nebo bitbucketem. Můj obraz je už vytvořený automatickým buildem na odkazu https://registry.hub.docker.com/u/varhoo/vhm-server/. Obraz si stáhneme následujícím příkazem.

>> docker search vhm
INDEX       NAME                           DESCRIPTION   STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/pajinek/vhm-server                 0                    [OK]

>> docker pull pajinek/vhm-server

Obraz se nám stáhnul do počítače a teď je možné jej spustit, seznam všech stažených obrazů získáme příkazem

>> docker images
INDEX       NAME                          DESCRIPTION   STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/varhoo/vhm-server                 0                    [OK]

Teď už nám stačí jen spustit službu, vzhledem k tomu, že se jedná o webovou aplikaci, budeme se chtpít k ní dostat přes nějaký port, vytvořený obraz běží na portu 8000, takže nám teď jen stačí směrovat z portu na systému do portu kontejneru. To provedeme parametrem -P, kde první port udává vnější port systému a druhý pak port v kontejneru. Docker můžeme spustit na pozadí s parametrem -d nebo interaktivně a to s parametrem -i (jako v této ukázce).

>> docker run -i -t -p 80:8000 varhoo/vhm-server
Validating models...

0 errors found
July 22, 2015 - 10:23:35
Django version 1.5.12, using settings 'vhm.settings'
Development server is running at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

Pokud bychom spustili Docker na pozadí (-d) můžeme se k němu připojit pomocí následujícího příkazu.

>> docker run -d -t -p 80:8000 vhm-server
bbb3c23cefb292eb57a31ad02df20eb1e4a45beff9cfc43015916224f1a57160

>> docker ps | grep vhm
bbb3c23cefb2 vhm-server "/bin/sh -c '. env/b 25 seconds ago Up 24 seconds 0.0.0.0:80->8000/tcp dreamy_meitner

>> docker attach bbb3c23cefb2
[22/Jul/2015 01:04:11] "GET /admin/ HTTP/1.1" 200 5446

Častokrát se nám může stát, že se budeme chtít připojit k shellu již běžícího kontejneru, abych mohli prozkoumat jeho stav. To provedeme následujícím příkazem, který spustí nový proces shellu na který se v zápětí připojí.

>> docker exec -it bbb3c23cefb2 /bin/bash

V dalších dílech se pak podíváme jak si takový image Dockeru (Dockerfile) vytvořit. Článek vychází z osobní wiki http://wiki.varhoo.cz/index.php/Docker