はじめてのDocker for Windows - イメージの入手と削除、コンテナの生成から削除まで

来るべきRailsチュートリアルへの着手に向けて、はじめてDocker for Windowsなるものを使ってみました。その結果まとめです。

# Docker for Windowsのインストール

私の場合は、[Chocolatey](https://chocolatey.org/)経由でDocker for Windowsをインストールしました。Chocolateyを使ったアプリケーションのインストールを行う場合、Powershellに管理者権限が必要となります。

```:powershell
$ choco install docker-desktop
```

# Docker for Windowsがインストールされているか確認

Windows Powershellで以下のコマンドを実行します。管理者権限は必要ありません。

```:powershell
$ docker -v
```

Docker for Windowsが正しくインストールされていれば、実行結果は以下のようになります。

```:powershell
Docker version 18.09.2, build 6247962
```

バージョンが表示されていますね。

# Dockerイメージ

## Dockerイメージの入手 - nginx latest

```:powershell
$ docker pull nginx
```

実行結果は以下の通りになりました。

```:powershell
Using default tag: latest
latest: Pulling from library/nginx
fc7181108d40: Pull complete
d2e987ca2267: Pull complete
0b760b431b11: Pull complete
Digest: sha256:96fb261b66270b900ea5a2c17a26abbfabe95506e73c3a3c65869a6dbe83223a
Status: Downloaded newer image for nginx:latest
```

nginx latestのDockerイメージが正常に入手できたようです。

## Dockerイメージの一覧表示

```:powershell
$ docker image ls
```

`docker image ls`コマンドにより、現在Docker上に追加済みのDockerイメージを一覧表示することができます。

```:powershell
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              f68d6e55e065        6 days ago          109MB
```

nginx latestのイメージがDocker上にある状態です。

## Dockerイメージの削除

```:powershell
$ docker image rm
```

`docker image rm`コマンドにより、現在Docker上に追加済みのDockerイメージを削除することができます。

```:powershell
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              f68d6e55e065        6 days ago          109MB

$ docker image rm nginx
Untagged: nginx:latest
Untagged: nginx@sha256:96fb261b66270b900ea5a2c17a26abbfabe95506e73c3a3c65869a6dbe83223a
Deleted: sha256:f68d6e55e06520f152403e6d96d0de5c9790a89b4cfc99f4626f68146fa1dbdc
Deleted: sha256:1b0c768769e2bb66e74a205317ba531473781a78b77feef8ea6fd7be7f4044e1
Deleted: sha256:34138fb60020a180e512485fb96fd42e286fb0d86cf1fa2506b11ff6b945b03f
Deleted: sha256:cf5b3c6798f77b1f78bf4e297b27cfa5b6caa982f04caeb5de7d13c255fd7a1e
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
```
現在実行中のDocker上にDockerイメージはなくなりました。

# Dockerコンテナ

## Dockerコンテナの作成

```:powershell
$ docker run -d -p 80:80 --name webserver nginx
```

* `-d` コンテナをデタッチド・モード（バックグラウンド実行）で生成する
* `-p {ホスト側TCPポート}:{コンテナ側TCPポート}` ポート番号の指定
  * 今回は、ホスト側・コンテナ側ともTCP80番ポートを使用
* `--name {コンテナ名}` 生成するコンテナ名の指定
* 最後にイメージ名を指定する（今回は`nginx`）

このあとWebブラウザで`http://localhost`にアクセスしたら、nginxサーバーの初期画面がきちんと表示されました。

## Dockerコンテナの一覧表示

```:powershell
$ docker container ls
```

`-a`オプションなしの`docker container ls`は、現在実行中のコンテナの一覧を表示します。

例えば`webserver`という名前の`nginx`イメージによるコンテナがサービス実行中の場合、実行結果は以下のようになります。

```:powershell
$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
c36d096e5202        nginx               "nginx -g 'daemon of…"   13 seconds ago      Up 12 seconds       0.0.0.0:80->80/tcp   webserver
```

続いて`docker container ls -a`です。

```:powershell
$ docker container ls -a
```

`docker container ls -a`は、実行中・停止中問わず、現在自環境上に存在するコンテナの一覧を表示します。

例えば`webserver`という名前の`nginx`イメージによるサービス停止中のコンテナが存在する場合、実行結果は以下のようになります。

```:powershell
$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
c36d096e5202        nginx               "nginx -g 'daemon of…"   46 seconds ago      Exited (0) 4 seconds ago                       webserver
```

4秒前に正常に停止されたという状態も表示されていますね。

## Dockerコンテナのサービス停止

```:powershell
$ docker container stop webserver
```

`docker container stop {コンテナ名}`コマンドにより、Dockerコンテナを削除することなくサービス停止することができます。上記コマンドは、`webserver`という名前のdockerコンテナのサービスを停止するコマンドです。

```:powershell
$ docker container start webserver

$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
c36d096e5202        nginx               "nginx -g 'daemon of…"   13 seconds ago      Up 12 seconds       0.0.0.0:80->80/tcp   webserver

$ docker container stop webserver
webserver

$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                     PORTS               NAMES
c36d096e5202        nginx               "nginx -g 'daemon of…"   About a minute ago   Exited (0) 2 seconds ago                       webserver
```

一連の動作は以上のようになります。

## Dockerコンテナの削除

```:powershell
$ docker container rm webserver
```

`docker container rm {コンテナ名}`コマンドにより、Dockerコンテナを完全に削除することができます。上記コマンドは、`webserver`という名前のdockerコンテナのサービスを削除するコマンドです。

```:powershell
$ docker container stop webserver
webserver

$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                     PORTS               NAMES
c36d096e5202        nginx               "nginx -g 'daemon of…"   About a minute ago   Exited (0) 2 seconds ago                       webserver

$ docker container rm webserver
webserver

$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

全体としての実行結果は、以上のようになります。