Docker基本コマンドまとめ

![mono-horizontal.png](https://qiita-image-store.s3.amazonaws.com/0/282414/0c7354e5-d08c-9211-66ca-11b8eadc759e.png)

# やること
- Dockerの基本コマンドを使ってDockerに触れてみる。
- 主要なコマンド（イメージの操作、コンテナの操作）を利用してみる。

# 基本
Dockerの基本であるイメージ取得、コンテナ作成をしてみます。

## Dockerイメージ取得
```
docker image pull gihyodocker/echo:latest
```

## DockerイメージからDockerコンテナを作成する
```
docker container run -t -p 9000:8080 gihyodocker/echo:latest
```
- 9000ポートがホスト側。8080ポートがコンテナ側です。

## Dockerコンテナ停止
```
docker container stop $(docker container ls -q)
```
※ `docker container ls -q`で、コンテナのCONTAINER IDを取得します。



# 主要なコマンド（イメージの操作、コンテナの操作）

## docker image build コマンド
DockerfileをもとにDockerイメージを作成します。

```
docker image build -t 名前空間/イメージ名[:タグ名] Dockerfileのディレクトリパス
```
- `名前空間`: 他のイメージとの衝突回避の為に付けることを推奨。

|オプション|説明|
|---|---|
|-t|名前をつける。ほぼ必須のオプション。|
|-f|デフォルトのDockerfile以外を利用する場合に使用する。<br>Dockerfile-test を指定する場合: `-f Dockerfile-test` |
|--pull|`--pull=true`を指定すると`docker image build`時に`FROM`で指定したベースイメージを強制的に再取得する。latestなどで利用。<br>しかし、実際の運用ではビルド時間的に不利になる為、latestのベースイメージは避けられる傾向にある。|


## docker search コマンド
Docker Hubに登録されているDockerレジストリを検索します。
※Docker Hubとは、Dockerレジストリと呼ばれるたくさんのイメージを集権的に管理する為のDocker社が提供しているホスティングサービスです。

```
docker search [options] 検索キーワード
```
|オプション|説明|
|---|---|
|--limit|表示件数の制限。`--limit 5`で人気の上位5件が表示される|


## docker image pull コマンド
DockerレジストリからDockerイメージをダウンロードします。

```
docker image pull [options] リポジトリ名[:タグ名]
```
※タグ名は、Docker Hubに登録されているものを指定します。省略した場合は、デフォルトタグ（latestなど）が利用されます。


## docker image ls コマンド
`docker image pull` や `docker image build`でDockerホストに保持されたイメージを表示します。

```
docker image ls [options] [リポジトリ名[:タグ名]]
```

## docker image tag コマンド
Dockerタグを付けて、ある特定のイメージIDをもつDockerイメージを識別しやすくするために利用します。

```
docker image tag 元イメージ名:[:タグ名] 新イメージ名:[:タグ名]
```

## docker image push コマンド
DockerイメージをDocker Hubへ登録します。

```
docker image push [options] 名前空間/イメージ名:タグ名
```
`docker image push`は、自分の所有または、所属しているorganizationのリポジトリにしかできない為、名前空間を必要に合わせて変更する必要があります。

pushは、docker login コマンドでログインしてから実行します。
[公式サイト](https://hub.docker.com/)でアカウントを作成できます。

#### 名前空間の変更例
`docker image tag`コマンドで「example」を「zamax1016」に変更する場合

```
$ docker image tag example/echo:latest zamax1016/echo:latest

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
example/echo        latest              1111aaaabbbb        8 months ago        733MB
zamax1016/echo      latest              1111aaaabbbb        8 months ago        733MB
```


## docker container run コマンド
Dockerイメージからコンテナ作成、実行をします。

```
docker container run [options] イメージ名[:タグ名] [コマンド] [コマンド引数...]
```

#### ちょっと色々なパターン（オプション）で起動してみる

`-d` バックグラウンドで実行。

```
$ docker container run -d -p 9000:8080 example/echo:latest zamax1016/echo:latest
936d7131a0e11242788c7c8dc4a5affa4652feadc251a59f553427480daaa365
```


`--name` 名前を指定。
`-p` コンテナ側のポートのみ指定。ホスト側のポートは、自動的に割り振られる。

```
$ docker container run -d -p 8080 --name echo1 zamax1016/echo:latest
1f49a6e7912378ca1e8e6316ad2555e40e04e3dc8f048ff74e03313defee2741

$ docker container run -d -p 8080 --name echo2 zamax1016/echo:latest
e898ad44e2a6bae31f34aa2ebf8f8c03cd68aeef6e2fb64625104f8ce0b5e70e

$docker container ls
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                     NAMES
e898ad44e2a6        zamax1016/echo:latest   "go run /echo/main.go"   20 seconds ago      Up 19 seconds       0.0.0.0:32769->8080/tcp   echo2
1f49a6e79123        zamax1016/echo:latest   "go run /echo/main.go"   43 seconds ago      Up 42 seconds       0.0.0.0:32768->8080/tcp   echo1

$ curl http://localhost:32769
Hello Docker!!%

$ curl http://localhost:32768
Hello Docker!!%
```


`-i` コンテナ側の標準出力を表示し続ける。コマンド入力が可能。

```
$ docker image pull alpine:latest # コマンド入力の為、alpineを入れる
# -iで起動。
$ docker container run -i alpine:latest
# コマンド入力で標準出力が表示される。
echo test
test
```

`-t` ターミナル表示。

```
# -tで起動
$ docker container run -t alpine:latest
# ターミナルが表示された。コマンドを入力しても標準出力されない。
/ #
```

`-it` で起動してみると仮想環境にログインしたように利用できる。

```
$ docker container run -it alpine:latest
# ターミナルも表示され、コマンド入力で標準出力も表示される。
/ # echo test
test
/ #
```


## docker container ls コマンド
実行中のコンテナおよび終了したコンテナの一覧を表示する。

```
docker container ls [options]
```
|オプション|説明|
|---|---|
|-q|コンテナIDだけを表示する|
|--filter|`--filter "name=echo"`でechoを含む名前のコンテナを表示。<br>`--filter "ancestor=zamax1016/echo"`でzamax1016/echoを含むイメージを表示。|
|-a|終了したコンテナも含めて表示|


## docker container restart コマンド
一度停止したコンテナは、破棄されない限り`docker container restart`で再実行ができます。

```
docker container restart コンテナIDまたはコンテナ名
```


## docker container rm コマンド
停止したコンテナをディスクから完全に破棄します。

```
docker container rm コンテナIDまたはコンテナ名
```


## docker container exec コマンド
実行中のコンテナでコマンドを実行します。

```
docker container exec [options] コンテナIDまたはコンテナ名 コンテナで実行するコマンド
```


## docker container cp
コンテナとホスト間でのファイルのコピーができます。

```
# コンテナ→ホスト
docker container cp [options] コンテナIDまたはコンテナ名:コンテナ内のコピー元 ホストのコピー先

# ホスト→コンテナ
docker container cp [options] ホストのコピー先 コンテナIDまたはコンテナ名:コンテナ内のコピー元
```


## docker container prune コマンド
停止したコンテナを一括削除できます。

```
docker container prune [options]
```


## docker image prune コマンド
コンテナで実行していないイメージを一括削除できます。

```
docker image prune [options]
```


## docker system prune コマンド
利用されていないコンテナ、イメージ、ボリューム、ネットワークといった全てのDockerリソースを一括削除します。

```
docker system prune [options]
```


## docker container stats コマンド
利用状況の取得ができます。

```
docker container stats [options] [表示するコンテナID...]
```


# 参考文献
- [Docker/Kubernetes 実践コンテナ開発入門](https://blog.stormcat.io/post/publish-docker-book/)