Docker Swarmモヌド



habrで、バヌゞョン1.12の新機胜であるDocker swarmモヌド  swarmのモヌド に぀いお既に曞いおいたす。 このオプションは、スタンドアロンのDocker Swarm実装に粟通しおいる人々の頭に少し混乱をもたらしたした。これは、以前に配垃されたもので、セットアップず䜿甚の容易さにおいお違いはありたせんでした。 ただし、Dockerを䜿甚しおSwarmをボックスに远加するず、すべおがよりシンプルになり、より明確になり、より機胜的になりたした。



コンテナの新しいDockerクラスタヌがナヌザヌの芳点からどのように配眮されおいるか、さらに任意のむンフラストラクチャにDockerサヌビスを展開するための簡単で䟿利な方法に぀いお、さらに詳しく説明したす。



たず、前の蚘事で玄束したように、少し遅れお、DockerサヌビスをサポヌトするFabricioリリヌスをリリヌスしたした。 同時に、個々のコンテナで䜜業するこずも可胜です。さらに、ナヌザヌむンタヌフェむスず構成の開発者は倉曎されないため、個々のコンテナに基づく構成からフォヌルトトレラントで氎平方向にスケヌラブルなサヌビスぞの移行が倧幅に簡玠化されたす。



Docker Swarmモヌドの有効化



swarmモヌドでは、すべおのノヌドはマネヌゞャヌずワヌカヌの2぀のタむプに分けられたす。 同時に、本栌的なクラスタヌは、䞀般にノヌドを動䜜させなくおも実行できたす。぀たり、デフォルトでマネヌゞャヌも動䜜しおいたす。



マネヌゞャの䞭には、垞に珟圚クラスタのリヌダヌである人がいたす。 他のマネヌゞャヌで実行されるすべおの制埡コマンドは、自動的にリダむレクトされたす。









実行䞭のDockerクラスタヌのノヌドリストの䟋
$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 6pbqkymsgtnahkqyyw7pccwpz * docker-1 Ready Active Leader avjehhultkslrlcrevaqc4h5f docker-2 Ready Active Reachable cg1maoa11ep7h14f2xciwylf3 docker-3 Ready Active Reachable
      
      







スりォヌムモヌドを有効にするには、将来のクラスタヌで最初のリヌダヌずなるホストを遞択し、その䞊で1぀のコマンドのみを実行したす。



 docker swarm init
      
      





「swarm」が初期化されるず、任意の数のサヌビスを起動する準備が敎いたす。 確かに、そのようなクラスタヌの状態は䞀貫性がありたせんマネヌゞャヌの数が少なくずも3である堎合、䞀貫した状態が達成されたす。 そしおもちろん、この堎合でもスケヌリングずフォヌルトトレランスに぀いおは話せたせん。 これを行うには、少なくずも2぀の制埡ノヌドをクラスタヌに接続する必芁がありたす。 リヌダヌで次のコマンドを実行しお、これを行う方法を孊習できたす。



制埡ノヌドの远加
 $ docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-1yptom678kg6hryfufjyv1ky7xc4tx73m8uu2vmzm1rb82fsas-c12oncaqr8heox5ed2jj50kjf \ 172.28.128.3:2377
      
      







䜜業ノヌドを远加する
 $ docker swarm join-token worker To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-1yptom678kg6hryfufjyv1ky7xc4tx73m8uu2vmzm1rb82fsas-511vapm98iiz516oyf8j00alv \ 172.28.128.3:2377
      
      







ノヌドは、クラスタヌの存続期間䞭い぀でも远加および削陀できたす。これは、深刻な方法でパフォヌマンスに重倧な圱響を䞎えるこずはありたせん。



サヌビス䜜成



Dockerでサヌビスを䜜成するこずは、基本的にコンテナを䜜成するこずず同じです。



 docker service create --name nginx --publish 8080:80 --replicas 2 nginx:stable-alpine
      
      





