DockerのDBコンテナを高速化(こうそくか)する

Docker上でPHPUnitを回(まわ)してたら滅茶苦茶(めちゃくちゃ)遅(おそ)かったので 何(なに)か高速化(こうそくか)する方法(ほうほう)がないか調(しら)べたときの副産物(ふくさんぶつ)です。

DBのファイルをメモリ上(じょう)に格納(かくのう)させる

tmpfs を使用(しよう)することでホストのメモリをコンテナのストレージとしてマウントできます。
要(よう)はRAMディスクなので、当然(とうぜん) volume と違(ちが)ってデータの永続化(えいぞくか)はできないです。
Docker Compose での指定(してい)の仕方(しかた)はPostgreSQLを例(れい)にすると下記(かき)の通(とお)りです。

version: '3.7'

services:
  postgres-test:
    image: postgres
    environment:
      TZ: Asia/Tokyo
    tmpfs:
        - /var/lib/postgreql/data

実際(じっさい)に計測(けいそく)

tmpfsなしの場合(ばあい)

$ phpunit
PHPUnit 8.5.2 by Sebastian Bergmann and contributors.

...............................................................  63 / 563 ( 11%)
............................................................... 126 / 563 ( 22%)
............................................................... 189 / 563 ( 33%)
............................................................... 252 / 563 ( 44%)
............................................................... 315 / 563 ( 55%)
............................................................... 378 / 563 ( 67%)
............................................................... 441 / 563 ( 78%)
............................................................... 504 / 563 ( 89%)
...........................................................     563 / 563 (100%)

Time: 21.37 minutes, Memory: 223.50 MB

OK (563 tests, 27596 assertions)

tmpfsありの場合(ばあい)

$ phpunit
PHPUnit 8.5.2 by Sebastian Bergmann and contributors.

...............................................................  63 / 563 ( 11%)
............................................................... 126 / 563 ( 22%)
............................................................... 189 / 563 ( 33%)
............................................................... 252 / 563 ( 44%)
............................................................... 315 / 563 ( 55%)
............................................................... 378 / 563 ( 67%)
............................................................... 441 / 563 ( 78%)
............................................................... 504 / 563 ( 89%)
...........................................................     563 / 563 (100%)

Time: 2.23 minutes, Memory: 223.50 MB

OK (563 tests, 27335 assertions)

NVMeのSSDを搭載(とうさい)したマシンを使用(しよう)しているのでストレージへの書(か)き込(こ)みも そこまで遅(おそ)くないはずですが、それでも10倍(ばい)ぐらい速(はや)くなってます。

注意点(ちゅういてん)

メモリ不足(ぶそく)には気(き)をつけてください。(試(ため)していないのでどんな挙動(きょどう)をするのかは知(し)らないですが・・・)
あと、公式(こうしき)サイトによると"Docker on Linux"でしか動作(どうさ)しないと書(か)かれています。 が、macOS上(じょう)で試(ため)した時(とき)も少(すこ)しは速(はや)くなってました。

参考(さんこう)

Use tmpfs mounts | Docker Documentation