アプリケーションをDocker化する：Hello World

以下のサイトがオリジナルであり、実際に実行しながら試した際のメモである。
http://docs.docker.com/userguide/dockerizing/

# 1. 事前準備
#### 環境
CentOS7.1

#### Dockerのインストール
curl -sSL https://get.docker.com/ | sh

#### Docker Serviceの起動
```
$ sudo service docker start
Starting docker (via systemctl):                           [  OK  ]
$ sudo chkconfig docker on
```

```
$ sudo docker version 
Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d
OS/Arch (client): linux/amd64
Server version: 1.7.1
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 786b29d
OS/Arch (server): linux/amd64
```

#### プロキシ設定
プライベートネットワーク環境でdocker runする際、イメージをDocker Hubから取得しようとすると当然ネットワークが到達できずエラーになるので、プロキシの設定をする必要がある。
/etc/systemd/system/docker.service.dディレクトリを作成し、以下のファイルを作成する。

```/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://<プロキシサーバ>:<ポート番号>/"
```

設定を反映させ、反映していることを確認

```
$ sudo systemctl daemon-reload
$ sudo systemctl show docker --property Environment
Environment=HTTP_PROXY=http://<プロキシサーバ>:<ポート番号>/
```

# dockerデーモンを再起動

```
$ sudo systemctl restart docker
```

docker hubへのログイン

```
$ sudo docker login
...
WARNING: login credentials saved in /root/.docker/config.json
Login Succeeded
```

# 2. Hello World
Dockerはアプリケーションをコンテナ内で実行することができる。コンテナの中でアプリケーションを実行するコマンドは：docker run.

```
$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world
```
docker runにつづいてイメージ（ubuntu:14.04）を指定。
イメージを指定する時、最初に地震のDockerホストからイメージを探し、そこで見つからなかったらDocker Hubからイメージをダウンロードする。
コンテナが起動したら、/bin/echoコマンドをコンテナ内で実行する。
そして、コマンドを実行した後、コンテナは停止する。

# A Interactive Container
```
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
root@f18a95d130a7:/
```
docker runコマンドでナを起動。
Dockerはイメージを呼び出す。この例の場合はUbuntu 14.04。
-tフラグは新しいコンテナ内でpseudo-ttyもしくはterminalをアサインする。
-iフラグはインタラクティブ接続を可能にする。
最後に指定している/bin/bashはコンテナ内でBash Shellを起動することを示している。
ログイン後は普通のLinuxのようにコマンドを実行できる。
ログイン後、Bash Shellをexitしたらコンテナも停止する

# A daemonized Hello world
デーモンとして動作するコンテナを生成する方法について本節で述べる。

```
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
fe54ce36afdb0b0d650b5b02bc8fba2295169d2f6e502b7ba9659768c5ef5eab
```
ここでは-dフラグでデーモン化してコンテナを起動。
コマンドを実行するとコンテナIDが返ってくる。
このコンテナIDを使ってコンテナの情報を参照することができる。（どのイメージを使ってコンテナを起動したかなどの情報も確認できる。）

```
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
fe54ce36afdb        ubuntu:14.04        "/bin/sh -c 'while t   10 minutes ago      Up 10 minutes                           sleepy_newton
```

コンテナの中に入って先ほどのコマンドの出力結果を見たいときは以下のコマンドを実行する。
docker logsコマンドはコンテナの中に入り、その標準出力を表示するコマンドである。

```
$ sudo docker logs fe54ce36afdb 
hello world
・・・
```

docker stopコマンドでデーモン化しているコンテナを停止する。

```
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
fe54ce36afdb        ubuntu:14.04        "/bin/sh -c 'while t   2 days ago          Up 2 days                               sleepy_newton
$ sudo docker stop fe54ce36afdb
fe54ce36afdb
```
docker psコマンドを実行し、コンテナが停止（何も出力されない）していることを確認。

# まとめ
| コマンド | 備考 | 
|:-----------|:------------|
| docker run | -t：pseudo-ttyもしくはterminalをアサイン|
||-i：インタラクティブ接続を可能|
||-d：デーモン化してコンテナを起動|     
| docker create |コンテナの作成。起動はしない |    
| docker ps | コンテナのリストを表示 |     
| docker logs |コンテナの標準出力を表示 |      
| docker stop |コンテナの停止 |