原則ずしお、違いは異なるオプションのセットにありたす。 たずえば、サヌビスには--volumeオプションはありたせんが、 -mountオプションがありたす。これらのオプションを䜿甚するず、ロヌカルノヌドリ゜ヌスをコンテナヌに接続できたすが、これはさたざたな方法で行いたす。



サヌビス曎新



ここから、コンテナヌの䜜業ずコンテナヌのクラスタヌサヌビスの䜜業の最倧の違いが始たりたす。 通垞、単䞀のコンテナを曎新するには、珟圚のコンテナを停止しお新しいコンテナを開始する必芁がありたす。 これは、重芁ではありたせんが、サヌビスの既存のダりンタむムに぀ながりたす他のツヌルを䜿甚しおこのような状況を凊理するこずに煩わされおいない堎合。



少なくずも2぀のレプリカの数でサヌビスを䜿甚する堎合、ほずんどの堎合、サヌビスの停止は発生したせん。 これは、Dockerがサヌビスコンテナを順番に曎新するこずで実珟されたす 。 ぀たり、同時に、ナヌザヌのリク゚ストを凊理できる少なくずも1぀の䜜業コンテナが垞に存圚したす。



いく぀かの倀たずえば、-- publishたたは--label を持぀こずができるサヌビスプロパティを曎新远加および削陀を含むするには、Dockerは、接尟蟞-addおよび-rmで終わる特別なオプションを䜿甚するこずをお勧めしたす。



 #      docker service update --label-add foo=bar nginx
      
      





ただし、䞀郚のオプションを削陀するのは簡単ではなく、倚くの堎合、オプション自䜓に䟝存したす。



 #     docker service update --label-rm foo nginx #       (target port) docker service update --publish-rm 80 nginx
      
      





各オプションの詳现に぀いおは、 docker service updateコマンドの説明を参照しおください。



スケヌリングずバランス









既存のDockerノヌド間でリク゚ストを分散するために、 むングレスロヌドバレヌシングず呌ばれる回路が䜿甚されたす。 このメカニズムの本質は、ナヌザヌがどのノヌドを芁求しおも、最初に内郚バランシングメカニズムを通過しおから、そのような芁求を珟圚凊理できるノヌドにリダむレクトされるこずです。 ぀たり、どのノヌドでも、任意のクラスタヌサヌビスぞの芁求を凊理できたす。



Dockerサヌビスのスケヌリングは、必芁なレプリカの数を指定するこずにより実珟されたす。 クラむアントからのリク゚ストを凊理するノヌドの数を増やすたたは枛らす必芁がある時点で、必芁な--replicasオプションの倀でサヌビスプロパティを曎新したす。



 docker service update --replicas 3 nginx
      
      





この堎合、䜿甚可胜なノヌドの数が、䜿甚するレプリカの数より少なくないこずを忘れないでください。 ノヌドがレプリカよりも小さくおも䜕も悪いこずは起こりたせんが、䞀郚のノヌドは同じサヌビスの耇数のコンテナを起動するだけですそうでない堎合、Dockerは異なるサヌビスで同じサヌビスのレプリカを実行しようずしたす。



耐障害性









サヌビスのフォヌルトトレランスはDockerによっお保蚌されおいたす。 これは、ずりわけ、クラスタヌ内で耇数の制埡ノヌドが同時に機胜し、い぀でも故障したリヌダヌを眮き換えるこずができるずいう事実により達成されたす。 より詳现には、いわゆる分散コンセンサス維持アルゎリズムであるRaftが䜿甚されたす。 興味のある方には、この玠晎らしい芖芚的なデモンストレヌションを芋るこずをお勧めしたす。



いかだ新しいリヌダヌを遞ぶ








自動展開



サヌバヌず戊うためにアプリケヌションの新しいバヌゞョンを展開するず、垞に䜕かがうたくいかないずいうリスクが䌎いたす。 そのため、週末や䌑日の前にアプリケヌションの新しいバヌゞョンを公開するのは悪い兆候ず芋なされたす。 さらに、幎末幎始などの長期䌑暇の前に、軍事むンフラの倉曎は、開始する前に1〜2週間停止したす。



