永続化の方法には2種類あります
Dockerコンテナは一時的な実行環境なので、コンテナの削除はもちろんコンテナ停止のタイミングでコンテナ内に作成されたデータは削除されてしまいます。(注1)データベースでいうと、テーブルを作成しその中に蓄積したデータの保存を担保する場合は、バイトマウントやボリュームを用いて永続化が必要になります。
(注1)PostgreSQLのコンテナでcreate tableしたテーブルは「永続化」しない場合においても、コンテナ再起動でクリアされず残っている場合もあるようですが、これは保証されるものでなく、データの保持を担保するには永続化が必要になります。
バインドマウントによる永続化
バイトマウントはコンテナ実行のタイミングで、ホストマシンのディレクトリとコンテナ内のディレクトリをマウントするものなのでDockerファイルには記載できません。
バインドマウントの使用例
docker container create --name pos153cont `
-v D:\docker\post153\pgdata:/var/lib/postgresql/data `
-e POSTGRES_DB=udondb `
-e POSTGRES_USER=postgres `
-e POSTGRES_PASSWORD=pospass `
-p 5432:5432 `
myposgreimage
参考:https://docs.docker.jp/storage/bind-mounts.html
バインドマウントの設定 確認方法
以下はPowershellで確認する際の例です
$json = docker container inspect 1982ccf4285c | ConvertFrom-Json $json.Mounts
実行例
-- まず対象のコンテナIDを求めます
--
post153 >> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1982ccf4285c myposgreimage "docker-entrypoint.s…" 12 seconds ago Created pos153cont
--
--
post153 >> $json = docker container inspect 1982ccf4285c | ConvertFrom-Json
post153 >> $json.Mounts
Type : bind
Source : D:\docker\post153\pgdata
Destination : /var/lib/postgresql/data
Mode :
RW : True
Propagation : rprivate
post153 >>
--
-- ローカルのフォルダD:\docker\post153\pgdataとDocker側のフォルダ/var/lib/postgresql/dataが
-- マッピングしている事確認できます
ボリュームを使った永続化
ボリュームの使用例
post153ip >> docker run --name pos153ip `
>> -p 192.168.3.5:5432:5432 `
>> -e POSTGRES_PASSWORD=pospass `
>> -d `
>> -v mypostgresdata:/var/lib/postgresql/data `
>> postgres:15.3
e2011bbd8f1bb501824559d48ead2d9e0d13f2ede1bde8a2ea4580edfde5c84e
--
-- 実行しているか確認
--
post153ip >> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2011bbd8f1b postgres:15.3 "docker-entrypoint.s…" 20 minutes ago Up 20 minutes 192.168.3.5:5432->5432/tcp pos153ip
--
-- ボリュームを確認
--
post153ip >> docker volume ls
DRIVER VOLUME NAME
local 5e6224a4fdff6cdb48d8427f8fbb54e8c8b80d1e29ece9a768c890707d73a207
local c3890a09f898be5532f1f554aaa7d62c4baa33a40107890039ddbd560d14559a
local mypostgresdata
local postgresdb
post153ip >>
--
-- docker volume ls ってちょっと物足りないですよね、、
-- こんな時は 「docker container inspect」を使います。
--
post153ip >> docker container inspect pos153ip | ConvertFrom-Json | Select-Object -ExpandProperty Mounts
Type : volume
Name : mypostgresdata
Source : /var/lib/docker/volumes/mypostgresdata/_data
Destination : /var/lib/postgresql/data
Driver : local
Mode : z
RW : True
Propagation :
--
参考:https://docs.docker.jp/storage/volumes.html