2
1

More than 3 years have passed since last update.

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

Posted at

はじめに

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

[Docker] Ruby2.7.2 / Rails6.0.3 / MySQL8.0の開発環境構築できたメモ

サーバー接続時や、コンテナ起動時に時間を要しすぎる状況だったので、
改善のために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 で上書きし永続化から外す

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を爆速にする

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

  • docker system df コマンド
    • dockerデーモンが使用するディスク容量に関する情報を表示
    • クライアントとデーモンのAPIが両方とも1.25以上で使える(docker versionコマンドで調べる)
    • 公式ドキュメント(docker system df)

①docker のディスク使用量を表示

ターミナル
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

②より詳細情報を表示

ターミナル
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を削除

ターミナル
docker volume prune    #未使用volume(どのコンテナからも参照されていないvolume)を削除

rails db:seed_fu コマンドを何度か実行していると、volumeが100個を超えていました。
このコマンドで14個にまで減りました!軽量化できてたらいいな。。

公式ドキュメント(docker volume prune)

④ビルドキャッシュを削除する

docker builder prune

公式ドキュメント(docker builder prune)

⑤いろいろ削除する

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

公式ドキュメント(docker system prune)

3. 初期データ投入方法

Railsデフォルトのseedではなく、seed-fuというgemを使う

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

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

db / fixtures / development /shop.rb
db / fixtures / development /area.rb
ターミナル
rails db:seed_fu FILTER=shop.rb      #選択したファイルのみDBへ反映される
実行結果
== Filtering seed files against regexp: /shop.rb/
...
ターミナル
rails db:seed_fu      #これだと全てのファイルがDBへ反映される

Railsでseed-fuを使って初期データを作ろう!
[gem]seed-fuの特定ファイルだけ実行

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

さいごに

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1