Dockerとコンテナ技術 その7:データ永続化

コンテナは作成し利用した後は都度削除するのが一般的です。
しかし、コンテナを削除するとその中のデータも削除されてしまいます。
そのため、削除したくないデータがある場合はデータの永続化を行う必要があります。
Dockerではデータの永続化として2つの方法が用意されています。
ボリュームとバインドマウントです。

ボリュームを利用したデータ永続化

まず最初にボリュームを利用したデータ永続化についてまとめていきます。
ボリュームはDockerホストによって完全に管理されるデータの保管場所です。

特徴

  • Docker によって完全に管理される。
  • コンテナが破棄されてもデータは保持される。
  • 複数のコンテナ間で簡単に共有できる。
  • ホストシステムの特定のディレクトリに依存しない。

利用例

以下のようなcompose.yamlファイルの場合、最上位層のvolumes:配下に記述されているのがボリュームになります。
こちらのcompose.yamlではdbコンテナを作成しそのデータをdb-dataというボリュームに保管して永続化しています。
また、dbコンテナ内のvolumesでは、どのボリュームを利用するかとコンテナ内のパスを記述しています。

services:
  db:
    image: mariadb:10.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test
    volumes:
      - db-data:/var/lib/mysql # [ボリューム名:コンテナ内のパス]を指定している
volumes:
  db-data: # ボリューム名

これでdocker compose upコマンドを実行するとdb-dataボリュームを持ったdbコンテナが作成できます。
ボリュームはDockerが管理する記憶領域であるため直接操作の必要のないデータや永続化・安全性が重視されるデータに利用するのに向いています。

バインドマウントによるデータ永続化

次にバインドマウントによるデータの永続化についてまとめていきます。
バインドマウントとは、ホストOS上の任意のフォルダをコンテナにマウントすることができる機能です。
ホストOSのファイルシステムに依存し、ホストとコンテナ間でリアルタイムに共有することができます。

特徴

  • ホストのファイルシステムに依存する。
  • ホストとコンテナでファイルがリアルタイムで共有される。
  • 開発環境での使用に便利で、ソースコードなどの即時反映が必要な場合に有効。
  • コンテナの削除とともにデータが失われることはない。

利用例

以下のcompose.yamlservices配下のコンテナの設定に記述されているvolumes内に指定することでバインドマウントを行うことができます。

services:
  wordpress:
    image: wordpress:6.0
    volumes:
      - ./html:/var/www/html # [マウントするホストのパス:コンテナ内のパス]を指定している

これでコンテナを起動するとホストOSの./htmlとコンテナ上の/var/www/htmlがリアルタイムで同期され、コンテナ削除後もホストOS上のパスにファイルが残り消えることはありません。
バインドマウントはホストOSに依存するため柔軟性は低くなりますが、開発などで頻繁に変更され即座にコンテナに反映する必要があるデータを扱うのに向いています。

まとめ

今回はDockerコンテナのデータ永続化方法についてまとめました。
コンテナは起動や削除のオーバーヘッドが小さく頻繁に作っては削除することが一般的です。
正しくデータを永続化させ、コンテナの特徴を最大限活かせるようにしていきましょう。
ここまで読んでいただきありがとうございました。
それでは、また。