- 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)
Minule jsme se naučili elegantně vytvářet Docker hostitele, ale každého jsme ovládali zvlášť (byť z jednoho místa). Dnes si vytvoříme cluster hostitelů, který se bude chovat jako celek – a všechny příkazy a funkce, které jsme dosud používaly, zůstanou prakticky stejné. To je Docker Swarn.
UPDATE: V připravované verzi Docker 1.12 už je to jednodušší díky Swarm Mode. Čtěte v 13. článku série.
Discovery
Pro správnou funkci Docker Swarm je nutné, aby se udržovala databáze existujících nodů a kontejnerů. Pro produkční nasazení Docker podporuje Consul, Zookeper a etcd – k těmto nástrojům, zejména mému oblíbenému Consul, se na stránkách cloudsvět budeme ještě věnovat a v příštím díle použijeme Docker Swarm právě s Consul). Pro jednoduché vyzkoušení využijeme cloudovou službu, která je součástí Docker Hub (nepoužívejte v produkci).
Protože se stejně jako minule nacházíme v mém Windows notebooku, nemůžeme spouštět kontejnery přímo na něm (což potřebujeme pro registraci discovery služby). Nejprve tedy použijme nám už dobře známý Docker Machine k vytvoření nového hostitele.
docker-machine create -d virtualbox installer Running pre-create checks... Creating machine... (installer) Creating VirtualBox VM... (installer) Creating SSH key... (installer) Starting VM... Waiting for machine to be running, this may take a few minutes... Machine is running, waiting for SSH to be available... Detecting operating system of created instance... 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 Docker to this machine, run: docker-machine env installer
Načtěte si jeho přihlašovací údaje (opět jsme ve Windows, takže výstup musíme upravit z export na set a odstranit uvozovky).
docker-machine env installer export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://192.168.99.102:2376" export DOCKER_CERT_PATH="C:\Users\kubicat\.docker\machine\machines\installer" export DOCKER_MACHINE_NAME="installer" # Run this command to configure your shell: # eval "$(docker-machine env installer)" set DOCKER_HOST=tcp://192.168.99.102:2376 set DOCKER_CERT_PATH=C:\Users\kubicat\.docker\machine\machines\installer
Vyzkoušejme spojení, třeba vypišme informace o hostiteli.
docker info Containers: 0 Images: 0 Server Version: 1.9.1 Storage Driver: aufs Root Dir: /mnt/sda1/var/lib/docker/aufs Backing Filesystem: extfs Dirs: 0 Dirperm1 Supported: true Execution Driver: native-0.2 Logging Driver: json-file Kernel Version: 4.1.13-boot2docker Operating System: Boot2Docker 1.9.1 (TCL 6.4.1); master : cef800b - Fri Nov 20 19:33:59 UTC 2015 CPUs: 1 Total Memory: 996.2 MiB Name: installer ID: TS32:HST7:RJQZ:JE2X:2WBE:NUP4:ZG3R:5KED:LVKN:4QE4:JIVR:466F Debug mode (server): true File Descriptors: 11 Goroutines: 18 System Time: 2015-12-24T06:54:35.214479791Z EventsListeners: 0 Init SHA1: Init Path: /usr/local/bin/docker Docker Root Dir: /mnt/sda1/var/lib/docker Labels: provider=virtualbox
Teď si vytvoříme Docker Swarm “účet” v cloudu. Spusťte swarm kontejer s startovacím příkazem create. Docker stáhne obraz, spustí, provede pro vás registraci a na závěr vám vypíše token – ten si zkopírujte, bude důležitý.
docker run swarm create Unable to find image 'swarm:latest' locally latest: Pulling from library/swarm d681c900c6e3: Pull complete 21 MB/4.221 MBB 188de6f24f3f: Pull complete .6 kB/152.6 kBB 90b2ffb8d338: Pull complete 133 B/133 BB 237af4efea94: Pull complete 32 B/32 BB 3b3fc6f62107: Pull complete 32 B/32 BB 7e6c9135b308: Pull complete 32 B/32 BB 986340ab62f0: Pull complete 32 B/32 BB a9975e2cc0a3: Pull complete 32 B/32 BB Digest: sha256:c21fd414b0488637b1f05f13a59b032a3f9da5d818d31da1a4ca98a84c0c781b Status: Downloaded newer image for swarm:latest 202a67055e4aa852a8b7ac131e2cc2ed
Vytváříme Docker Swarm cluster
Discovery službu máme “objednánu”, můžeme vytvořit cluster. Jeho nastavení pro nás provede Docker Machine přímo při vytváření hostitelů.
Nejprve si nechme vybudovat hostitele, který bude masterem clusteru. Nezapomeňte uvést správný token (nebo cestu ke Consul instanci či jiné discovery službě).
docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://202a67055e4aa852a8b7ac131e2cc2ed mujSwarmMaster Running pre-create checks... Creating machine... (mujSwarmMaster) Creating VirtualBox VM... (mujSwarmMaster) Creating SSH key... (mujSwarmMaster) Starting VM... Waiting for machine to be running, this may take a few minutes... Machine is running, waiting for SSH to be available... Detecting operating system of created instance... 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... Configuring swarm... Checking connection to Docker... Docker is up and running! To see how to connect Docker to this machine, run: docker-machine env mujSwarmMaster
Vytvořte člena clusteru.
docker-machine create -d virtualbox --swarm --swarm-discovery token://202a67055e4aa852a8b7ac131e2cc2ed mujSwarmNode-1 Running pre-create checks... Creating machine... (mujSwarmNode-1) Creating VirtualBox VM... (mujSwarmNode-1) Creating SSH key... (mujSwarmNode-1) Starting VM... Waiting for machine to be running, this may take a few minutes... Machine is running, waiting for SSH to be available... Detecting operating system of created instance... 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... Configuring swarm... Checking connection to Docker... Docker is up and running! To see how to connect Docker to this machine, run: docker-machine env mujSwarmNode-1
Přidáme si ještě další dva.
docker-machine create -d virtualbox --swarm --swarm-discovery token://202a67055e4aa852a8b7ac131e2cc2ed mujSwarmNode-2 docker-machine create -d virtualbox --swarm --swarm-discovery token://202a67055e4aa852a8b7ac131e2cc2ed mujSwarmNode-3
Ovládáme celý cluster
Načtěte si proměnné vašeho master nodu, ale s přepínačem –swarm (jediný rozdíl bude v použitém TCP portu).
docker-machine env --swarm mujSwarmMaster export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://192.168.99.103:3376" export DOCKER_CERT_PATH="C:\Users\kubicat\.docker\machine\machines\mujSwarmMaster" export DOCKER_MACHINE_NAME="mujSwarmMaster" # Run this command to configure your shell: # eval "$(docker-machine env --swarm mujSwarmMaster)" set DOCKER_HOST=tcp://192.168.99.103:3376 set DOCKER_CERT_PATH=C:\Users\kubicat\.docker\machine\machines\mujSwarmMaster
Teď můžeme používat prakticky stejné docker příkazy, jako u jediného nodu, ale tentokrát ovládáme celý cluster hostitelů (to je velká výhoda Docker Swarm oproti třeba Kubernetes, u kterého se musíte naučit jeho vlastní způsob).
Vypište si informace o clusteru.
docker info Containers: 5 Images: 4 Role: primary Strategy: spread Filters: health, port, dependency, affinity, constraint Nodes: 4 mujSwarmMaster: 192.168.99.103:2376 └ Status: Healthy └ Containers: 2 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 1.021 GiB └ Labels: executiondriver=native-0.2, kernelversion=4.1.13-boot2docker, operatingsystem=Boot2Docker 1.9.1 (TCL 6.4.1); master : cef800b - Fri Nov 20 19:33:59 UTC 2015, provider=virtualbox, storagedriver=aufs mujSwarmNode-1: 192.168.99.104:2376 └ Status: Healthy └ Containers: 1 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 1.021 GiB └ Labels: executiondriver=native-0.2, kernelversion=4.1.13-boot2docker, operatingsystem=Boot2Docker 1.9.1 (TCL 6.4.1); master : cef800b - Fri Nov 20 19:33:59 UTC 2015, provider=virtualbox, storagedriver=aufs mujSwarmNode-2: 192.168.99.105:2376 └ Status: Healthy └ Containers: 1 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 1.021 GiB └ Labels: executiondriver=native-0.2, kernelversion=4.1.13-boot2docker, operatingsystem=Boot2Docker 1.9.1 (TCL 6.4.1); master : cef800b - Fri Nov 20 19:33:59 UTC 2015, provider=virtualbox, storagedriver=aufs mujSwarmNode-3: 192.168.99.106:2376 └ Status: Healthy └ Containers: 1 └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 1.021 GiB └ Labels: executiondriver=native-0.2, kernelversion=4.1.13-boot2docker, operatingsystem=Boot2Docker 1.9.1 (TCL 6.4.1); master : cef800b - Fri Nov 20 19:33:59 UTC 2015, provider=virtualbox, storagedriver=aufs CPUs: 4 Total Memory: 4.086 GiB Name: mujSwarmMaster
Podívejme se, jaké máme v clusteru kontejnery. Zatím to budou jen swarm komponenty, ale všimněte si, že agent běží na všech nodech.
docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 499107709b7b swarm:latest "/swarm join --advert" 4 minutes ago Up 4 minutes mujSwarmNode-3/swarm-agent cbc29a66cc21 swarm:latest "/swarm join --advert" 6 minutes ago Up 6 minutes mujSwarmNode-2/swarm-agent 5da4499189c6 swarm:latest "/swarm join --advert" 8 minutes ago Up 8 minutes mujSwarmNode-1/swarm-agent 8e22fbf0cc9b swarm:latest "/swarm join --advert" 11 minutes ago Up 11 minutes mujSwarmMaster/swarm-agent 7ec7f78f731f swarm:latest "/swarm manage --tlsv" 11 minutes ago Up 11 minutes mujSwarmMaster/swarm-agent-master
Pojďme teď vytvořit několik vlastních kontejnerů. Jako základní image použijeme busybox a příkaz, který spustíme, bude jednoduché vypsání textu (tím se kontejner vypne, ale to nám teď nevadí). Vytvořte jich rovnou pět a všimněte si, že příkaz je stejný, jako u samostatného nodu.
docker run --name mujKont1 busybox /bin/echo "Pozdrav z kontejneru" Pozdrav z kontejneru docker run --name mujKont2 busybox /bin/echo "Pozdrav z kontejneru" Pozdrav z kontejneru docker run --name mujKont3 busybox /bin/echo "Pozdrav z kontejneru" Pozdrav z kontejneru docker run --name mujKont4 busybox /bin/echo "Pozdrav z kontejneru" Pozdrav z kontejneru docker run --name mujKont5 busybox /bin/echo "Pozdrav z kontejneru" Pozdrav z kontejneru
Vypišme si teď všechny kontejnery. Z názvu vám bude patrné, že vznikly na různých nodech.
docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f96d829731fe busybox "/bin/echo 'Pozdrav z" 7 seconds ago Exited (0) 6 seconds ago mujSwarmNode-2/mujKont5 bbb2102b17e5 busybox "/bin/echo 'Pozdrav z" 12 seconds ago Exited (0) 12 seconds ago mujSwarmMaster/mujKont4 e921ee6d1dc0 busybox "/bin/echo 'Pozdrav z" 26 seconds ago Exited (0) 25 seconds ago mujSwarmNode-3/mujKont3 226373b8997a busybox "/bin/echo 'Pozdrav z" 40 seconds ago Exited (0) 39 seconds ago mujSwarmNode-2/mujKont2 087326bc3ecb busybox "/bin/echo 'Pozdrav z" About a minute ago Exited (0) About a minute ago mujSwarmNode-1/mujKont1 499107709b7b swarm:latest "/swarm join --advert" 12 minutes ago Up 12 minutes mujSwarmNode-3/swarm-agent cbc29a66cc21 swarm:latest "/swarm join --advert" 14 minutes ago Up 14 minutes mujSwarmNode-2/swarm-agent 5da4499189c6 swarm:latest "/swarm join --advert" 16 minutes ago Up 16 minutes mujSwarmNode-1/swarm-agent 8e22fbf0cc9b swarm:latest "/swarm join --advert" 20 minutes ago Up 20 minutes mujSwarmMaster/swarm-agent 7ec7f78f731f swarm:latest "/swarm manage --tlsv" 20 minutes ago Up 20 minutes mujSwarmMaster/swarm-agent-master
Docker Swarm umožní vytvořit cluster hostitelů, který se pro vás tváří jako celek. Přitom máte k z 95% k dispozici stejné příkazy a API, jaké znáte ze samotného Dockeru.
Jakým mechanismem Swarm vybral, kam je umístit? A můžeme mu do toho nějak promlouvat? Právě na to se zaměříme příště.