Dockerコンテナを扱う：Working with containers


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

# 1. dockerを利用したWebアプリケーション
docker versionコマンドで現在インストールされているdockerのバージョン情報（clientとdaemon,GO）を確認できる。

```
# 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
```

トレーニング用に用意されているアプリケーションをコンテナで実行する。
-dフラグでコンテナをバックグラウンドで実行。
-Pフラグでコンテナが必要としているポートをホストマシンにマップするように指示。
指定したtraining/webappイメージは既に用意されたものであり、Python Flask Webアプリケーションが含まれている。python app.pyでWebアプリケーションを起動している。

```
# docker run -d -P training/webapp python app.py
Unable to find image 'training/webapp:latest' locally
latest: Pulling from training/webapp
e9e06b06e14c: Pull complete
・・・
02a8815912ca: Already exists
Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d
Status: Downloaded newer image for training/webapp:latest
8a7ab4251c894aaaa9e83e3d3e5a5ea05ddb807b636d55c5ffdd34cc487c1aff
```

※docker runの詳細は以下を参照。
http://docs.docker.com/reference/run/
http://docs.docker.com/reference/commandline/cli/#run

起動したコンテナを確認する。

```
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
8a7ab4251c89        training/webapp     "python app.py"     34 seconds ago      Up 32 seconds       0.0.0.0:32768->5000/tcp   serene_lalande
```

-lフラグを指定することで最後に起動したコンテナを表示することができる。（停止したコンテナも参照したい場合は-aを指定）

```
# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
8a7ab4251c89        training/webapp     "python app.py"     53 minutes ago      Up 53 minutes       0.0.0.0:32768->5000/tcp   serene_lalande
```

アプリケーションの Docker 化で見てきたような詳細情報に加え、重要な PORTS 列が追加されている。-P フラグを docker run コマンドに渡すと、Docker は、イメージからホストに対して公開されているポートを割り当てる。ポートをどのように公開するかは以下を参照。
http://docs.docker.com/userguide/dockerimages/

今回、Docker はポート 5000 （デフォルトの Python Flask ポート）をポート 32768上に公開されている。（コンテナ上のポート5000をホストマシンのポート32768にマッピング）
ネットワークのポート割り当ては、Docker では常に変更可能である。この例では -P フラグは、-p 5000 へのショートカットであり、ローカルの Docker ホスト上の high port（32768 から61000）を、コンテナの中のポート 5000 に割り当てる。ブラウザで該当ポートにあくアセスすると正常に画面が出力されることを確認。
Docker コンテナに対して、-p フラグを使用して割り当てるポート番号を明示することも可能である。

```
# docker run -d -p 80:5000 training/webapp python app.py
```
この例だと、コンテナ内のポート5000をホストのポート80にマッピングさせている。

# 2. ネットワークポートのショートカット
ポートのマップ情報を取得するために“docker ps”コマンドを使うのは少し扱いにくい。そこで Docker には 'docker port' というショートカットがあり、'docker port' を使うと、コンテナ名や ID を指定して、対象のコンテナのポートが、公開ポートのどこに割り当てられているか知ることができる。

```
# docker port 8a7ab4251c89 5000
0.0.0.0:32768
```

# 3. ウェブアプリケーションのログを確認
docker logsコマンドでコンテナ内の標準出力を確認することができ、tailと同じように-fフラグを付けるとコンテナのログをウォッチすることができる。

```
# docker logs -f 8a7ab4251c89
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
10.82.160.70 - - [10/Aug/2015 04:12:49] "GET / HTTP/1.1" 200 -
10.82.160.70 - - [10/Aug/2015 04:12:50] "GET /favicon.ico HTTP/1.1" 404 -
```

# 4. ウェブアプリケーションコンテナのプロセスを見る
コンテナ内部で稼働しているプロセスを docker top コマンドによって動作状況を確認できる。

```
# docker top 8a7ab4251c89
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                1991                2316                0                   10:28               ?                   00:00:02            python app.py
```
ここではpython app コマンドのみがコンテナ内部で動作していることがわかる。

# 5. ウェブアプリケーションコンテナの調査
docker inspect コマンドを使うことにより、コンテナの便利な構成情報やステータス情報を JSON ハッシュの戻り値で確認することができる。

```
# docker inspect 8a7ab4251c89
[
{
    "Id": "8a7ab4251c894aaaa9e83e3d3e5a5ea05ddb807b636d55c5ffdd34cc487c1aff",
    "Created": "2015-08-10T01:28:55.76733563Z",
    "Path": "python",
    "Args": [
        "app.py"
・・・
        "MacAddress": "",
        "OnBuild": null,
        "Labels": {}
    }
}
]
```

inspectを利用し、特定の欲しい要素に関する情報を返すことも出来きる。たとえば、コンテナが使用するIP アドレスの情報。

```
# sudo docker inspect -f '{{ .NetworkSettings.IPAddress }}' 8a7ab4251c89
172.17.0.4
```

# 6. コンテナの起動（以前使ったものを利用）
停止しているコンテナIDを引数にdocker runすることにより、以前利用したコンテナを起動することができる。

```
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
8a7ab4251c89        training/webapp     "python app.py"     4 hours ago         Up 4 hours          0.0.0.0:32768->5000/tcp   serene_lalande
```

```
# docker stop 8a7ab4251c89
8a7ab4251c89
```

```
# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                       PORTS               NAMES
a8b4039c185e        training/webapp     "python app.py"        2 hours ago                                                          determined_kilby
8a7ab4251c89        training/webapp     "python app.py"        4 hours ago         Exited (137) 3 seconds ago                       serene_lalande
```

```
# docker start 8a7ab4251c89
8a7ab4251c89
```

```
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
8a7ab4251c89        training/webapp     "python app.py"     4 hours ago         Up 2 seconds        0.0.0.0:32769->5000/tcp   serene_lalande
```

docker restartでコンテナの再起動を行い、docker rmでコンテナの削除を行う。
これまではdocker hubからイメージをダウンロードしてきたが、次は自分でイメージを構築し、共有する。