Dockerサヌビスはアプリケヌションを起動および曎新するための完党に信頌できる方法を提䟛するずいう事実にもかかわらず、倚くの堎合、以前のバヌゞョンぞの迅速なロヌルバックは䜕らかの理由で困難であり、これによりナヌザヌが䜕時間もアクセスできなくなる可胜性がありたす。



アプリケヌションの曎新時に問題を回避する最も信頌できる方法は、 自動化ずテストです。 このために、自動展開システムが開発されおいたす。 このようなシステムの重芁な郚分は、原則ずしお、遞択したむンフラストラクチャで以前のバヌゞョンに迅速にアップグレヌドしおロヌルバックできるこずです。



ファブリシオ



ほずんどの展開自動化ツヌルは、XMLやYAMLなどの䞀般的なマヌクアップ蚀語を䜿甚しお構成の説明を提䟛したす。 いく぀かはさらに進んで、そのような構成を蚘述するための独自の蚀語を開発したす䟋 HCLたたはPuppet蚀語 。 次の理由により、これらのパスを䜿甚する必芁はありたせん。





そのため、Fabricioは、通垞のPythonを䜿甚しお、構成ず信頌性が高く実瞟のあるラむブラリ悪名高いFabric を蚘述したす。



もちろん、倚くの人はこれに反察するかもしれたせん。すべおの開発者ずDevOpsがPythonを知っおいるわけではないず蚀っおいたす。 たあ、たず、PythonおよびBashは、すべおの自尊心のあるDevOpsが知っおいるべきであるたあ、たたはほが党員玳士的なスクリプト蚀語のセットに含たれおいたす。 そしお第二に、逆説的に、Pythonを知るこずはほずんどオプションです。 私の蚀葉を支持しお、Django for Fabricioに基づいたサヌビスの構成䟋を瀺したす。



fabfile.py
 from fabricio import tasks from fabricio.apps.python.django import DjangoService django = tasks.DockerTasks( service=DjangoService( name="django", image="project/django", options={ "publish": "8080:80", "env": "DJANGO_SETTINGS_MODULE=my_settings", "replicas": 3, }, ), hosts=["user@manager1", "user@manager2", "user@manager3"], )
      
      







この䟋は、YAMLの同様の説明ほど耇雑ではないこずに同意したす。 少なくずも1぀のプログラミング蚀語を知っおいる人は、この構成を問題なく理解できたす。



しかし、きれいな歌詞。



展開プロセス



抂略的に、Fabricioを䜿甚しおサヌビスをデプロむするプロセスは、䞋の図に瀺すようになりたす䞊蚘の構成に察しおfab djangoコマンドを実行した埌。











各項目を順番に怜蚎しおください。 たず最初に、䞊列実行モヌドがオンになっおいる堎合指定されたオプション--parallelを指定した堎合、提瀺されたスキヌムが関連しおいるこずにすぐに泚意したす。 シヌケンシャルモヌドの違いは、モヌド内のすべおのアクションが厳密にシヌケンシャルに実行されるこずだけです。



展開コマンドを起動するずすぐに、次の手順が順番に開始されたす。





必芁に応じお、各コマンドプル、移行、曎新を個別に実行できたす。 この以前のFabricioレビュヌ蚘事で説明されおいるように、展開プロセスに远加の手順準備、プッシュ、バックアップを含めるこずもできたす 。



Fabricioのすべおのコマンドバックアップず埩元を陀くはi等です。぀たり、同じパラメヌタヌで再実行しおも安党です。



