Dockerの基本操作をCentOS 7で確認 その2 〜現在の状態を確認する 〜

[前回](http://qiita.com/smile-0yen/items/c6957b951ca0fdb8acc7)はインストールからイメージの取得、`docker run`コマンドによる起動を行いました。
今回も引き続きCentOS 7.0でUbuntuのコンテナを動かしながら動作を見ていきます。
テーマは**現在の状態確認**です。

## Docker本体の情報を見る

### バージョン情報
まずはrpmパッケージのバージョン情報を確認します。

```
$ rpm -q docker
docker-1.3.2-4.el7.centos.x86_64
```

Dockerパッケージでインストールされるファイルの一覧が見たいときは次のようにします。

**実行例**

```
$ rpm -ql docker
```

**実行例結果**

```
/etc/docker/certs.d
/etc/sysconfig/docker
/etc/sysconfig/docker-storage
/etc/udev/rules.d
/etc/udev/rules.d/80-docker.rules
/usr/bin/docker
(以下略)
```

個々のコンポーネント(Client, Server)やGoのバージョンなど、詳細は`docker version`コマンドで確認です。

**実行例**

```
$ sudo docker version
```

**実行例結果**

```
Client version: 1.3.2
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): 39fa2fa/1.3.2
OS/Arch (client): linux/amd64
Server version: 1.3.2
Server API version: 1.15
Go version (server): go1.3.3
Git commit (server): 39fa2fa/1.3.2
```

### 起動設定/状態確認

CentOS 7では次のように起動設定と現在の状態を確認します。

**実行例**

```
$ systemctl status docker.service
```

**実行例結果**

```
docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
   Active: active (running) since 月 2014-12-29 16:29:50 UTC; 1 weeks 6 days ago
     Docs: http://docs.docker.com
 Main PID: 857 (docker)
   CGroup: /system.slice/docker.service
           ├─  857 /usr/bin/docker -d --selinux-enabled -H fd://
           ├─22958 docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 49153 -container-ip 172.17.0.60 -container-port 29015
           ├─22966 docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 49154 -container-ip 172.17.0.60 -container-port 8080
           ├─22974 docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 49155 -container-ip 172.17.0.60 -container-port 28015
           └─23262 docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.61 -container-port 8080
``` 

| 項目 | 説明 |
|:----|:----|
| Loaded | Dockerがサーバ起動時に自動実行されるように設定されていれば`enabled`になります。|
| Active | 現在稼働中であれば`active (running)`と表示され、起動した日時と<br>トータルの起動時間が表示されます。 |
| Main PID | デーモンの親プロセスのPIDです。 |
| CGROUP   | 起動中のプロセス。ここを見れば現在の起動オプションを確認できます。 |

もし起動オプションを変更したくなったら`/etc/sysconfig/docker`を編集して再起動します。
今回のバージョン(docker-1.3.2)ではデフォルトで次の設定が入っていました。
（当然ですが）上記で`systemctl status`から確認したオプションと同じです。

```
# /etc/sysconfig/docker

# Modify these options if you want to change the way the docker daemon runs
OPTIONS=--selinux-enabled -H fd://

# Location used for temporary files, such as those created by
# docker load and build operations. Default is /var/lib/docker/tmp
# Can be overriden by setting the following environment variable.
# DOCKER_TMPDIR=/var/tmp
```

## [全体] Dockerコンテナの情報を見る

### docker info

**実行例**

```
$ sudo docker info
```

**実行例結果**
現在のコンテナ数やその元となるイメージ数、データの格納先(Data file)とdisk使用量などを確認できる。

```
$ sudo docker info
Containers: 7
Images: 33
Storage Driver: devicemapper
 Pool Name: docker-253:1-134297046-pool
 Pool Blocksize: 65.54 kB
 Data file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
 Data Space Used: 1.464 GB
 Data Space Total: 107.4 GB
 Metadata Space Used: 2.507 MB
 Metadata Space Total: 2.147 GB
 Library Version: 1.02.84-RHEL7 (2014-03-26)
Execution Driver: native-0.2
Kernel Version: 3.10.0-123.el7.x86_64
Operating System: CentOS Linux 7 (Core)
```

### docker ps

現在起動中のコンテナ一覧を確認するには`docker ps`を実行します。

**実行例**

```
$ sudo docker ps
```

**実行例結果**
＊もし1つも起動しているコンテナがなければ何も返ってきません。

```
CONTAINER ID        IMAGE                       COMMAND                CREATED             STATUS              PORTS                                                                         NAMES
341d035f815d        shipyard/shipyard:2.0.6     "/app/controller"      12 days ago         Up 12 days          0.0.0.0:80->8080/tcp                                                          shipyard
e8f226ce407c        shipyard/rethinkdb:latest   "/usr/bin/rethinkdb    12 days ago         Up 12 days          0.0.0.0:49153->29015/tcp, 0.0.0.0:49154->8080/tcp, 0.0.0.0:49155->28015/tcp   shipyard-rethinkdb
df01795a4f22        shipyard/rethinkdb:latest   "/bin/bash -l"         12 days ago         Up 12 days          28015/tcp, 29015/tcp, 8080/tcp                                                shipyard-rethinkdb-data
```
| 項目 | 説明 |
|:----|:----|
|CONTAINER ID | 特定のコンテナを表す一意なhash値です。|
| IMAGE | 起動時に元としたイメージです。前回`docker image`コマンドで見た<br>REPOSITORYとTAGがコロン「:」で接続されて一つの欄に表示されます。|
| COMMAND | `docker run`で起動時に与えた実行コマンドです。 |
| CREATED | 起動時からの経過時間が表示されます。 |
| STATUS  | 現在のステータスです。`docker ps`(オプションなし)では起動中のコンテナのみが<br>表示されるためすべてUPになります。|
| PORTS   | `docker run`で起動時に指定したポートフォワーディングの設定です。<br>＜コンテナ内ポート＞ -> ＜親ホストポート＞ の形式で表示されます。|

終了したコンテナを含めた全てのコンテナを確認するには`-a`オプションを付けます。

**実行例**

```
$ sudo docker ps -a
```

**実行例結果**
今度はすでに終了した(STATUSがExited)のコンテナも表示されました。

```
CONTAINER ID        IMAGE                       COMMAND                CREATED             STATUS                    PORTS                                                                         NAMES
341d035f815d        shipyard/shipyard:2.0.6     "/app/controller"      12 days ago         Up 12 days                0.0.0.0:80->8080/tcp                                                          shipyard
e8f226ce407c        shipyard/rethinkdb:latest   "/usr/bin/rethinkdb    12 days ago         Up 12 days                0.0.0.0:49153->29015/tcp, 0.0.0.0:49154->8080/tcp, 0.0.0.0:49155->28015/tcp   shipyard-rethinkdb
df01795a4f22        shipyard/rethinkdb:latest   "/bin/bash -l"         12 days ago         Up 12 days                28015/tcp, 29015/tcp, 8080/tcp                                                shipyard-rethinkdb-data
a9b880a205be        fedora:latest               "/bin/python -m Simp   12 days ago         Exited (-1) 12 days ago                                                                                 my_webserver2
```

## [個別] Dockerコンテナの情報を見る

### docker top

個々のコンテナ内でどんなプロセスが立ち上がっているかを確認するには`docker top`を使います。
`docker top <コンテナID> <psオプション>`の形式で実行し、psオプションにはLinuxで`ps`コマンドが
取れるオプションを指定します。（ややこしいですが`ps`はシステム上のコンテナ一覧取得に
使ってしまっているのでこうなったのでしょう。）

**実行例**

```
$ sudo docker top df01795a4f22 -ax
```

**実行例結果**

```
PID                 TTY                 STAT                TIME                COMMAND
22897               pts/1               Ss+                 0:00                /bin/bash -l
```

### docker logs

`docker logs`コマンドを用いることでattachモードで起動していなくともコンテナ内で
出力されたログを確認することができます。指定可能なオプションは3つです。

| オプション | 説明 |
|:----|:----|
| -f, --follow | `tail -f`と同じように出力を待ち受けます。`Ctrl + c`で停止します。<br> attachモードとは違い`Ctrl + c`で切ってもコンテナは起動したままです。 |
| -t, --timestamps  | 出力と一緒にタイムスタンプを表示します。 |
| --tail="<行数>" | 末尾から指定行数分の出力を表示します。 | 

**実行例**

```
$ sudo docker logs -t --tail=3 341d035f815d
```

**実行例結果**

```
2015-01-13T05:43:11.857589182Z INFO[0000] shipyard version 2.0.6
2015-01-13T05:43:12.860659123Z INFO[0001] checking database
2015-01-13T05:43:12.872346882Z INFO[0001] controller listening on :8080
```

### docker exec

docker 1.3以降から`exec`コマンドが追加されました。`exec`を利用すれば起動中の
コンテナ内でコマンドを実行できるため状態確認にも使うことができます。
実行形式は`docker exec <コンテナID> <オプション> <コマンド>`です。

指定可能なオプションは3つのみです。それぞれ`run`コマンドと同じ意味を持っています。

| オプション | 説明 |
|:----|:----|
| -d, --detach | バックグラウンドで実行する。 |
| -i, --interactive=true| 対話モードで実行する。（標準入力をopenし続ける) |
| -t, --tty | 擬似端末を起動する。 | 

