Autor: Jiří Hnídek / jiri.hnidek@tul.cz
“Not easy task.”
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
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.
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
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ů.
Seznam běžících procesů ve všech kontejnerech získáme pomocí:
$ docker ps
Měli bychom dostat prázdný seznam.
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
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
Další užitečné příkazy
$ docker exec 84588d7d375e touch /root/ghost_in_th_shell # Spustí příkaz v běžícím kontejneru
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
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
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
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.
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
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.
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 .
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" ]
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
Podobné principy, jaké se používají pro sandboxing v Dockeru, LXC nebo Androidu se snaží využít dva projekty pro Linuxový desktop.