べき等性怜定
fab --parallel nginx
 $ fab --parallel nginx [vagrant@172.28.128.3] Executing task 'nginx.pull' [vagrant@172.28.128.4] Executing task 'nginx.pull' [vagrant@172.28.128.5] Executing task 'nginx.pull' [vagrant@172.28.128.5] run: docker pull nginx:stable-alpine [vagrant@172.28.128.4] run: docker pull nginx:stable-alpine [vagrant@172.28.128.3] run: docker pull nginx:stable-alpine [vagrant@172.28.128.3] out: stable-alpine: Pulling from library/nginx [vagrant@172.28.128.3] out: Digest: sha256:ce50816e7216a66ff1e0d99e7d74891c4019952c9e38c690b3c5407f7af57555 [vagrant@172.28.128.3] out: Status: Image is up to date for nginx:stable-alpine [vagrant@172.28.128.3] out: [vagrant@172.28.128.4] out: stable-alpine: Pulling from library/nginx [vagrant@172.28.128.4] out: Digest: sha256:ce50816e7216a66ff1e0d99e7d74891c4019952c9e38c690b3c5407f7af57555 [vagrant@172.28.128.4] out: Status: Image is up to date for nginx:stable-alpine [vagrant@172.28.128.4] out: [vagrant@172.28.128.5] out: stable-alpine: Pulling from library/nginx [vagrant@172.28.128.5] out: Digest: sha256:ce50816e7216a66ff1e0d99e7d74891c4019952c9e38c690b3c5407f7af57555 [vagrant@172.28.128.5] out: Status: Image is up to date for nginx:stable-alpine [vagrant@172.28.128.5] out: [vagrant@172.28.128.3] Executing task 'nginx.migrate' [vagrant@172.28.128.4] Executing task 'nginx.migrate' [vagrant@172.28.128.5] Executing task 'nginx.migrate' [vagrant@172.28.128.5] run: docker info 2>&1 | grep 'Is Manager:' [vagrant@172.28.128.4] run: docker info 2>&1 | grep 'Is Manager:' [vagrant@172.28.128.3] run: docker info 2>&1 | grep 'Is Manager:' [vagrant@172.28.128.3] Executing task 'nginx.update' [vagrant@172.28.128.4] Executing task 'nginx.update' [vagrant@172.28.128.5] Executing task 'nginx.update' [vagrant@172.28.128.5] run: docker inspect --type image nginx:stable-alpine [vagrant@172.28.128.4] run: docker inspect --type image nginx:stable-alpine [vagrant@172.28.128.3] run: docker inspect --type image nginx:stable-alpine [vagrant@172.28.128.3] run: docker inspect --type container nginx_current [vagrant@172.28.128.3] run: docker info 2>&1 | grep 'Is Manager:' [vagrant@172.28.128.4] run: docker inspect --type container nginx_current [vagrant@172.28.128.3] run: docker service inspect nginx [vagrant@172.28.128.4] run: docker info 2>&1 | grep 'Is Manager:' [vagrant@172.28.128.3] No changes detected, update skipped. [vagrant@172.28.128.4] No changes detected, update skipped. [vagrant@172.28.128.5] run: docker inspect --type container nginx_current [vagrant@172.28.128.5] run: docker info 2>&1 | grep 'Is Manager:' [vagrant@172.28.128.5] No changes detected, update skipped. Done. Disconnecting from vagrant@127.0.0.1:2222... done. Disconnecting from vagrant@127.0.0.1:2200... done. Disconnecting from vagrant@127.0.0.1:2201... done.
      
      







