[Docker]サーバー接続やコンテナ起動が遅いので、軽量化したい

#はじめに

**前提**：以下の記事どおりに環境構築をしてポートフォリオアプリを作成中です

>[[Docker] Ruby2.7.2 / Rails6.0.3 / MySQL8.0の開発環境構築できたメモ](https://qiita.com/ayalikesweb/items/4167c8a8e40441b10cfe)


**サーバー接続時**や、**コンテナ起動時**に時間を要しすぎる状況だったので、
改善のためにMac、Dockerに対して試してみたことを記します。（自分用メモ）


- 「そもそも環境構築が原因だよ！」
- 「ここも確認しておきなよ！」

そんなご意見ありましたら、教えていただけると幸いです。

#結論 「試したこと」
- PC **再起動**
- 不要なディレクトリを **docker volume** から外す
- 不要な **dockerコンテナ** や **ボリューム** を削除する！
- **初期データ変更**時は、変更部分のみDB反映させる

#環境
- macOS Catalina
- Docker version 20.10.2
- docker-compose version 1.27.4

 （その他は上記リンクの環境です）


#MacBookの容量

- `アクティビティモニタ` で **CPU** や **メモリ** の確認
- とりあえず再起動してみる

#Docker

##1. **docker-compose.yml** の記述を見直す

マウント不要なディレクトリを **Anonymous Volume** で上書きし永続化から外す

```r:docker-compose.yml
web:
    build:
    env_file:
    command:
    volumes:
      - .:/myapp
      - bundle-data:/usr/local/bundle
       
      #-------以下を追記-------
      # 1. exclude volumes
      - /app/vendor
      - /app/tmp
      - /app/log
      - /app/.git
```
> [docker-composeを爆速にする](https://qiita.com/shotat/items/57d049793605ffc20135)


##2. Dockerディスクの使用状況確認

- `docker system df` コマンド
 - dockerデーモンが使用するディスク容量に関する情報を表示
 - クライアントとデーモンのAPIが両方とも1.25以上で使える（`docker version`コマンドで調べる）
 - [公式ドキュメント（docker system df）](https://docs.docker.com/engine/reference/commandline/system_df/)

###①docker のディスク使用量を表示
```ruby:ターミナル
docker system df
```
```
TYPE               TOTAL      ACTIVE     SIZE         RECLAIMABLE
Images             5          2          16.43 MB     11.63 MB (70%)
Containers         2          0          212 B        212 B (100%)
Local Volumes      2          1          36 B         0 B (0%)
Build Cache        0          0          0B           0B
```

###②より詳細情報を表示
```ruby:ターミナル
docker system df -v
```

```
Images space usage:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE                SHARED SIZE         UNIQUE SIZE         CONTAINERS
my-curl             latest              b2789dd875bf        6 minutes ago       11 MB               11 MB               5 B                 0
my-jq               latest              ae67841be6d0        6 minutes ago       9.623 MB            8.991 MB            632.1 kB            0
<none>              <none>              a0971c4015c1        6 minutes ago       11 MB               11 MB               0 B                 0
alpine              latest              4e38e38c8ce0        9 weeks ago         4.799 MB            0 B                 4.799 MB            1
alpine              3.3                 47cf20d8c26c        9 weeks ago         4.797 MB            4.797 MB            0 B                 1

Containers space usage:

CONTAINER ID        IMAGE               COMMAND             LOCAL VOLUMES       SIZE                CREATED             STATUS                      NAMES
4a7f7eebae0f        alpine:latest       "sh"                1                   0 B                 16 minutes ago      Exited (0) 5 minutes ago    hopeful_yalow
f98f9c2aa1ea        alpine:3.3          "sh"                1                   212 B               16 minutes ago      Exited (0) 48 seconds ago   anon-vol

Local Volumes space usage:

NAME                                                               LINKS               SIZE
07c7bdf3e34ab76d921894c2b834f073721fccfbbcba792aa7648e3a7a664c2e   2                   36 B
my-named-vol                                                       0                   0 B

Build cache usage: 0B

CACHE ID   CACHE TYPE   SIZE      CREATED   LAST USED   USAGE     SHARED
```

###③不要なLocal Volumesを削除
```ruby:ターミナル
docker volume prune    #未使用volume（どのコンテナからも参照されていないvolume）を削除
```
`rails db:seed_fu` コマンドを何度か実行していると、volumeが100個を超えていました。
このコマンドで14個にまで減りました！軽量化できてたらいいな。。

> [公式ドキュメント（docker volume prune）](https://docs.docker.com/engine/reference/commandline/volume_prune/)


###④ビルドキャッシュを削除する
```
docker builder prune
```
> [公式ドキュメント（docker builder prune）](https://docs.docker.com/engine/reference/commandline/builder_prune/)


###⑤いろいろ削除する
```ruby:ターミナル
docker container prune     #停止コンテナを一括削除
docker image prune     #未使用のイメージを一括削除
docker network prune     #未使用のネットワークを一括削除
docker system prune     #未使用のコンテナ、イメージ、ネットワークを一括削除
```

>[公式ドキュメント（docker system prune）](https://docs.docker.com/engine/reference/commandline/system_prune/)



##3. 初期データ投入方法
Railsデフォルトの`seed`ではなく、`seed-fu`というgemを使う

- テーブル別にファイル管理ができる
- 初期データを変更した際、該当ファイルのみDBへ反映できる

seed-fuに関するファイルが複数ある場合、

```
db / fixtures / development /shop.rb
db / fixtures / development /area.rb
```
```r:ターミナル
rails db:seed_fu FILTER=shop.rb      #選択したファイルのみDBへ反映される
```

```:実行結果
== Filtering seed files against regexp: /shop.rb/
...
```

```r:ターミナル
rails db:seed_fu      #これだと全てのファイルがDBへ反映される
```
>[Railsでseed-fuを使って初期データを作ろう！](https://bagelee.com/programming/make-data-with-seed-fu/)
[[gem]seed-fuの特定ファイルだけ実行](http://cojirooo777.blog.fc2.com/blog-entry-30.html)

変更してない初期データまで反映してしまうと、不要なdocker volumeが増えてしまうかな？と感じただけです。実際にはよく分かりません。
**完成した**初期データを投入し、変更しないのが一番効率的だと思います。


#さいごに
見えない部分に無駄なものが溜まっているのでしょうか？
**遅くなる原因になり得そうなもの**を一つ一つ潰していく作戦を実行しています。
どの処理がどの程度効果があるのか分かりませんが、とりあえず重くて動かない現象は無くなりました。
新策が増えたら追加します。改善策あれば教えてください。