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