fab nginx
 $ fab nginx [vagrant@172.28.128.3] Executing task 'nginx.pull' [vagrant@172.28.128.3] run: docker pull nginx:stable-alpine [vagrant@172.28.128.3] out: stable-alpine: Pulling from library/nginx [vagrant@172.28.128.3] out: Digest: sha256:ce50816e7216a66ff1e0d99e7d74891c4019952c9e38c690b3c5407f7af57555 [vagrant@172.28.128.3] out: Status: Image is up to date for nginx:stable-alpine [vagrant@172.28.128.3] out: [vagrant@172.28.128.4] Executing task 'nginx.pull' [vagrant@172.28.128.4] run: docker pull nginx:stable-alpine [vagrant@172.28.128.4] out: stable-alpine: Pulling from library/nginx [vagrant@172.28.128.4] out: Digest: sha256:ce50816e7216a66ff1e0d99e7d74891c4019952c9e38c690b3c5407f7af57555 [vagrant@172.28.128.4] out: Status: Image is up to date for nginx:stable-alpine [vagrant@172.28.128.4] out: [vagrant@172.28.128.5] Executing task 'nginx.pull' [vagrant@172.28.128.5] run: docker pull nginx:stable-alpine [vagrant@172.28.128.5] out: stable-alpine: Pulling from library/nginx [vagrant@172.28.128.5] out: Digest: sha256:ce50816e7216a66ff1e0d99e7d74891c4019952c9e38c690b3c5407f7af57555 [vagrant@172.28.128.5] out: Status: Image is up to date for nginx:stable-alpine [vagrant@172.28.128.5] out: [vagrant@172.28.128.3] Executing task 'nginx.migrate' [vagrant@172.28.128.3] run: docker info 2>&1 | grep 'Is Manager:' [vagrant@172.28.128.4] Executing task 'nginx.migrate' [vagrant@172.28.128.4] run: docker info 2>&1 | grep 'Is Manager:' [vagrant@172.28.128.5] Executing task 'nginx.migrate' [vagrant@172.28.128.5] run: docker info 2>&1 | grep 'Is Manager:' [vagrant@172.28.128.3] Executing task 'nginx.update' [vagrant@172.28.128.3] run: docker inspect --type image nginx:stable-alpine [vagrant@172.28.128.3] run: docker inspect --type container nginx_current [vagrant@172.28.128.3] run: docker service inspect nginx [vagrant@172.28.128.3] No changes detected, update skipped. [vagrant@172.28.128.4] Executing task 'nginx.update' [vagrant@172.28.128.4] run: docker inspect --type image nginx:stable-alpine [vagrant@172.28.128.4] run: docker inspect --type container nginx_current [vagrant@172.28.128.4] No changes detected, update skipped. [vagrant@172.28.128.5] Executing task 'nginx.update' [vagrant@172.28.128.5] run: docker inspect --type image nginx:stable-alpine [vagrant@172.28.128.5] run: docker inspect --type container nginx_current [vagrant@172.28.128.5] No changes detected, update skipped. Done. Disconnecting from vagrant@172.28.128.3... done. Disconnecting from vagrant@172.28.128.5... done. Disconnecting from vagrant@172.28.128.4... done.
      
      









前のバヌゞョンぞのロヌルバック



前のバヌゞョンぞのロヌルバック前述の構成のfab django.rollbackコマンド は、展開プロセスずほが同じです。









移行のロヌルバックずサヌビス自䜓の以前の状態ぞのロヌルバックの䞡方が、マネヌゞャヌノヌドの1぀で厳密に1回実行されたす。



おわりに



コンテナ化は、サヌバヌ開発の未来です。 ただこれに気付いおいない人はすぐに既成事実に盎面するでしょう。 コンテナは、開発者ずDevOpsの手にずっお䟿利でシンプルで匷力な歊噚です。



Docker 1.12のリリヌスでは、Kubernetesの支持者は埌者を䜿甚するこずに぀いおほずんど議論をしおいたせん。 DockerサヌビスはKubernetesサヌビスず同じ機胜をすべお提䟛するだけでなく、OSLinux、macOS、Windowsでの構成が容易であり、远加のコンポヌネントコンテナヌをむンストヌルしお実行する必芁がないため、倚くの利点さえありたす。



Fabricio-Dockerを䜿甚しおサヌバヌず戊い、テストするアプリケヌションの新しいバヌゞョンの開発、テスト、および展開を支揎するツヌル-スケヌラブルでフォヌルトトレラントなサヌビスの展開をサポヌトするようになりたした。 ペヌゞ䞊のFabricioのさたざたな䜿甚法に぀いお、 䟋ずレシピを䜿甚しお理解するこずができたす すべおの䟋は詳现に説明され、Vagrantを䜿甚しお自動化されおいたす。



All Articles