- 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)
Praktický úvod do Docker a kontejnerů (9) – multi-host networking
Na začátku seriálu jsme propojovali kontejnery starším způsobem vytvořením linku. Potíž je, že to bylo vymyšleno na spoje v rámci jednoho hostitele a to se nám, když už umíme využívat Swarm cluster hostitelů, moc nehodí. Dnes si vyzkoušíme nejjednodušší řešení s využitím nativního overlay ovladače.
Kromě nativního overlay řešení je možné Docker obohatit o driver třetí strany a získat tak ještě robustnější řešení, které například může řešit overlay SDN sítě pro kontejnerovou i hypervisorovou virtualizaci současně. Z aktuální nabídky je k dispozici Nuage a HPE DCN plugin, Weave, Project Calico nebo Contiv (Cisco). Ve fázi vývoje je také OpenStack Kuryr, Docker plugin, který přináší implementaci kontejnerové síťařiny OpenStack neutron způsobem (tedy získáte společnou nativní, tedy bez přídavku komponent mimo OpenStack projekt, SDN bázi pro hypervisorové i kontejnerové compute zdroje). Dnes se ale zaměříme na nativní Docker overlay ovladač.
Přípravné práce a sestavení clusteru
Overlay networking dává smysl především v clusteru hostitelů, takže budeme chtít sestavit Docker Swarm cluster. Na to použijeme jako minule Docker Machine. Bude tady ale jeden rozdíl. Docker overlay networking potřebuje key-value store a nestačí mu jen jednoduchá služba v cloudu (jakou jsme použili v článku o Swarm). Tentokrát si tedy cluster sestavíme se svým vlastním key-value storem a použijeme můj nejoblíbenější – Consul.
Nasadíme opět docker-machine (v mém případě s VirtualBox driverem, ale stejně tak můžete použít OpenStack driver pro IaaS nebo OneView driver pro bare metal službu na vašich HPE serverech) k vytvoření nového hostitele (pro přehled ho pojmenuji consul).
docker-machine create -d virtualbox consul Running pre-create checks... Creating machine... (consul) Creating VirtualBox VM... (consul) Creating SSH key... (consul) 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 consul
Načtěme si teď proměnné pro Docker klienta (Windows verze).
docker-machine env consul export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://192.168.99.107:2376" export DOCKER_CERT_PATH="C:\Users\kubicat\.docker\machine\machines\consul" export DOCKER_MACHINE_NAME="consul" # Run this command to configure your shell: # eval "$(docker-machine env consul)" set DOCKER_HOST=tcp://192.168.99.107:2376 set DOCKER_CERT_PATH=C:\Users\kubicat\.docker\machine\machines\consul
Consul key-value store je k dispozici jako hotový Docker kontejner, takže nemusíme nic složitě instalovat. Spusťte ho a publikujte příslušný port.
docker run -d -p "8500:8500" -h "consul" progrium/consul -server -bootstrap Unable to find image 'progrium/consul:latest' locally latest: Pulling from progrium/consul 3b4d28ce80e4: Pull complete ================================================>] 2.475 MB/2.475 MBB e5ab901dcf2d: Pull complete ================================================>] 4.18 MB/4.18 MBB 30ad296c0ea0: Pull complete ================================================>] 4.777 MB/4.777 MBB 3dba40dec256: Pull complete ================================================>] 4.785 MB/4.785 MBB f2ef4387b95e: Pull complete ================================================>] 251.7 kB/251.7 kBB 53bc8dcc4791: Pull complete ================================================>] 252.3 kB/252.3 kBB 75ed0b50ba1d: Pull complete ================================================>] 4.655 MB/4.655 MBB 17c3a7ed5521: Pull complete ================================================>] 4.655 MB/4.655 MBB 8aca9e0ecf68: Pull complete ================================================>] 243 B/243 BB 4d1828359d36: Pull complete ================================================>] 32 B/32 BB 46ed7df7f742: Pull complete ================================================>] 634 B/634 BB b5e8ce623ef8: Pull complete ================================================>] 427 B/427 BB 049dca6ef253: Pull complete ================================================>] 335 B/335 BB bdb608bc4555: Pull complete ================================================>] 32 B/32 BB 8b3d489cfb73: Pull complete ================================================>] 32 B/32 BB c74500bbce24: Pull complete ================================================>] 32 B/32 BB 9f3e605442f6: Pull complete ================================================>] 32 B/32 BB d9125e9e799b: Pull complete ================================================>] 32 B/32 BB Digest: sha256:8cc8023462905929df9a79ff67ee435a36848ce7a10f18d6d0faba9306b97274 Status: Downloaded newer image for progrium/consul:latest 90a00d1609f2e87559b46cbe3efcb5361980348d2a753a6f8bc7d45c3c6bb174
Zjistěme si IP adresu hostitele.
docker-machine ip consul 192.168.99.107
Teď už můžeme použít docker-machine k vytvoření několika hostitelů a předat jim parametry pro vytvoření Swarm clusteru. Tím je adresa na náš Consul key-value store, který jsme před schvilkou vytvořili a také definice swarm mastera a členů.
docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery="consul://192.168.99.107:8500" --engine-opt="cluster-store=consul://192.168.99.107:8500" --engine-opt="cluster-advertise=eth1:2376" master docker-machine create -d virtualbox --swarm --swarm-discovery="consul://192.168.99.107:8500" --engine-opt="cluster-store=consul://192.168.99.107:8500" --engine-opt="cluster-advertise=eth1:2376" node1 docker-machine create -d virtualbox --swarm --swarm-discovery="consul://192.168.99.107:8500" --engine-opt="cluster-store=consul://192.168.99.107:8500" --engine-opt="cluster-advertise=eth1:2376" node2
Vypišme si hotové Docker hostitele.
docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS consul * virtualbox Running tcp://192.168.99.107:2376 v1.9.1 master - virtualbox Running tcp://192.168.99.108:2376 master (master) v1.9.1 node1 - virtualbox Running tcp://192.168.99.109:2376 master v1.9.1 node2 - virtualbox Running tcp://192.168.99.110:2376 master v1.9.1
Nová overlay síť
Namiřme Docker klienta na Swarm mastera (Windows stylem).
docker-machine env --swarm master export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://192.168.99.108:3376" export DOCKER_CERT_PATH="C:\Users\kubicat\.docker\machine\machines\master" export DOCKER_MACHINE_NAME="master" # Run this command to configure your shell: # eval "$(docker-machine env --swarm master)" set DOCKER_HOST=tcp://192.168.99.108:3376 set DOCKER_CERT_PATH=C:\Users\kubicat\.docker\machine\machines\master
Vytvoříme si teď novou sít s tím, že specifikujeme driver “overlay”, tedy nativní Docker multi-host networking. Na tomto místě můžete použít i jiné ovladače jako je Weave nebo Nuage / HPE DCN.
docker network create --driver overlay mujNet fd7cd19ed86396989b5085599e0a5eb83b959dc855691133e81ed0ab134b99ab
Vypišme si všechny sítě. Uvidíme “klasický” Docker networking pro single-host propojení nebo vystavení portu kontejneru pod IP adresu hostitele – kromě toho tam ale už je mujNet s driverem overlay.
docker network ls NETWORK ID NAME DRIVER 8f99ac2bb2fd master/bridge bridge a2245ab423fd master/host host 169ae451121e node2/host host ddc43adbf43d node2/bridge bridge fd7cd19ed863 mujNet overlay c9d570a8eb2c master/none null 03678a360f5d node1/host host 788a39011735 node1/bridge bridge 3d653ae6dd61 node1/none null 3da9a4ace4ec node2/none null
Pojďme spustit pět kontejnerů (Swarm je bude rozhazovat na hostitele, takže určitě vznikne potřeba multi-host propojení). Při spouštění řekneme, že kontejner bude v síti mujNet. Kontejner spustíme s procesem “tail -f /dev/null”, tedy nekonečný proces díky kterému zůstane kontejner běžet.
docker run -d --name app1 --net mujNet ubuntu tail -f /dev/null docker run -d --name app2 --net mujNet ubuntu tail -f /dev/null docker run -d --name app3 --net mujNet ubuntu tail -f /dev/null docker run -d --name app4 --net mujNet ubuntu tail -f /dev/null docker run -d --name app5 --net mujNet ubuntu tail -f /dev/null
Koukněme se, na kterém hostiteli naše kontejnery běží.
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 34b0b1da54ac ubuntu "tail -f /dev/null" 33 minutes ago Up 33 minutes node2/app5 d1097b8250db ubuntu "tail -f /dev/null" 33 minutes ago Up 33 minutes node1/app4 e3b429d19ee9 ubuntu "tail -f /dev/null" 33 minutes ago Up 33 minutes master/app3 817cb04efb4d ubuntu "tail -f /dev/null" 33 minutes ago Up 33 minutes node1/app2 ac48e801840e ubuntu "tail -f /dev/null" 33 minutes ago Up 33 minutes node2/app1
Vyzkoušíme
Overlay driver nejen propojuje kontejnery overlay způsobem (VXLAN), ale také zprostředkovává překlad jmen (to je velmi praktické). Můžeme tak z kontejneru komunikovat s ostatními ve stejné síti použitím jejich jména.
Zkusíme vytvořit šestý kontejner interaktivním způsobem a z něj spustíme ping na ostatní.
docker run -it --name client --net mujNet ubuntu /bin/bash root@21d7f7a750cf:/# ping -c 1 app1 PING app1 (10.0.0.2) 56(84) bytes of data. 64 bytes from app1 (10.0.0.2): icmp_seq=1 ttl=64 time=0.605 ms --- app1 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.605/0.605/0.605/0.000 ms root@21d7f7a750cf:/# ping -c 1 app2 PING app2 (10.0.0.3) 56(84) bytes of data. 64 bytes from app2 (10.0.0.3): icmp_seq=1 ttl=64 time=0.487 ms ... root@21d7f7a750cf:/# ping -c 1 app3 PING app3 (10.0.0.4) 56(84) bytes of data. 64 bytes from app3 (10.0.0.4): icmp_seq=1 ttl=64 time=0.288 ms ... root@21d7f7a750cf:/# ping -c 1 app4 PING app4 (10.0.0.5) 56(84) bytes of data. 64 bytes from app4 (10.0.0.5): icmp_seq=1 ttl=64 time=0.521 ms ... root@21d7f7a750cf:/# ping -c 1 app5 PING app5 (10.0.0.6) 56(84) bytes of data. 64 bytes from app5.mujNet (10.0.0.6): icmp_seq=1 ttl=64 time=0.546 ms ...
Nativní Docker overlay driver nám umožní i kombinaci s klasickým bridge pojetím včetně vystavení portu do okolí (tedy přes IP adresu hostitele) nebo NAT směrem do Internetu – ale o tom až někdy příště.
This is Great document. Can you please share a English translated copy?
[…] Co dál? Plánuji ukázat integrace do orchestrátorů – určitě si zkusíme plugin pro Docker libnetwork a Swarm a třeba se dostaneme i k dalším možnostem nasazení Project Calico jako je OpenStack […]
[…] režim, tedy bez napojení na orchestrátor (v případě Dockeru tedy dnes nepoužijeme libnetwork driver, to až […]