- 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)
Před pár dny uvolnil Docker veřejnou betu verze 1.12 a ta přinesla dvě zásadní novinky. Pojďme si je představit.
Swarm orchestrace je přímo zabudovaná
V této sérii už jsme si Docker Swarm ukazovali. Fungovalo to jako aplikace běžící v kontejneru, k tomu systém pro service discovery a distribuovaný konsenzus (Etcd, Consul apod.), ale Docker nově zabudoval Swarm přímo do sebe. Je to tedy jednodušší a možná i díky tomu přišla i nová funkce “service”, která je dost zásadní a ještě si ji dnes vyzkoušíme.
Jak na to? Potřebujete Docker v beta verzi 1.12 a to se, pokud například jako já jedete na Windows, nejlépe udělá stažením Docker Toolboxu pro Windows ve verzi 1.12 rc2, která obsahuje Docker Machine 0.8 beta (který pak naoplátku zprovozňuje Docker 1.12 rc2). Stahujte tady: https://github.com/docker/toolbox/releases/download/v1.12.0-rc2/DockerToolbox-1.12.0-rc2.exe
Vytvořme si přes Docker Machine (o tom už jsme psali) Docker hostitele.
> docker-machine create -d virtualbox docker1 Running pre-create checks... Creating machine... (docker1) Copying C:\Users\kubicat\.docker\machine\cache\boot2docker.iso to C:\Users\kubicat\.doc ker\machine\machines\docker1\boot2docker.iso... (docker1) Creating VirtualBox VM... (docker1) Creating SSH key... (docker1) Starting the VM... (docker1) Check network to re-create if needed... (docker1) Waiting for an IP... Waiting for machine to be running, this may take a few minutes... Detecting operating system of created instance... Waiting for SSH to be available... Detecting the provisioner... Provisioning with boot2docker... Copying certs to the local machine directory... Copying certs to the remote machine... Setting Docker configuration on the remote daemon... Checking connection to Docker... Docker is up and running! To see how to connect your Docker Client to the Docker Engine running on this virtual machine, ru n: docker-machine env docker1
Načtěte si proměnné.
> docker-machine env docker1 SET DOCKER_TLS_VERIFY=1 SET DOCKER_HOST=tcp://192.168.99.100:2376 SET DOCKER_CERT_PATH=C:\Users\kubicat\.docker\machine\machines\docker1 SET DOCKER_MACHINE_NAME=docker1 REM Run this command to configure your shell: REM @FOR /f "tokens=*" %i IN ('docker-machine env docker1') DO @%i > @FOR /f "tokens=*" %i IN ('docker-machine env docker1') DO @%i
Ujistěte se, že máte Docker verze 1.12 (alespoň rc2).
> docker --version Docker version 1.12.0-rc2, build 906eacd
Zjistíme si IP adresu prvního hostitele
> docker-machine ip docker1 192.168.99.100
… a uděláme z něj Swarm mastera
> docker swarm init --listen-addr 192.168.99.100:2377 Swarm initialized: current node (e1arf94hgoc7k65wwdyt76cjb) is now a manager.
Hop a hotovo.
Teď vytvořme přes Docker Machine další dva hostitele a zjistěme si jejich IP adresy. Pak v nich spustíme docker swarm join a přiřadíme je do Swarm clusteru. Rychlé a velmi jednoduché.
> docker-machine create -d virtualbox docker2 > docker-machine create -d virtualbox docker3 > docker-machine ip docker2 192.168.99.101 > docker-machine ssh docker2 'docker swarm join --listen-addr 192.168.99.101:2377 192.168.99.100:2377' This node joined a Swarm as a worker. > docker-machine ip docker3 192.168.99.102 > docker-machine ssh docker3 'docker swarm join --listen-addr 192.168.99.102:2377 192.168.99.100:2377' This node joined a Swarm as a worker.
Swarm je tedy jednodušší na rozchození a navíc přinesl velkou novinku – service.
Service
Vyzkoušejme si nový koncept “service”, který je zásadě okopírovaný z ostatních ochestrátorů, které to také podobně dělají. Například v Kubernetes koncept “deployment” , scale aplikace v Cloud Foundry (L7 balancing kontejnerů v Diego cellech) a i Mesos Marathon podporuje něco podobného.
Místo běžného spuštění kontejneru to teď proveďme přes založení service. Použijeme příkladovou webovou aplikaci, publikujeme její porty a to všechno je stejné, jako když bychom dělali docker run. Jediný rozdíl tedy je, že místo příkazu run používáme příkaz service a přidali jsme nový přepínač replicas. Ten je důležitý a říkáme v něm, že chceme tři kopie (kontejnery) rozprostřené v infrastruktuře. Pokud nějaký z nich umře, nechť je Swarm spustí jinde (tedy ať sám udržuje počet na tom co požadujeme).
> docker service create --name mujWeb --replicas 3 --publish 80:80 instavote/vote dhb6w8tp4gzu9mvkpozfruvqq
Vypišme si službu. Pokud ji pouštíte poprvé, ještě nemáte stažený image, tak to může chvilku trvat. Tento výpis vám ukáže kolik jste požadovali běžících kopií versus kolik jich běží ve skutečnosti. V mém případě už je to jak chceme, tedy 3/3.
> docker service ls ID NAME REPLICAS IMAGE COMMAND dhb6w8tp4gzu mujWeb 3/3 instavote/vote
Docker vytvořil 3 kontejnery a rozprostřel je v infrastruktuře – podívejme se jak.
> docker service tasks mujWeb ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE 8x2qi4gp4ts4urqsdj6td3l2k mujWeb.1 mujWeb instavote/vote Running 27 seconds Running docker2 4sp0q9i79ii8wq5sgd1ewqi3r mujWeb.2 mujWeb instavote/vote Running 27 seconds Running docker1 2rg2025hpx9tjdrcovbo4zlfa mujWeb.3 mujWeb instavote/vote Running 27 seconds Running docker3
Představme si teď, že o web je velký zájem a potřebujeme zvýšit výkon. Co takhle do práce povolat rovnou osm kontejnerů? Použijte příkaz docker service scale.
> docker service scale mujWeb=8 mujWeb scaled to 8
Podívejme se jak to dopadlo.
> docker service tasks mujWeb ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE 8x2qi4gp4ts4urqsdj6td3l2k mujWeb.1 mujWeb instavote/vote Running About a minute Running docker2 4sp0q9i79ii8wq5sgd1ewqi3r mujWeb.2 mujWeb instavote/vote Running About a minute Running docker1 2rg2025hpx9tjdrcovbo4zlfa mujWeb.3 mujWeb instavote/vote Running About a minute Running docker3 agndoqxg2e2s1fp95od1v66tz mujWeb.4 mujWeb instavote/vote Running 22 seconds Running docker2 d030h7e6ckxvnl5rgqioefe2s mujWeb.5 mujWeb instavote/vote Running 22 seconds Running docker1 1pf5835y7c02ykl4rxdawzh1n mujWeb.6 mujWeb instavote/vote Running 22 seconds Running docker1 937mcciqs8829r0xqyn1eyedz mujWeb.7 mujWeb instavote/vote Running 22 seconds Running docker3 913jtonku0v93i3mccy0heddk mujWeb.8 mujWeb instavote/vote Running 22 seconds Running docker3
Služba (webová aplikace) teď běží 8x a protože jsme publikovali port 80, dostaneme se na ní na IP adrese hostitele. Dokonce ne jednoho, ale všech, protože Docker zajistí přesměrování, pokud je to potřeba. Tato příkladová aplikace vám na webu zobrazí ID kontejneru, takže si můžete ověřit, že Docker pro vás provoz hezky balancuje na běžící kontejnery.
Službu teď zrušme.
> docker service rm mujWeb mujWeb
Rolling update a HA
Swarm vám umožní updatovat z jednoho image na druhý (takže například z kontejnerizované aplikace v1 na v2) postupně a koordinovaně. Při vytváření služby musíte ale zvolit strategii. Například v následujícím příkazu chceme, aby Swarm updatoval (= mazal a vytvořil nový) kontejnery jeden po druhém. Současně říkáme, že mezi těmito operacemi chceme vždy 10 vteřin počkat. Podle vašich potřeb můžete používat různé strategie.
> docker service create --name mujWeb --replicas 8 --publish 80:80 --update-delay 10s --update-parallelism 1 instavote/vote 0wpk54rsymae4j59zzlpuoql0
Až bude služba nahoře pojďme ji updatovat a následně sledovat, jak se nová verze objevuje. Současně koukejte na web aplikace a často obnovujte stránku – bude se měnit. Nejprve se tam sem tam objeví nová verze a ke konci se naopak sem tam objeví stará. Nakonec všechno poběží na nové verzi – plynule a bez odstávky.
> docker service update --image instavote/vote:movies mujWeb mujWeb > docker service tasks mujWeb ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE 44e1wjn021wwjn9km5aj3g1dr mujWeb.1 mujWeb instavote/vote Running 33 seconds Running docker3 3f2zivaea08b7xztkru349i0e mujWeb.2 mujWeb instavote/vote Running 33 seconds Running docker2 daj515nqqnkhfzdfz56sj5yz1 mujWeb.3 mujWeb instavote/vote Running 33 seconds Running docker2 6chijorff2md6hy92bnj76vmt mujWeb.4 mujWeb instavote/vote Running 33 seconds Running docker1 b3gfuse1okawqzk0375tb9j97 mujWeb.5 mujWeb instavote/vote:movies Preparing 2 seconds Running docker3 e0egp1glwdvu78bv17895ci50 mujWeb.6 mujWeb instavote/vote Running 33 seconds Running docker2 752zvpch187uixicsvhex8oom mujWeb.7 mujWeb instavote/vote Running 33 seconds Running docker1 ev6elqq50pw8tjm1vlfnhx19f mujWeb.8 mujWeb instavote/vote Running 33 seconds Running docker1 kubicat@KUBICAT2 C:\Users\kubicat > docker service tasks mujWeb ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE 44e1wjn021wwjn9km5aj3g1dr mujWeb.1 mujWeb instavote/vote Running 45 seconds Running docker3 7mpw6eqdwu6y6187nfpu5lf71 mujWeb.2 mujWeb instavote/vote:movies Preparing 1 seconds Running docker3 daj515nqqnkhfzdfz56sj5yz1 mujWeb.3 mujWeb instavote/vote Running 45 seconds Running docker2 6chijorff2md6hy92bnj76vmt mujWeb.4 mujWeb instavote/vote Running 45 seconds Running docker1 b3gfuse1okawqzk0375tb9j97 mujWeb.5 mujWeb instavote/vote:movies Running 15 seconds Running docker3 e0egp1glwdvu78bv17895ci50 mujWeb.6 mujWeb instavote/vote Running 45 seconds Running docker2 752zvpch187uixicsvhex8oom mujWeb.7 mujWeb instavote/vote Running 45 seconds Running docker1 ev6elqq50pw8tjm1vlfnhx19f mujWeb.8 mujWeb instavote/vote Running 45 seconds Running docker1 > docker service tasks mujWeb ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE 3ard6d06l6yodox4f7svp0ih7 mujWeb.1 mujWeb instavote/vote:movies Running 21 seconds Running docker2 7mpw6eqdwu6y6187nfpu5lf71 mujWeb.2 mujWeb instavote/vote:movies Running 35 seconds Running docker3 daj515nqqnkhfzdfz56sj5yz1 mujWeb.3 mujWeb instavote/vote Running About a minute Running docker2 1lv83w8lk6p4ejf70g0zu2wur mujWeb.4 mujWeb instavote/vote:movies Running 7 seconds Running docker3 b3gfuse1okawqzk0375tb9j97 mujWeb.5 mujWeb instavote/vote:movies Running 48 seconds Running docker3 e0egp1glwdvu78bv17895ci50 mujWeb.6 mujWeb instavote/vote Running About a minute Running docker2 752zvpch187uixicsvhex8oom mujWeb.7 mujWeb instavote/vote Running About a minute Running docker1 ev6elqq50pw8tjm1vlfnhx19f mujWeb.8 mujWeb instavote/vote Running About a minute Running docker1 > docker service tasks mujWeb ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE 3ard6d06l6yodox4f7svp0ih7 mujWeb.1 mujWeb instavote/vote:movies Running About a minute Running docker2 7mpw6eqdwu6y6187nfpu5lf71 mujWeb.2 mujWeb instavote/vote:movies Running About a minute Running docker3 7d2lis98ulysuqppc8argj7vn mujWeb.3 mujWeb instavote/vote:movies Running About a minute Running docker1 1lv83w8lk6p4ejf70g0zu2wur mujWeb.4 mujWeb instavote/vote:movies Running About a minute Running docker3 b3gfuse1okawqzk0375tb9j97 mujWeb.5 mujWeb instavote/vote:movies Running 2 minutes Running docker3 4t77tk5ldlkaxbkgulwcsruzv mujWeb.6 mujWeb instavote/vote:movies Running 46 seconds Running docker2 ejh4hbfij0cyyzdd9frzu1p4v mujWeb.7 mujWeb instavote/vote:movies Running About a minute Running docker1 2pm335nrlpzxieonwt3r5aeao mujWeb.8 mujWeb instavote/vote:movies Running 33 seconds Running docker2
Poslední co si zkusíme je vysoká dostupnost. Pojďme teď jeden z hostitelů vyřadit z činnosti.
> docker node update --availability drain docker2 docker2
Koukněte jak služba zareagovala. Nastartovala zemřelé kontejnery jinde.
> docker service tasks mujWeb ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE 3p0bru9islkt9kdakciptvuyz mujWeb.1 mujWeb instavote/vote:movies Running 12 seconds Running docker3 7mpw6eqdwu6y6187nfpu5lf71 mujWeb.2 mujWeb instavote/vote:movies Running 23 minutes Running docker3 7d2lis98ulysuqppc8argj7vn mujWeb.3 mujWeb instavote/vote:movies Running 23 minutes Running docker1 1lv83w8lk6p4ejf70g0zu2wur mujWeb.4 mujWeb instavote/vote:movies Running 23 minutes Running docker3 b3gfuse1okawqzk0375tb9j97 mujWeb.5 mujWeb instavote/vote:movies Running 24 minutes Running docker3 06n5do65efbn9t58cfyjbb6kl mujWeb.6 mujWeb instavote/vote:movies Running 12 seconds Running docker1 ejh4hbfij0cyyzdd9frzu1p4v mujWeb.7 mujWeb instavote/vote:movies Running 23 minutes Running docker1 d15agntlt3ike3tw6m1z6lfj7 mujWeb.8 mujWeb instavote/vote:movies Running 12 seconds Running docker1
napada mi len 1 otazka. Existuje sposob, ako k tejto ‘service’ pripojit aj volume?
Ide mi konkretne o nieco v zmysle
docker service create -v /home/mount_point:/home/user –publish 80:80 –replicas 2 nginx
Dá se, ale syntaxe je trochu jiná, než u kontejneru, přepínač je –mount