Docker データの保持

続いてデータの保持について調べていく

参照
Docker ドキュメント日本語化プロジェクト

データベースの保持

作業ディレクトリ:getting-started/app

データベースの保持

まず、同一イメージの別コンテナでデータが別々に保持されていることを確認してみる
以下のコマンドで別コンテナを作成・起動する

docker run -dp 127.0.0.1:3001:3000 getting-started

起動したので、以下から確認してみる
http://localhost:3001/

1つ目のコンテナにアイテムを追加し、別々に管理されていることを確認してみる
http://localhost:3000/

追加しても2つ目のコンテナには反映されないのがわかる
これはコンテナごとにデータの保持を行っているからで、別環境だから当然データも見れない

そこで別コンテナであっても、データを共有して保持できるようにしていく

デフォルトで用意されているtodoアプリのDBはsqliteで
コンテナ用ファイルシステム内の /etc/todos/todo.db に保存されているらしい
※ファイル検索をすると見つかる

データの共有に際し、ボリュームを使用する
コンテナ間でデータを共有したり保存したりするためのもので、ファイルシステムに依存せずデータを保持することができるため、コンテナを削除してもデータが消えないようになる

以下のコマンドでボリュームを作成する

docker volume create todo-db

todoアプリのコンテナを作り直す必要があるため、停止と削除を行う

docker rm -f <CONTAINER ID>

以下のコマンドでコンテナを起動する
ボリュームのマウントを指定する –mount オプションを追加
ボリューム名を与え、そこをコンテナ内の /etc/todos にマウントすると、そのパスに作成された全てのファイルをボリューム内に確保できるようになるらしい

docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started

とりあえず作り直せたことは確認できた
http://localhost:3000/

適当にアイテムを追加する

せっかくなので、Docker Desktopでのやり方も試してみる
ボリューム自体は作成済みなので、3001のコンテナを削除して作り直す

  • Docker Desktop の Containers を開く
  • Port が 3001 のコンテナを選んで削除する
  • 続いて Images を開き getting-started を選んで実行をクリック
  • Optional settings を選択
  • Ports の Host port に3001を指定する
  • Volumes の Host path にボリューム名 todo-db を指定する
  • Container path に /etc/todos を指定する
  • Run をクリック

コンテナが作成・実行されるので以下からアプリを開く
http://localhost:3001

localhost:3000 で追加したアイテムが別コンテナでも参照できていることがわかる
また、3001で追加したアイテムが3000でも追加されることも確認できる

次はバインドマウントについて勉強していく

コメント