**実行例**

```
$ sudo docker exec -i e8f226ce407c ps -ax
```

**実行例結果**

```
  PID TTY      STAT   TIME COMMAND
    1 ?        Ssl+  25:12 /usr/bin/rethinkdb --bind all
    6 ?        S      0:00 /usr/bin/rethinkdb --bind all
   77 ?        R      0:00 ps -ax
```

さらにシェルを起動すれば、コンテナ内に入ることも可能です。

**実行例**

```
$ sudo docker exec -it e8f226ce407c /bin/bash
```

**実行例結果**
コンテナ内に入れば任意のコマンドを実行できます。起動中のコンテナに変更を加えることも可能です。

```
root@e8f226ce407c:/data# hostname
e8f226ce407c
root@e8f226ce407c:/data# ls
rethinkdb_data
```

## まとめ

Docker利用にあたって現在のシステム情報やコンテナの状態を確認するには次のコマンドを使用できます。

**Docker本体**

|目的 | コマンド |
|:----|:-----|
| 起動設定、起動中のプロセス確認 |  systemctl status docker.service |
| Dockerの各コンポーネントバージョン確認 |  sudo docker version|

**コンテナ全体**

|目的 | コマンド |
|:----|:-----|
| コンテナとイメージの総数、disk使用量などの確認 |  sudo docker info |
| コンテナの起動イメージ、実行コマンド、<br>現在のステータス（UP, Exited） 確認 | sudo docker ps (-a) |

**個別コンテナ内**

|目的 | コマンド |
|:----|:-----|
|プロセス確認<br>（コンテナ内での`ps`実行に相当）| sudo docker top <コンテナID> <psオプション> | 
| ログ確認  | sudo docker logs <オプション> <コンテナID> |
| 任意コマンド実行<br>（シェルも起動可能）| sudo docker exec <コンテナID> <オプション> <コマンド> |