Docker

Docker 永続化

永続化の方法には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

スポンサーリンク