《滅びの呪文》Docker Composeで作ったコンテナ、イメージ、ボリューム、ネットワークを一括完全消去する便利コマンド

本稿ではdocker-composeで作られた、コンテナ、イメージ、ボリューム、ネットワークそして未定義コンテナ、全てを一括消去するコマンドを説明する。

## 一括消去するコマンド `docker-compose down`

```bash
docker-compose down --rmi all --volumes --remove-orphans
```

実行結果の例

```
Stopping my-php-app_app_1 ... done
Stopping my-php-app_db_1  ... done
Removing my-php-app_app_1 ... done
Removing my-php-app_db_1  ... done
Removing network my-php-app_default
Removing volume my-php-app_mysqldata
Removing image mysql:8
Removing image php:7-apache
```

## `docker-compose down`の説明

```bash:先程のコマンド再掲
docker-compose down --rmi all --volumes --remove-orphans
```

`down`コマンドの特性としては、`up`コマンドと真逆のことをするコマンドということになる。つまり、`up`コマンドで作られうるもの(イメージ、コンテナ、ボリューム、ネットワーク)をすべて削除する。

`--rmi`オプションは、削除するイメージの種類を指定する。`all`はすべてのイメージ。`local`はフィールドにカスタムタグのないイメージのみを削除する。`--rmi`オプションを省略すると、イメージは消されない。

`--volumes`オプションは、`docker-compose.yml`の`volumes`セクションに書かれた名前付きボリュームとコンテナにアタッチされたanonymous volumeが削除される。

` --remove-orphans`オプションは、`docker-compose.yml`で定義から削除されたサービス用の未定義コンテナも削除される。

これら3つのオプションをつけないと、削除されるのはコンテナとネットワークだけとなる。

* 公式サイトによる解説: [docker-compose down | Docker Documentation](https://docs.docker.com/compose/reference/down/)

## `docker-compose down`の使いみち

`docker-compose down`の使いみちとしては「開発環境を一旦クリーンにして、ゼロから作り直したい」が多いと思う。

・・・

今まで、開発環境をリセットするために`docker-compose stop`して`docker-compose rm`、`docker rmi`、`docker volume rm`のあわせ技で対応していたとしたら、ここで紹介したコマンドは代替手段としてとても役に立つと思う。

## `docker-compose down`体験ワークショップ

`docker-compose down`を手元の環境で体験したい場合は、まず次の内容で`docker-compose.yml`を作成してほしい。

```docker-compose.yml
version: '3.7'

services:
  app:
    image: php:7-apache
    depends_on:
      - db
  db:
    image: mysql:8
    volumes:
      - mysqldata:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root

volumes:
  mysqldata:
    driver: local
```

次に、`docker-compose up -d`で普段どおりに起動をかける。

```shell-session
$ docker-compose up -d

Creating network "my-php-app_default" with the default driver
Creating volume "my-php-app_mysqldata" with local driver
Pulling db (mysql:8)...
8: Pulling from library/mysql
Digest: sha256:01cf53f2538aa805bda591d83f107c394adca8d31f98eacd3654e282dada3193
Status: Downloaded newer image for mysql:8
Pulling app (php:7-apache)...
7-apache: Pulling from library/php
Digest: sha256:205073d982746d818c3a1a546b918a4d24368a2a8cb53477ac3224efee3390d0
Status: Downloaded newer image for php:7-apache
Creating my-php-app_db_1 ... done
Creating my-php-app_app_1 ... done
```

ここで、`docker-compose ps`したり、`docker-compose images`、`docker volume ls`、`docker network ls`などを実行してみて、イメージやボリュームが作られていることを確認してほしい。

そうしたら今度は`docker-compose down --rmi all --volumes`を実行して、`up`で作られたものを一括削除してみよう。

```shell-session
$ docker-compose down --rmi all --volumes

Stopping my-php-app_app_1 ... done
Stopping my-php-app_db_1  ... done
Removing my-php-app_app_1 ... done
Removing my-php-app_db_1  ... done
Removing network my-php-app_default
Removing volume my-php-app_mysqldata
Removing image mysql:8
Removing image php:7-apache
```

削除が終わったら、先程やったようにイメージやボリュームのリストを出してみて、完全消去されていることを確認してみよう。

## 所感

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">docker-composeで<br><br>・コンテナ止める<br>・ネットワーク削除する<br>・ボリューム削除する<br>・イメージ削除する<br><br>って<br><br>docker-compose down --rmi all --volumes<br><br>で一括してできたのね。<br><br>こんな便利な「滅びの呪文」があるなんて知らなかった。<br><br>いちいち stop, rm などしてた……😢</p>&mdash; suin❄️TypeScriptが好き (@suin) <a href="https://twitter.com/suin/status/1168742981236510721?ref_src=twsrc%5Etfw">September 3, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

---

最後までお読みくださりありがとうございました。Twitterでは、Qiitaに書かない技術ネタなどもツイートしているので、よかったらフォローお願いします:relieved:→[Twitter@suin](https://twitter.com/suin)