知っておくと便利なDocker操作・コマンド

（こちらは、[さくらインターネットアドベントカレンダー2019](https://qiita.com/advent-calendar/2019/sakura) 1日目の投稿です。意外と知られてなさそうな操作方法やコマンドを紹介します。 ）

# 概要

[Docker](https://www.docker.com/) を日常で利用するにあたり、操作が便利になる方法や、コマンド、考え方です。他にも思いついたら、また追加していきます。

## Tips

### コンテナ ID やイメージ ID などに対する操作は前方一致

各コンテナやイメージ、ネットワーク、ボリュームには、ユニークな 64 文字の ID が割り振られています。

`docker` コマンドで、コンテナ ID 等を指定時、すべてのコンテナ ID を入力する必要はありません。 Docker は内部で **前方一致** する対象を自動的に判別します。

たとえば、 `docker ps` で次のコンテナが表示されるとします。

```bash
# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
66015a77c86e        nginx               "nginx -g 'daemon of…"   5 seconds ago       Up 4 seconds        80/tcp              sleepy_carson
```

この時、このコンテナを停止するには `docker kill 66015a77c86e` （コンテナのショートIDを指定）、または `docker kill sleepy_carson` のようにコンテナ名を指定します。

ですが、 `docker kill 6` のみでも停止できます。ただし、他にも前方一致するコンテナが存在しない場合です。

```
# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
66015a77c86e        nginx               "nginx -g 'daemon of…"   5 seconds ago       Up 4 seconds        80/tcp              sleepy_carson
6dfe781fb0d3        nginx               "nginx -g 'daemon of…"   8 seconds ago       Up 7 seconds        80/tcp              beautiful_pasteur
```

ここでは、 `6` で始まるコンテナ ID が複数ある場合に `docker kill 6` を実行すると、エラー `Error response from daemon: Cannot kill container: 6: Multiple IDs found with provided prefix: 6` と表示されます（前方一致するる複数のコンテナ ID が存在するという内容）。

このような場合もありますので、 `docker kill 660` のように、3文字くらい普段から入力する癖をつけておくと、毎回コンテナ ID をコピー＆ペーストする必要がないので便利です。


### docker system df で容量表示

Docker コンテナ、イメージやネットワーク、ボリュームでどれだけホスト上の容量を使用しているかを調べるコマンドです。

```bash

# docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              2                   1                   345.4MB             219.6MB (63%)
Containers          2                   0                   4B                  4B (100%)
Local Volumes       0                   0                   0B                  0B
Build Cache         0                   0                   0B                  0B
```

## 環境のクリーンアップ

### docker system prune コマンド

`docker system prune` コマンドを実行すると、以下のリソースをまとめて削除します。

- すべての停止中のコンテナ
- コンテナに使用されていないネットワーク
- ビルドで用いられｒ中間イメージとビルド・キャッシュ

確認のプロンプトで `y` を入力すると、不要なものをまとめて削除してくれます。

### docker system prune 対象外のものを全部消すには

すべてのコンテナ、イメージを削除するには、複数のコマンドを組み合わせます。稼働中のコンテナをすべて強制停止(kill)し、不要なネットワークやボリュームを削除した後、すべてのイメージを削除します。

```bash
# docker kill $(docker ps -q)
# docker system prune -f && docker rmi -f $(docker images -aq)
```



## Docker セットアップ

### 簡単な Docker Engine のセットアップ(Linux)と覚え方

インストール方法は、 https://get.docker.com/ というホスト名だけを覚えておきます。表示されるページは、Docker を児童インストールするシェルスクリプトです。そのため、をブラウザや `curl` などで開くと、Docker をインストールするコマンドが確認できます。

```
# This script is meant for quick & easy install via:
#   $ curl -fsSL https://get.docker.com -o get-docker.sh
#   $ sh get-docker.sh
```

あとは、root 権限や sudo で `sh get-docker.sh` を実行するだけで、各ディストリビューションに対応した Docker Engine のリポジトリ設定と、最新安定版の Docker Engine を自動的に設定します。

CentOS 7、Fedora、Ubuntu、Debian に対応しています。

#### CentOS 7 の場合

このスクリプトを使っても Docker デーモンは自動起動しないため、 `systemctl` で Docker Engine の起動と、サーバ起動後は自動的にサービスを起動するコマンドを実行します。

```bash
# systemctl start docker
# systemctl enable docker
```


# 参考情報

- [Docker 公式ドキュメント（英語）](https://docs.docker.com/)
- [コマンドライン・リファレンス（英語）](https://docs.docker.com/engine/reference/commandline/docker/)