オーケストレーションがビルドインされたDocker 1.12を試す!
DockerCon 2016にて発表されたDocker 1.12の新機能の一つにオーケストレーションがあります。元々提供はされていたのですが、ビルドインされたことでより簡単に、かつセキュアに使えるようになっています。
そこで今回はDocker 1.12系で使えるようになったオーケストレーション機能をレビューしてみます。
試した環境
Docker for Mac OSXで試しています。β版を使ってください。Windowsでも同じように試せます。アプリケーションを入れ替えて、初回起動時にコマンドをアップグレードしてくれます。
Docker - Build, Ship, and Run Any App, Anywhere
旧環境からのアップグレード
すでにDockerを使っている場合、VMイメージは1.11系のままとなっています。そうするとコマンドでエラーが出ますので、アップグレードが必要です(筆者はしばしハマっていました)。
まず適当な名前でDockerを立ち上げます。今回はmanagerとしています。
docker-machine start manager
立ち上がったら、環境変数を設定します。
eval $(docker-machine env manager)
そしてアップグレードします。
docker-machine upgrade manager
アップグレード完了後、再度IPアドレスを設定して完了です。
eval $(docker-machine env manager)
これでSSHでログインして1.12系になっていれば大丈夫です。あくまでもバージョンの確認で、実際の利用時にはSSHログインしている必要はありません。
$ docker-machine ssh manager ## . ## ## ## == ## ## ## ## ## === /"""""""""""""""""\___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\_______/ _ _ ____ _ _ | |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __ | '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__| | |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ | |_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_| WARNING: this is a build from test.docker.com, not a stable release. Boot2Docker version 1.12.0-rc2, build HEAD : 52952ef - Fri Jun 17 21:01:09 UTC 2016 Docker version 1.12.0-rc2, build 906eacd
Swarmを初期化
DockerではクラスタをSwarm(群れ)と呼びます。まずSwarmを初期化します。
$ docker swarm init --listen-addr $(docker-machine ip manager):2377 Swarm initialized: current node (5de0zhsbakpzswgcnvxmkla1l) is now a manager.
情報を確認すると、IsManagerがYesとなっているのが分かるかと思います。
$ docker info Containers: 4 : Swarm: active NodeID: 5de0zhsbakpzswgcnvxmkla1l IsManager: Yes Managers: 1 Nodes: 1 :
念のためノードの確認をします。
$ docker node ls ID NAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS 5de0zhsbakpzswgcnvxmkla1l * manager Accepted Ready Active Leader
ノードを追加する
次にオーケストレーションとして必要なノードを追加していきます。今回はagent1、agent2として追加します。こちらも必要があればVMイメージのアップグレードを行ってください。agent1の場合は次のようになります。ノードの追加がとてもシンプルに行えるようになっています。
$ docker-machine start agent1 $ docker swarm join $(docker-machine ip manager):2377 This node joined a Swarm as a worker.
ノードを追加した後、再度状態を確認します。
$ docker node ls ID NAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS 5de0zhsbakpzswgcnvxmkla1l * manager Accepted Ready Active Leader 8vt2si8o8tf1bnud0en49zc1i agent1 Accepted Ready Active a8oyorp84qdlvd9jyfnmdm7n2 agent2 Accepted Ready Active
このようにオーケストレーションが行われているのが確認できます。
サービスの登録と実行
オーケストレーションを行う際にはサービスという単位で登録を行います。
$ docker service create --replicas 1 --name helloworld alpine echo "Hello World" 47n75xze6xnwxlw9dc836k7et $ docker service ls ID NAME REPLICAS IMAGE COMMAND 47n75xze6xnw helloworld 0/1 alpine echo Hello World
このサービス名を指定して、処理を実行できます。どのノードで実行するかはDocker側で自動で判断してくれます。
サービスの内容はinspectで確認できます。
$ docker service inspect --pretty helloworld ID: 47n75xze6xnwxlw9dc836k7et Name: helloworld Mode: Replicated Replicas: 1 Placement: Strategy: Spread UpdateConfig: Parallelism: 0 ContainerSpec: Image: alpine Args: echo Hello World Resources: Reservations: Limits:
そしてtasksを使ってサービスを実行します。
$ docker service tasks helloworld ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE dpiybjjvflk04yo16kt8iwfxn helloworld.1 helloworld alpine Accepted 3 seconds Accepted agent2
実行結果の確認はマネージャ側で見られます。
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f0b91f03189e alpine:latest "echo 'Hello World'" 3 seconds ago Exited (0) 3 seconds ago helloworld.1.ea5tp9idhipnuq779bgl1n1z7 4b19b6110aba alpine:latest "echo 'Hello World'" 20 seconds ago Exited (0) 20 seconds ago helloworld.1.0jfxrl89nwz7n6woyfhnak0fs 063c28bda4d6 alpine:latest "echo 'Hello World'" 38 seconds ago Exited (0) 37 seconds ago helloworld.1.8381fga2vjv8u76hvx55aw6pt 953667a24432 alpine:latest "echo 'Hello World'" 57 seconds ago Exited (0) 57 seconds ago helloworld.1.5wefso45eazyn2j468tw7ar3j
サービスをスケールさせる場合はscaleコマンドを使います。
$ docker service scale helloworld=5
Docker 1.12のオーケストレーションはシンプルかつパワフル、回復力、セキュア、オプションと後方互換性を重視して開発されているとのことです。実際、これまでのものに比べると格段に使いやすくなっています。
ぜひこの新しい機能を使って、複雑化するコンテナ、ノード管理をシンプルにしてください。