さわっておぼえるDocker入門🐳#1（コンテナを作ったり壊したり）

# はじめに

とにかくクジラ🐳がかわいいですよね。
Dockerを触りながら基本をさらっていきましょう。


# 目的

**Dockerを触りながら、どんなことができるのか確認する**

コンテナを起動したり、削除したりしながら、コンテナに慣れていきたいと思います。

今回は

- コンテナの起動
- コンテナの一覧を取得
- コンテナのログを確認
- コンテナを削除

していきます。


# 環境

- macOS Mojave 10.14.6
- Docker engine 19.03.5


# まずはDockerのインストール

https://www.docker.com/


# コンテナを作ったり壊したりしてみる


## `container run`

以下のコマンドでnginxサーバーのコンテナが起動します。
ブラウザで`localhost`にアクセスすることで、サーバーが立ち上がっていることを確認することができます。

```bash
docker container run --publish 80:80 nginx
```


- `docker container run`は、新しいコンテナを起動するコマンドです。
- `--publish`は、ローカルポートを開きます。
- `nginx`は、ここではイメージ名です。

### メモ

- この時、イメージがローカルにない場合には、`Docker Hub`というサービスから自動でダウンロードされます。ちなみにダウンロードされるのは最新のパッケージです。
- `--publish`オプションを指定しない場合は、どのポートも開かれません。
- `80:80`はもちろん`80（ホストのポート）：80（コンテナのポート）`です。ホストの80番ポートへの通信は全てコンテナのポートへ転送しています。
- http通信のポートは80を使用することが多いので`80:80`を指定していますが、例えば`8080:80`としてホストで待ち受けるポート番号に`8080`を指定しても問題ありません。


### プロセスを終了する時
もちろん、**`ctrl + C`**でプロセスを終了できます。


## `--detach`

今度は、`--detach`というオプションをつけて実行しました。
このオプションを付け加えることで、バックグランドでコンテナプロセスが実行されます。つまり、コンテナを実行した後も、ターミナルは別のコマンドを受け付ける状態になっています。

```bash
docker container run --publish 80:80 --detach nginx
```

コマンドを実行した時に表示されるのは、起動したコンテナのIDです。

```bash
$ docker container run --publish 80:80 --detach nginx
#コンテナID: 19773d0f7ab574f9e7a9ba47df86426787ea865c0e7610dfc67b7b5fb1c50e52
```


## `docker container ls`

起動中のコンテナの一覧を取得します。

```bash
container ls
```


## `container ls -a`

全てのコンテナの一覧を取得します。

```bash
docker container ls -a
```

以下のように、コンテナの情報が取得できます。

```bash
docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
19773d0f7ab5        nginx               "nginx -g 'daemon of…"   13 minutes ago      Exited (0) 3 minutes ago                        optimistic_lovelace
704100449b0c        nginx               "nginx -g 'daemon of…"   27 minutes ago      Exited (0) 14 minutes ago                       flamboyant_jennings
```

## `--name`

`container run`して起動したコンテナには、自動で名前がつけられています。
先ほど`ls`コマンドで確認した情報の`name`の列から確認できます。

`--name`オプションを使用することで、自由に名前をつけることができます。

```bash
docker container run --publish 80:80 --detach --name webhost nginx
```

`ls`コマンドで確認すると、確かに指定した名前が確認できます。

```bash
docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
00b50a6ae905        nginx               "nginx -g 'daemon of…"   6 seconds ago       Up 4 seconds        0.0.0.0:80->80/tcp   webhost
```


## `container stop`

コンテナを停止するには、`stop`コマンドにコンテナIDを指定します。

```bash
docker container stop 19773
```

指定するIDは、全部打ち込まなくても一意であれば補完してくれます。

`ls`コマンドで、本当にコンテナが停止したかどうか確認できます。



## `container logs`

指定したコンテナのログを取得します。
以下では、先ほど名前つきで起動した`webhost`コンテナのログを取得しています。

```bash
docker container logs webhost
```

## `container top`

起動中コンテナのプロセスを確認できます。


```bash
docker container top webhost
PID                 USER                TIME                COMMAND
2384                root                0:00                nginx: master process nginx -g daemon off;
2426                101                 0:00                nginx: worker process
```

今回のnginxコンテナの場合は、マスタープロセスとワーカープロセスが走っていることが確認できました。


## `container rm`

使わないコンテナを削除します。

まずは`ls -a`コマンドで、全てのコンテナを確認し、その後全て削除してみます。

```bash
docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                NAMES
00b50a6ae905        nginx               "nginx -g 'daemon of…"   9 minutes ago       Up 9 minutes                0.0.0.0:80->80/tcp   webhost
19773d0f7ab5        nginx               "nginx -g 'daemon of…"   30 minutes ago      Exited (0) 20 minutes ago                        optimistic_lovelace
704100449b0c        nginx               "nginx -g 'daemon of…"   44 minutes ago      Exited (0) 30 minutes ago                        flamboyant_jennings
```

3つのコンテナが起動中です。これらを`rm`コマンドで全て削除します。

rm の引数には、コンテナIDを一気に3つ指定していますが、例によってIDは全桁を入力する必要はありません。最初の3桁だけでも削除できます。

```bash
docker rm 00b 197 704
197
704
Error response from daemon: You cannot remove a running container 00b50a6ae90511bf80bece7ebbca5dadcabde96d0481c61ec0fb1d572bb1a1d7. Stop the container before attempting removal or force remove
```

ID`197`とID`704`は削除できたようですが、同時にエラーメッセージが出ました。

**起動中のコンテナは削除できない**ことがエラーの理由です。

## `container rm -f`

`-f`オプションをつけることで、起動中のコンテナも強制削除することができます。

```bash
docker container rm -f 00b 
```

これで全てのコンテナを削除できました。


# まとめ

本当に簡単なコマンドで、

- コンテナ起動したり、
- コンテナの一覧を取得したり、
- コンテナのログを確認したり、
- コンテナを削除したり

できました。