アプリケーションの Docker 化
Dockerizing Applications - Docker Documentation
http://docs.docker.com/userguide/dockerizing/
アプリケーションの Docker 化:"Hello World"
それで、Docker とは一体何なのでしょうか?
Docker はコンテナの中でアプリケーションを実行させます。アプリケーションをコンテナで実行するには、単純に docker run
というコマンドを実行するだけです。
Hello World
まずは、試してみましょう。
$ sudo docker run ubuntu:14.04 /bin/echo 'Hello World'
Hello World!
これで最初のコンテナを起動しました!
何が起こったのでしょうか? docker run
コマンドで実行した内容を見ていきましょう。
まず docker
バイナリに対し、実行するというコマンド run
を指定します。docker run
は、コンテナを実行するという組み合わせです。
次に ubuntu:14.04
というイメージを指定しました。これは私たちが実行したコンテナのソースにあたります。Docker ではこれをイメージと呼びます。この例では、Ubuntu 14.04 のオペレーティングシステムのイメージを使いました。
イメージを指定すると、Docker は、自身の Docker ホスト上のイメージを探します。もし見つからなければ、公開イメージレジストリである Docker Hub からイメージをダウンロードします。
次にDocker に対して、私たちの新しいコンテナに、どのようなコマンドを実行してほしいか伝えます。
/bin/echo 'Hello World'
コンテナが起動したら、Docker は新しい Ubuntu 14.04 の環境を作り、そこで /bin/echo
コマンドを実行します。そして、コマンドラインの結果が次のように表示されます。
Hello World
表示をした後のコンテナはどのような状況でしょうか。Docker コンテナが実行されていた(アクティブだった)のは、指定したコマンドが実行される間だけでした。今回は、Hello World
を表示すると、すぐにコンテナが停止しました。
対話型コンテナ(インタラクティブなコンテナ)
再び docker run
コマンドを試しますが、今度は実行するコマンドに別のものを指定してみましょう。
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#
ここでは再び docker run
コマンドを実行し、ubuntu:14.04
イメージを起動しました。しかし、今回は -t
と -i
という、2つのフラグも引き渡しました。-t
フラグは、疑似 tty やターミナルを私たちの新しいコンテナの中に割り当て、-i
フラグはコンテナの標準入力('STDIN') を双方向に取得出来るようにします。
そして、コンテナ実行時に /bin/bash
という新しいコマンドを指定しました。コンテナの中で、Bash シェルを実行しようとします。
コンテナを起動しようとすると、次のようなコマンドプロンプトが表示されるでしょう。
root@af8bae53bdd3:/#
コンテナの中で次のようにコマンドを実行しましょう。
root@af8bae53bdd3:/# pwd
/
root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
pwd
を実行すると、現在のディレクトリが表示されますので、/
というルートディレクトリにいることがわかります。また、ルートディレクトリ以下でディレクトリ一覧を実行すると、典型的な Linux ファイルシステムのように表示されます。
これで、あとはコンテナで遊ぶことができますが、終わったあとは exit
コマンドを実行して終了することができます。
root@af8bae53bdd3:/# exit
前に作成したコンテナと同様、Bash シェルスクリプトが終了すると、コンテナは停止となります。
Hello World のデーモン化
ここまでのコンテナは、コマンドを実行した後に終了できますが、あまり有用とは言えません。大部分のアプリケーションのように、私たちが通常 Docker 実行時に使うであろう、デーモンとして稼働できるコンテナをつくりましょう。
今度も docker run
コマンドを実行します。
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
ちょっとまって? "Hello World" は何処に行ったのでしょう。ここで私たちが何を実行しようとしているか見てみましょう。かなり同じように見えます。docker run
を実行しますが、今回は -d
のフラグが指定されています。-d
フラグは Docker がコンテナを実行するにあたって、それをデーモン化してバックグラウンドで動作するように指示します。
また、同じようにイメージを ubuntu:14.04
と指定します。
最後に、実行するコマンドを指定します。
/bin/sh -c "while true; do echo hello world; sleep 1; done"
これは世界で最も単純な(hello world の)デーモンであり、永遠に hello world
を言い続けるシェルスクリプトです。
では、実行してもhello world
も何も表示されないのは何故でしょうか。その代わり、実際には長い文字列を返しました。
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
この長い文字列は、コンテナ ID と呼ばれます。私たちが仕事をすることができるように、コンテナをユニークに特定するものです。
注:コンテナ ID は長くて扱いにくいです。そこで、少し後に、より短い ID と、コンテナを私たちが簡単に扱う方法をお見せします。
私たちはコンテナ ID を使って、hello world
デーモンで何が起こっているか見る事が出来ます。
まず、コンテナが実行していることを確認しましょう。docker ps
コマンドを使う事で、実行することができます。
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e5535038e28 ubuntu:14.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute insane_babbage
ここではデーモン化されたコンテナを見る事ができます。docker ps
は役に立つ情報をかえしますが、コンテナ ID のより短い形から始まっています。
image にはコンテナ作成のために使った ubuntu:14.04
であり、コマンドには現在実行しているもの、そして、ステータスと、自動的に割り振られた insane_babbage
という名前です。
注:Docker はコンテナを起動するとき、自動的に名前を付けます。後ほど、自分で名前を特定する方法を紹介します。
OK、これでコンテナが実行していることを確認する事ができました。しかし、これは私たちが実行するように求めたものが、動作しているでしょうか。コンテナの中で何が起きているのかを見るには、docker logs
コマンドを用います。割り当てられたコンテナ名を使用します。
$ sudo docker logs insane_babbage
hello world
hello world
hello world
. . .
docker logs
コマンドによって、コンテナの中をみて、その標準出力を返します。この例では、コマンドの hellow world
という出力です。
できましたね! これで初めて docker 化されたアプリケーションを作り、デーモンとして動作することが確認できました。
これで私たちは、自分自身で作ったコンテナを起動出来ることが確立できましたので、あとは、自分の手でデーモン化されたコンテナを停止しましょう。停止するには docker stop
コマンドを使用します。
$ sudo docker stop insane_babbage
insane_babbage
docker stop
コマンドは、Docker に対して丁寧に(politely)コンテナを停止するように命令します。
docker ps
コマンドを実行して、動作確認しましょう。
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
素晴らしいですね。コンテナは停止しました。
次のステップ
ここまで、Docker をはじめるの事が、いかに簡単なのかを見て来ました。それでは、更に進んだ使い方を見ていきましょう。
Go to Working With Containers.
http://docs.docker.com/userguide/usingdocker