UNIX a Internet

Docker

Autor: Jiří Hnídek / jiri.hnidek@tul.cz

Linux/UNIX a distribuce softwaru

“Not easy task.”
  • Zdrojové soubory
  • Staticky linkované binární soubory
  • Dynamicky linkované binární soubory (LSB)
  • Python balíčky, JAR soubory, atd.
  • Instalační soubory ("instalátory" s GUI)
  • Instalační balíčky (RPM/DEB)
  • Repositáře s instalačními balíčky

Docker? WTF!

Virtualizace vs. Kontejnery

  • Virtualizace je drahá. Především na paměť.
  • Při virtualizaci se v hostovaném OS duplikuje jádro, knihovny, běžící služby, atd.
  • Někdy je virtualizace nezbytná (software vyžaduje určitý hardware, OS, atd.)
  • Pro mnoho aplikací je vhodné použít nějakou kontejnerovou technologii.
    • LXC, Docker, OpenVZ, Oracle Solaris Zones, atd.

Proč kontejner?

Docker

  • Docker kontejner zabaluje software do balíčku obsahující vše potřebné ke svému běhu (kód, knihovny, nástroje, služby).
  • Takový kontejner je možné spustit všude, kde je Docker nainstalovaný.
  • Sandboxing: aplikace běžící v kontejneru je izolovaná od hostitelského operačního systému i od ostatních kontejnerů. Možná znáte z Androidu.

Docker a technologie

  • Linuxové jádro
  • chroot
  • cgroups
  • namespaces
  • ...

Docker - instalace

Docker můžete používat nativne jen na Linuxu. Na Macu a Windows běží ve virtualizovaném prostředí.

Na Linuxu si ho můžete jednoduše nainstalovat pomocí:

$ yum install docker

Po instalaci budete potřebovat povolit a spustit službu docker:

$ systectl enable docker
$ systectl start docker

Docker - images

Pokud nechceme vytvářet obraz pro kontejner na zelené louce a to většinou nechceme, tak můžeme využít:

https://hub.docker.com/

Zde můžeme nalézt nejenom hotový obraz, ale můžeme zde nahrávat vlastní obrazy.

Stažení hotového obrazu

Když naleznete hledaný obraz (př.: CentOS 7), tak ho si ho můžete stáhnout pomocí:

$ docker pull centos:7

Po úspěšném stažení obrazu si můžeme ověřit, že přibyl v seznamu obrazů:

$ docker images

V našem případě dostaneme něco jako:

REPOSITORY        TAG   IMAGE ID      CREATED      SIZE
docker.io/centos  7     0584b3d2cf6d  2 weeks ago  196.5 MB

Was ist das Obraz?

Vlastně je to komprimovaný archív nějaké minimální linuxové distribuce uložený na hostu v adresáři /var/lib/docker, který říká, jak bude vypadat běhové prostředí.

Docker používá koncepci vrstvených obrazů. Máme jeden základní obraz. V našem příkladě je to centos:7 a na něj můžeme nabalovat další. Základní obraz v praxi používá několik kontejnerů.

Docker - procesy

Seznam běžících procesů ve všech kontejnerech získáme pomocí:

$ docker ps

Měli bychom dostat prázdný seznam.

Spuštění procesu

Izolovaný proces v kontejneru spustíme pomocí:

$ docker run centos:7 /path/to/binary

Pro počáteční pokusy si spustíme bash v interaktivním režimu (-t) v terminálu (-t):

$ docker run -i -t centos:7 /bin/bash

V seznamu procesů: docker ps můžeme vidět, že nám běží jeden proces:

CONTAINER ID  IMAGE     COMMAND     CREATED       STATUS       PORTS  NAMES
84588d7d375e  centos:7  "/bin/bash" 1 minute ago  Up 1 minute         cool_cat

Správa procesů

Kromě spuštění procesu můžeme procesy běžící v kontejneru, spravovat pomocí těchto příkazů:

