Docker Swarm do orkiestracji kontenerów
Opublikowany: 2019-08-08Wszystko o Docker Swarm oraz o tym, jak zarządza i koordynuje wszystkie kontenery w klastrze.
Co to jest rój Dockerów?
Docker swarm to tryb obsługi klastra Docker Engines, stąd nazwa Swarm. Klaster hostów platformy Docker działa w trybie roju składającym się z menedżerów i pracowników. Instancje silnika dockera, które uczestniczą w roju, nazywane są węzłami.
Wdrożenie roju na poziomie produkcyjnym składa się z węzłów dokera rozmieszczonych na wielu serwerach.
Dlaczego go używać? – Orkiestracja kontenerów
Kiedy pracujesz w środowisku produkcyjnym, setki kontenerów dockera będą w nim działać z wieloma aplikacjami. Zarządzanie wszystkimi tymi kontenerami może być dużym problemem dla wszystkich inżynierów DevOps; tutaj pomaga Ci Docker Swarm. Z łatwością zarządza i koordynuje klaster obsługujący wiele kontenerów platformy Docker.
Poniżej znajdują się niektóre z jego funkcji:
- Wysoka dostępność – ma na celu zapewnienie braku przestojów lub przestojów.
- Równoważenie obciążenia — automatycznie przydziela zasoby i żądania na inne węzły w klastrze w przypadku awarii dowolnego węzła.
- Zdecentralizowany – wiele węzłów menedżerskich działa w środowisku produkcyjnym; stąd klaster nigdy nie jest zależny od pojedynczego węzła zarządzającego.
- Skalowalność – za pomocą jednego polecenia docker swarm możesz łatwo skalować w górę lub w dół kontenery w klastrze.
Zorganizuj kontenery Docker
Teraz, gdy znasz już podstawy Docker Swarm, przyjrzyjmy się przykładowi jego implementacji.
W tym przykładzie mam trzy maszyny działające w klastrze z poniższymi szczegółami:
manager1: 192.168.56.104 worker1: 192.168.56.105 worker2: 192.168.56.102
Aby zainicjować tryb roju w dockerze, uruchom poniższe polecenie w węźle menedżera. Flaga --advertise-addr
służy do ogłaszania się do węzłów, które mogą dołączyć do klastra.
geekflare@manager1:~$ docker swarm init --advertise-addr 192.168.56.104 Swarm initialized: current node (lssbyfzuiuh3sye1on63eyixf) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Powyższe polecenie wygeneruje token, który będzie używany przez inne węzły do przyłączenia się do tego klastra. Skopiuj polecenie z wygenerowanym tokenem i uruchom je w węzłach procesu roboczego.
Uruchamianie tokena w węźle worker1.
geekflare@worker1:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 This node joined a swarm as a worker.
Uruchamianie tokena w węźle worker2.
geekflare@worker2:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 This node joined a swarm as a worker.
Teraz w węźle menedżera możesz sprawdzić, które węzły działają w klastrze.
geekflare@manager1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION lssbyfzuiuh3sye1on63eyixf * manager1 Ready Active Leader 18.09.6 utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6 xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6
Zbudujmy obraz geekflare_mongodb
, którego użyliśmy w samouczku Dockerfile.
docker build -t geekflare_mongodb .
Uruchom kontener obrazu dokowanego MongoDB, tworząc usługę roju. 27017 to numer portu, na którym wystawiona jest MongoDB.
geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. kok58xa4zi05psh3uy6s5x9e6 overall progress: 1 out of 1 tasks 1/1: running verify: Service converged
Sprawdź, czy usługa roju dokerów została uruchomiona. TRYB zreplikowany oznacza, że kontener został zreplikowany na wszystkich węzłach w klastrze, a REPLICAS 1/1 oznacza, że aktualnie działa tylko jedna usługa roju.
geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS kok58xa4zi05 Mongo-Container replicated 1/1 geekflare_mongodb:latest *:27017->27017/tcp
Sprawdźmy, na którym węźle w klastrze działa ta pojedyncza usługa. Działa na węźle manager1.
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS jgqjo92rbq23 Mongo-Container.1 geekflare_mongodb:latest manager1 Running Running about a minute ago
Uruchom polecenie docker ps, aby uzyskać więcej szczegółów na temat kontenera, na którym działa ta usługa roju.
geekflare@manager1:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05d77e7b4850 geekflare_mongodb:latest "/bin/sh -c usr/bin/…" 2 minutes ago Up 2 minutes 27017/tcp Mongo-Container.1.jgqjo92rbq23sv01hrufdigtx
Możesz uruchomić usługę roju w trybie „globalnym” również zamiast domyślnego trybu „replikowanego”. Tryb globalny uruchamia jedno zadanie usługi roju na wszystkich węzłach w klastrze.
Zanim uruchomię usługę w trybie globalnym, pozwól mi usunąć istniejący działający kontener.
geekflare@manager1:~$ docker service rm Mongo-Container Mongo-Container
Uruchom usługę roju w kontenerze platformy Docker w trybie globalnym przy użyciu flagi –mode.
geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --mode global geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. mfw8dp0zylffppkllkcjl8391 overall progress: 3 out of 3 tasks utdr3dnngqf1: running lssbyfzuiuh3: running xs6jqp95lw4c: running verify: Service converged
Sprawdź, czy usługa roju uruchomiła się w trybie globalnym. Ponieważ w klastrze działają trzy węzły (1 menedżer, 2 procesy robocze), dlatego liczba replik wynosi 3.
geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS mfw8dp0zylff Mongo-Container global 3/3 geekflare_mongodb:latest *:27017->27017/tcp
3 usługi działają teraz w 3 węzłach, sprawdź to, uruchamiając poniższe polecenie.

geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS zj2blvptkvj6 Mongo-Container.xs6jqp95lw4cml1i1npygt3cg geekflare_mongodb:latest worker2 Running Running about a minute ago 3eaweijbbutf Mongo-Container.utdr3dnngqf1oy1spupy1qlhu geekflare_mongodb:latest worker1 Running Running about a minute ago yejg1o2oyab7 Mongo-Container.lssbyfzuiuh3sye1on63eyixf geekflare_mongodb:latest manager1 Running Running about a minute ago
Następnie pokażę, jak można zdefiniować liczbę replik. Wcześniej usunę bieżący kontener, który jest uruchomiony.
geekflare@manager1:~$ docker service rm Mongo-Container Mongo-Container
Użyj flagi –replicas w poleceniu i podaj liczbę replik usługi roju, które chcesz. Na przykład chcę mieć dwie repliki usługi roju:
geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --replicas=2 geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. 4yfl41n7sfak65p6zqwwjq82c overall progress: 2 out of 2 tasks 1/2: running 2/2: running verify: Service converged
Sprawdź aktualnie działające usługi roju. Widać, że jedna replika jest uruchomiona w węźle manager1, a druga w węźle worker1.
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS xukodj69h79q Mongo-Container.1 geekflare_mongodb:latest worker1 Running Running 9 seconds ago e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 9 seconds ago
Przejdź do węzła worker1 i sprawdź, czy kontener dockera obsługuje usługę roju.
geekflare@worker1:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5042b7f161cb geekflare_mongodb:latest "/bin/sh -c usr/bin/…" About a minute ago Up About a minute 27017/tcp Mongo-Container.1.xukodj69h79q3xf0pouwm7bwv
Aby zatrzymać ten kontener, uruchom poniższe polecenie.
geekflare@worker1:~$ docker stop 5042b7f161cb 5042b7f161cb
Teraz z węzła menedżera1, jeśli sprawdzisz, na których wszystkich węzłach działa usługa, zobaczysz, że działa ona na węźle menedżera1 i węźle roboczym2. BIEŻĄCY STAN węzła worker1 to Shutdown (ponieważ zatrzymaliśmy kontener z uruchomioną usługą). Ale ponieważ dwie repliki muszą działać w tej usłudze, inna usługa została uruchomiona w procesie roboczym 2.
W ten sposób osiągasz wysoką dostępność za pomocą roju docker.
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 30 seconds ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 38 seconds ago "task: non-zero exit (137)" e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 3 minutes ago
Skalowanie kontenerów Docker w górę lub w dół jest bardzo łatwe. Poniższe polecenie przeskaluje kontener mongo do 5.
geekflare@manager1:~$ docker service scale Mongo-Container=5 Mongo-Container scaled to 5 overall progress: 5 out of 5 tasks 1/5: running 2/5: running 3/5: running 4/5: running 5/5: running verify: Service converged
Sprawdź ile jest obecnie uruchomionych replik kontenera mongo, musi być 5.
geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS 4yfl41n7sfak Mongo-Container replicated 5/5 geekflare_mongodb:latest *:27017->27017/tcp
Sprawdź, gdzie w klastrze działa te 5 replik. 1 replika działa w węźle manager1 i 2 repliki w obu węzłach roboczych.
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 2 minutes ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 2 minutes ago "task: non-zero exit (137)" e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 5 minutes ago qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running 47 seconds ago 9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running 46 seconds ago e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running Running 44 seconds ago
W klastrze, jeśli nie chcesz, aby Twoje usługi działały na węzłach menedżera i chcesz zachować je tylko do zarządzania węzłami, możesz opróżnić węzeł menedżera.
geekflare@manager1:~$ docker node update --availability drain manager1 manager1
Sprawdź dostępność węzła zarządzającego.
geekflare@manager1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION lssbyfzuiuh3sye1on63eyixf * manager1 Ready Drain Leader 18.09.6 utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6 xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6
Zobaczysz, że usługi nie działają już w węźle menedżera; są one rozłożone na węzły procesu roboczego w klastrze.
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 5 minutes ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 5 minutes ago "task: non-zero exit (137)" qo405dheuutj Mongo-Container.2 geekflare_mongodb:latest worker1 Running Running 41 seconds ago e66zllm0foc8 \_ Mongo-Container.2 geekflare_mongodb:latest manager1 Shutdown Shutdown 44 seconds ago qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running 3 minutes ago 9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running 3 minutes ago e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running Running 3 minutes ago
To wszystko dotyczyło Docker Swarm i sposobu organizowania kontenerów w trybie Docker Swarm. Wypróbuj je w środowisku nieprodukcyjnym, aby zorientować się, jak to działa.