boot2docker + figで始めるDockerコンテナ・オーケストレーション
はじめに
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です。
ダウンロードしたpkgファイルを実行すると、インストーラが起動します。[続ける]ボタンをクリックします。
インストール先を変更する場合はこの画面で選択します。[インストール]ボタンをクリックします。
グィーンとインストールが進行します。
インストールが完了したら[閉じる]ボタンをクリックします。
ターミナルを立ち上げて、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...
まとめ
超簡単!とても楽にローカル環境でのアプリケーションやサービスの検証が行えますね!