オーケストレーションがビルドインされた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のオーケストレーションはシンプルかつパワフル、回復力、セキュア、オプションと後方互換性を重視して開発されているとのことです。実際、これまでのものに比べると格段に使いやすくなっています。

ぜひこの新しい機能を使って、複雑化するコンテナ、ノード管理をシンプルにしてください。

Docker 1.12: Now with Built-in Orchestration! | Docker Blog