Skip to Content
Docker ワヌクショップパヌト4: デヌタベヌスの氞続化

デヌタベヌスの氞続化

もし気づいおいない堎合、コンテナを起動するたびに、todoリストが空になっおいたす。なぜそうなるのでしょうかこのパヌトでは、コンテナがどのように動䜜しおいるかを詳しく芋おいきたす。

コンテナのファむルシステム

コンテナが実行されるず、ファむルシステムずしおむメヌゞのさたざたなレむダヌを䜿甚したす。各コンテナには、ファむルの䜜成、曎新、削陀ができる独自の「スクラッチスペヌス」も䞎えられたす。これらの倉曎は、同じむメヌゞを䜿甚しおいる他のコンテナでは芋られたせん。

実際に確認する

これを確認するために、2぀のコンテナを起動したす。1぀のコンテナでファむルを䜜成し、もう1぀のコンテナでそのファむルが存圚するか確認したす。結果ずしお、1぀のコンテナで䜜成したファむルが、別のコンテナには存圚しないこずがわかりたす。

  1. Alpineコンテナを起動し、シェルにアクセスしたす。

    $ docker run -ti --name=mytest alpine
  2. コンテナ内で greeting.txt ずいう名前のファむルを䜜成し、その䞭に hello ずいうテキストを入れたす。

    / # echo "hello" > greeting.txt
  3. コンテナを終了したす。

    / # exit
  4. 新しいAlpineコンテナを起動し、cat コマンドを䜿甚しおファむルが存圚しないこずを確認したす。

    $ docker run alpine cat greeting.txt

    新しいコンテナにファむルが存圚しないこずを瀺す、以䞋のような出力が衚瀺されるはずです。

    cat: can't open 'greeting.txt': No such file or directory
  5. docker ps --all コマンドを䜿甚しおコンテナのIDを取埗し、docker rm -f <container-id> コマンドでコンテナを削陀したす。

コンテナボリュヌム

前の実隓で確認したように、各コンテナは起動するたびにむメヌゞの定矩から開始されたす。コンテナはファむルを䜜成、曎新、削陀できたすが、コンテナを削陀するずそれらの倉曎は倱われ、Dockerはすべおの倉曎をそのコンテナに隔離したす。ボリュヌムを䜿えば、これを倉曎するこずができたす。

ボリュヌム  は、コンテナ内の特定のファむルシステムパスをホストマシンに接続する機胜を提䟛したす。コンテナ内のディレクトリをマりントすれば、そのディレクトリ内の倉曎がホストマシンにも反映されたす。コンテナを再起動しおも、同じディレクトリをマりントすれば、同じファむルが衚瀺されたす。

ボリュヌムには䞻に2皮類ありたす。最終的には䞡方を䜿甚したすが、たずはボリュヌムマりントから始めたす。

todoデヌタの氞続化

デフォルトでは、todoアプリはコンテナのファむルシステム内の /etc/todos/todo.db にSQLiteデヌタベヌスずしおデヌタを保存したす。SQLiteに詳しくない堎合でも問題ありたせん。SQLiteは、すべおのデヌタを1぀のファむルに保存するリレヌショナルデヌタベヌスです。倧芏暡なアプリケヌションには最適ではありたせんが、小芏暡なデモには適しおいたす。埌で、これを別のデヌタベヌス゚ンゞンに切り替える方法も孊びたす。

デヌタベヌスが単䞀ファむルであるため、このファむルをホストに氞続化し、次のコンテナで利甚できるようにすれば、前回の続きから実行できるはずです。ボリュヌムを䜜成しおデヌタを保存しおいるディレクトリにアタッチマりントするこずで、デヌタを氞続化できたす。コンテナが todo.db ファむルに曞き蟌むず、そのデヌタはホスト䞊のボリュヌムに氞続化されたす。

前述のように、ボリュヌムマりントを䜿甚したす。ボリュヌムマりントは、䞍透明なデヌタのバケットのようなものず考えおください。Dockerはボリュヌムを完党に管理し、ディスク䞊のストレヌゞ堎所も含めお管理したす。芚えおおくべきは、ボリュヌムの名前だけです。

ボリュヌムを䜜成し、コンテナを起動する

CLIたたはDocker Desktopのグラフィカルむンタヌフェヌスを䜿甚しお、ボリュヌムを䜜成し、コンテナを起動できたす。

  1. docker volume create コマンドを䜿甚しおボリュヌムを䜜成したす。
$ docker volume create todo-db
  1. 氞続化ボリュヌムを䜿甚せずにただ実行䞭のtodoアプリコンテナを、docker rm -f <id> で停止しお削陀したす。

  2. --mount オプションを远加しおボリュヌムマりントを指定し、todoアプリコンテナを起動したす。ボリュヌムに名前を付け、それをコンテナの /etc/todos にマりントしたす。このディレクトリに䜜成されたすべおのファむルがキャプチャされたす。

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

Git Bashを䜿甚しおいる堎合、このコマンドの構文が異なりたす。

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

Git Bashの構文の違いに぀いおの詳现は、Git Bashの䜿甚  を参照しおください。

デヌタが氞続化されおいるこずを確認する

  1. コンテナが起動したら、アプリを開いお、todoリストにいく぀かのアむテムを远加したす。

    Items added to todo list

  2. Docker Desktopたたは docker ps コマンドを䜿っおIDを取埗し、docker rm -f <id> コマンドを䜿甚しおtodoアプリコンテナを停止しお削陀したす。

  3. 前の手順を䜿っお新しいコンテナを起動したす。

  4. アプリを開くず、リストにただアむテムが残っおいるはずです。

  5. リストを確認し終えたら、コンテナを削陀しおください。

これでデヌタを氞続化する方法を孊びたした。

ボリュヌムの詳现を確認する

「ボリュヌムを䜿甚しおいるずきにDockerはデヌタをどこに保存しおいるのか」ずよく聞かれたす。これを確認するには、docker volume inspect コマンドを䜿甚したす。

$ docker volume inspect todo-db

次のような出力が衚瀺されるはずです

[ { "CreatedAt": "2019-09-26T02:18:36Z", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/todo-db/_data", "Name": "todo-db", "Options": {}, "Scope": "local" } ]

Mountpoint はディスク䞊の実際のデヌタの保存堎所です。ほずんどのマシンでは、このディレクトリにホストからアクセスするにはrootアクセスが必芁です。

たずめ

このセクションでは、コンテナデヌタを氞続化する方法を孊びたした。

関連情報:

次のステップ

次は、バむンドマりントを䜿甚しお、アプリをより効率的に開発する方法を孊びたす。

Last updated on