話題の記事

boot2docker + figで始めるDockerコンテナ・オーケストレーション

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Docker 1.3がリリースされましたね!

それに合わせて、Dockerコンテナのオーケストレーションツールであるfigも1.0がリリースされました!

figの概要についてざっとご説明すると「複数のDockerコンテナの定義をYAML形式の設定ファイルに書いておくことで、コマンド一発で構築したり構成変更できたりする」という便利ツールです。

ということで、fig 1.0リリース記念、Mac OS X上でfigを使ってみました!

やってみる

boot2dockerのセットアップ

boot2dockerのgithubリポジトリにあるosx-installerから、最新のpkgファイルをダウンロードします。現時点の最新はv1.3.0です。

Releases_·_boot2docker_osx-installer

ダウンロードしたpkgファイルを実行すると、インストーラが起動します。[続ける]ボタンをクリックします。

Boot2Docker_for_Mac_OS_X_のインストール

インストール先を変更する場合はこの画面で選択します。[インストール]ボタンをクリックします。

Boot2Docker_for_Mac_OS_X_のインストール 2

グィーンとインストールが進行します。

Boot2Docker_for_Mac_OS_X_のインストール 3

インストールが完了したら[閉じる]ボタンをクリックします。

Boot2Docker_for_Mac_OS_X_のインストール 4

ターミナルを立ち上げて、boot2dockerを初期化します。

$ boot2docker init
Latest release for boot2docker/boot2docker is v1.3.0
Downloading boot2docker ISO image...
Success: downloaded

そしてboot2dockerを起動します。

$ boot2docker start
Waiting for VM and Docker daemon to start...
..........................oooooooooooooooooooooo
Started.

    export DOCKER_CERT_PATH=/Users/sasakidaisuke/.boot2docker/certs/boot2docker-vm
    export DOCKER_TLS_VERIFY=1
    export DOCKER_HOST=tcp://192.168.59.103:2376

こんな感じで設定すべき環境変数が表示されますので、設定しておきましょう。

figのインストール

Install Figに書いてある通り、コマンド一発でインストールできます。

$ curl -L https://github.com/docker/fig/releases/download/1.0.0/fig-`uname -s`-`uname -m` > /usr/local/bin/fig; chmod +x /usr/local/bin/fig

インストール後、正常に動作するか確認しておきます。

$ fig --version
fig 1.0.0

コンテナを起動してみる

さて、とりあえずDockerコンテナを起動してみましょう。今回はDocker Hub Registryに登録されているElasticsearch謹製のDockerfileを使わせてもらいます。

こんな感じでYAML形式の設定ファイルを作成します。細かい記述方式はfig.yml referenceを参照してください。

$ vi fig.yml
elasticsearch:
  image: dockerfile/elasticsearch
  ports:
    - '9200:9200'
    - '9300:9300'

ではfig upコマンドでコンテナを起動します。-dを付与することでデタッチモードで起動されます。

$ fig up -d
Creating sasakidaisuke_elasticsearch_1...
Pulling image dockerfile/elasticsearch...
Status: Downloaded newer image for dockerfile/elasticsearch
Attaching to sasakidaisuke_elasticsearch_1
elasticsearch_1 | [2014-10-21 08:37:11,032][INFO ][node                     ] [Jacques DuQuesne] version[1.3.2], pid[1], build[dee175d/2014-08-13T14:29:30Z]
elasticsearch_1 | [2014-10-21 08:37:11,033][INFO ][node                     ] [Jacques DuQuesne] initializing ...
elasticsearch_1 | [2014-10-21 08:37:11,043][INFO ][plugins                  ] [Jacques DuQuesne] loaded [], sites []
elasticsearch_1 | [2014-10-21 08:37:14,251][INFO ][node                     ] [Jacques DuQuesne] initialized
elasticsearch_1 | [2014-10-21 08:37:14,252][INFO ][node                     ] [Jacques DuQuesne] starting ...
elasticsearch_1 | [2014-10-21 08:37:14,367][INFO ][transport                ] [Jacques DuQuesne] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/172.17.0.11:9300]}
elasticsearch_1 | [2014-10-21 08:37:14,397][INFO ][discovery                ] [Jacques DuQuesne] elasticsearch/j5fbGbVHSvSK8-QXplh0ew
elasticsearch_1 | [2014-10-21 08:37:17,412][INFO ][cluster.service          ] [Jacques DuQuesne] new_master [Jacques DuQuesne][j5fbGbVHSvSK8-QXplh0ew][d653c0c5075f][inet[/172.17.0.11:9300]], reason: zen-disco-join (elected_as_master)
elasticsearch_1 | [2014-10-21 08:37:17,508][INFO ][http                     ] [Jacques DuQuesne] bound_address {inet[/0:0:0:0:0:0:0:0:9200]}, publish_address {inet[/172.17.0.11:9200]}
elasticsearch_1 | [2014-10-21 08:37:17,516][INFO ][node                     ] [Jacques DuQuesne] started
elasticsearch_1 | [2014-10-21 08:37:17,533][INFO ][gateway                  ] [Jacques DuQuesne] recovered [0] indices into cluster_state

