アプリケーションの Docker 化 - Docker User Guide


# アプリケーションの 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](https://hub.docker.com/) からイメージをダウンロードします。

次に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` という、２つのフラグも引き渡しました。`-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