$ docker stop 84588d7d375e # Zastavení procesu
$ docker attach 84588d7d375e # Připojení se k běžícímu procesu
$ docker stop 84588d7d375e # Spuštění pozastaveného procesu
$ docker top 84588d7d375e # Top ten procesů
$ docker kill 84588d7d375e # Zabije proces
$ docker rm 84588d7d375e # Smaže kontejner
$ docker stats --help # Vypíše nápovědu k danému příkazu

Drobnosti

Další užitečné příkazy

$ docker exec 84588d7d375e touch /root/ghost_in_th_shell # Spustí příkaz v běžícím kontejneru

Změny v obraze

Za běhu procesu v kontejneru můžeme dělat beztrestně různé vylomeniny: rm -rf .*

Po opětovném spuštění je souborový systém v původním stavu (Copy-on-Write).

Nebo můžeme udělat něco užitečného: yum -y update a změny v obraze mužeme zobrazit pomocí:

$ docker diff 84588d7d375e

Když chceme výsledek uložit pod nějakým jménem:

$ docker commit 84588d7d375e your_nick/product_name

Publikování změn

Nejprve je nutné vytvořit si na hubs.docker.com účet a ověřit ho. Pak je možné se přihlásit z příkazové řádky:

$ docker login

Po úspěšném přihlášení můžeme na hub nahrát naše změny:

$ docker push your_nick/product_name

Sdílený adresář

Pokud chceme používat docker k vývoji například nějaké webové aplikace, tak se hodí možnost sdílet vybraný adresář mezi hostem a kontejnerem:

$ docker run -t -i -v /home/joe/html:/var/www/html centos:7 /bin/bash

BTW: This is the Art!

Docker a sítě

Aby byla naše aplikace nějak užitečná, tak bude muset patrně komunikovat po síti.

Docker na hostu vytvoří jedno virtuální síťové rozhraní docker0 a pro každý kontejner vždy jedno bridge rozhraní.

ǏPv4 adresy jsou přiřazované z privátní sítě: 172.17.0.0/16

Kontejneru lze volitelně přiřadit při startu IPv6 adresu.

Mapování portů

Předpokládejme, že v kontejneru běží server poslouchající na TCP portu 8080 a my na tento port chceme přesměrovat veškerý provoz přicházející na lokální TCP port 80:

docker run -t -i -p 80:8080 centos:7 /bin/bash

Dockerfile

Aby si mohl kdokoliv znovuvytvořit daný obraz pro běh v kontejneru, tak k tomu se používá Dockerfile.

Dockerfile je textový soubor s předpisem pro vytvoření obrazu.

Pokud dáváme volně k dispozici náš obraz pro docker, tak je vhodné k tomu poskytnout i Dockerfile.

Každý si potom může také ověřit, co daný obraz obsaahuje.

Dockerfile: překladač a spol

Předpokládejme, že budeme potřebovat kompilovat projekt napsaný v jazyku C/C++.

FROM centos:7
MAINTAINER "me" <your@email.here>
ENV container docker
RUN yum -y update; \
    yum -y install gcc gcc-c++ make cmake git

Obraz vytvoříme pomocí:

docker build --rm -t local/c7-builder .

Dockerfile: kompilujeme a spouštíme

Vlastní překlad provedeme v následujícím Dockerfile souboru:

FROM local/c7-builder
MAINTAINER "me" <your@email.here>
ENV container docker
RUN mkdir -p my_workspace; \
    cd my_workspace; \
    git clone https://github.com/me/my_project; \
    cd my_project; \
    mkdir build; \
    cd build; \
    cmake ../; \
    make; \
    make install
CMD [ "/usr/local/bin/my_project_binary" ]

Dockerfile: uklízíme po sobě

Po vlastním překladu a testování není potřeba, aby v obrazu byl i překladač a další nástroje potřebné k přeložení daného softwaru. V daném obraze nebo v Dockerfile je potřeba volat:

yum -y erase make cmake gcc-c++ gcc git libgomp perl-Git

Kontejnery pro Linuxový desktop

Podobné principy, jaké se používají pro sandboxing v Dockeru, LXC nebo Androidu se snaží využít dva projekty pro Linuxový desktop.

Děkuji za pozornost. Nějaké otázky?