fig psコマンドで、コンテナの起動状態が確認できます。

$ fig ps
            Name                           Command               State                       Ports
-----------------------------------------------------------------------------------------------------------------------
sasakidaisuke_elasticsearch_1   /elasticsearch/bin/elastic ...   Up      0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp

ではコンテナに対して接続確認をしてみます。コンテナに接続するための仮想IPアドレスはboot2docker ipコマンドで確認ができます。

$ boot2docker ip

The VM's Host only interface IP address is: 192.168.59.103

Elasticsearchに接続してみます。

$ curl http://192.168.59.103:9200/
{
  "status" : 200,
  "name" : "Jacques DuQuesne",
  "version" : {
    "number" : "1.3.2",
    "build_hash" : "dee175dbe2f254f3f26992f5d7591939aaefd12f",
    "build_timestamp" : "2014-08-13T14:29:30Z",
    "build_snapshot" : false,
    "lucene_version" : "4.9"
  },
  "tagline" : "You Know, for Search"
}

ちゃんとコンテナが起動し、Elasticsearchに接続できることがわかりました!

とりあえず一旦、コンテナを停止しておきます。

$ fig stop
Stopping sasakidaisuke_elasticsearch_1...

本題:オーケストレーションしてみる

やっと本題です。さっきはコンテナ1つだけ立ち上げてみましたが、これだとfigの旨味がありません。そこで複数のコンテナをオマンド一発で起動してみます。

先ほど作成したfig.ymlを編集し、コンテナ定義を追加します。今度はnginxのDockerfileを使います。

$ vi fig.yml
elasticsearch:
  image: dockerfile/elasticsearch
  ports:
    - '9200:9200'
    - '9300:9300'
nginx:
  image: dockerfile/nginx
  ports:
    - '80'
    - '443'

ではfig upで起動してみましょう。

$ fig up -d
Creating sasakidaisuke_nginx_1...
Pulling image dockerfile/nginx...
Status: Downloaded newer image for dockerfile/nginx
Creating sasakidaisuke_elasticsearch_1...

fig psで確認すると、ちゃんとコンテナが2つ起動されていることがわかります。

$ fig ps
            Name                           Command               State                       Ports
-----------------------------------------------------------------------------------------------------------------------
sasakidaisuke_elasticsearch_1   /elasticsearch/bin/elastic ...   Up      0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp
sasakidaisuke_nginx_1           nginx                            Up      0.0.0.0:49153->443/tcp, 0.0.0.0:49154->80/tcp

nginxコンテナに接続して、Webサーバとして起動していることを確認します。

$ curl http://192.168.59.103:49154/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
(...snip...)

figにはオーケストレーションツールらしいfig scaleというコマンドがあります。このコマンドで各定義に対し台数を指定することでスケールされます。以下はnginxコンテナを2つにスケールアウトしています。

$ fig scale nginx=2
Starting sasakidaisuke_nginx_2...

fig psコマンドで確認すると、ちゃんとnginxコンテナが2つ起動していることがわかります!

$ fig ps
            Name                           Command               State                       Ports
-----------------------------------------------------------------------------------------------------------------------
sasakidaisuke_elasticsearch_1   /elasticsearch/bin/elastic ...   Up      0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp
sasakidaisuke_nginx_1           nginx                            Up      0.0.0.0:49153->443/tcp, 0.0.0.0:49154->80/tcp
sasakidaisuke_nginx_2           nginx                            Up      0.0.0.0:49155->443/tcp, 0.0.0.0:49156->80/tcp

もちろん2つ目のnginxコンテナもちゃんとWebサーバとして起動しています。

$ curl http://192.168.59.103:49156/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
(...snip...)

はいオーケストレーション!

その他便利コマンド

fig pullで一気に全ての最新イメージをプルできます。

$ fig pull
Pulling nginx (dockerfile/nginx)...
Pulling elasticsearch (dockerfile/elasticsearch)...

fig restartで全コンテナを一度に再起動することが出来ます。

$ fig restart
Restarting sasakidaisuke_nginx_2...
Restarting sasakidaisuke_nginx_1...
Restarting sasakidaisuke_elasticsearch_1...

まとめ

超簡単!とても楽にローカル環境でのアプリケーションやサービスの検証が行えますね!