关于Docker的容器卷
我在EC2(AmazonLinux2)环境中运行Docker,但我意识到主机操作系统上的挂载点在增加…
因此,为了更深入地理解卷,我进行了各种尝试。
关于Docker中的VOLUME
以下是从Docker参考中dockerfile-VOLUME描述中提取的内容。
VOLUME命令会创建指定名称的挂载点,并将其作为可通过其他主机或容器外部挂载的卷。
docker run命令将在指定位置初始化一个新创建的卷,作为保存数据的位置,该位置是基于基础镜像。
我通过阅读明白了「在容器中会创建由VOLUME指定的目录」,但是关于「将其设置为可从其他主机或容器进行外部挂载的卷」这部分,我的理解是在容器启动时(run)通过-v参数定义与主机操作系统上的目录进行关联,这样可以持久保存数据。(我认为如果不指定-v参数,最终数据将不会被持久保存并会被删除。)
所以,我进行了各种音量操作的功能验证。
验证环境
- EC2 (Amazon Linux2)
验证行动
- VOLUME指定の無いイメージ(CentOS)からコンテナ起動してみる(-v, –mount指定なし)
#Volumeは存在しない(コンテナ起動前)
[~]docker volume ls
DRIVER VOLUME NAME
#CentOSイメージからコンテナ起動
[~]docker run --name test_container -dt centos
#Volumeは存在しない(コンテナ起動後)
docker volume ls
DRIVER VOLUME NAME
-
- VOLUME指定のあるイメージからコンテナ起動してみる(-v, –mount指定なし)
- 下記dockerfileを使用してCentOSイメージをベースにVolume指定されたイメージを作成して起動してみる
#dockerfile(CentOSイメージをベースにVolume=/test_volumeを定義)
ARG baseimagetag=latest
FROM centos:${baseimagetag} AS baseimage
VOLUME /test_volume
#dockerイメージ作成
[~]docker build -t centos_mod .
#Volumeは存在しない(コンテナ起動前)
[~]docker volume ls
DRIVER VOLUME NAME
#CentOS(改変)イメージからコンテナ起動
[~]docker run --name test_container -dt centos_mod
#Volumeが作成される(コンテナ起動後)
docker volume ls
DRIVER VOLUME NAME
local ec1feead17bb87e24d3e2e6db716daf58d12747cbdd0b510fd30f507d7f8308b
#VolumeのホストOS上のマウントポイントを確認
#自動的に/var/lib/docker/volumes/配下にマウントポイントが作成されていることがわかる
[~]docker inspect ec1feead17bb87e24d3e2e6db716daf58d12747cbdd0b510fd30f507d7f8308b
[
{
"CreatedAt": "2020-07-10T08:30:00+09:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/ec1feead17bb87e24d3e2e6db716daf58d12747cbdd0b510fd30f507d7f8308b/_data",
"Name": "ec1feead17bb87e24d3e2e6db716daf58d12747cbdd0b510fd30f507d7f8308b",
"Options": null,
"Scope": "local"
}
]
#コンテナ停止、削除
[~]docker stop test_container
[~]docker rm test_container
#Volumeが確認(コンテナ削除後)
#ホストOS上のマウントポイントは存在している
docker volume ls
DRIVER VOLUME NAME
local ec1feead17bb87e24d3e2e6db716daf58d12747cbdd0b510fd30f507d7f8308b
- VOLUME指定のあるイメージからコンテナ起動してみる(-v にてVolume名を指定)
#CentOS(改変)イメージからコンテナ起動(ホストOSのマウントポイントを名称(host_mount)で指定
[~]docker run --name test_container -v host_mount:/test_volume -dt centos_mod
baf6954e9dbce1dd9ad3ae5c8286e63c01fd39689d79053725ae1800b70ea752
#Volumeが作成される(コンテナ起動後)
[~]docker volume ls
DRIVER VOLUME NAME
local host_mount
#VolumeのホストOS上のマウントポイントを確認
#自動的に/var/lib/docker/volumes/配下に-vで指定した名前/_dataでマウントポイントが作成されていることがわかる
docker inspect host_mount
[
{
"CreatedAt": "2020-07-10T22:22:49+09:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/host_mount/_data",
"Name": "host_mount",
"Options": null,
"Scope": "local"
}
]
- VOLUME指定のあるイメージからコンテナ起動してみる(-v にてホストOS上のディレクトリを指定)
#CentOS(改変)イメージからコンテナ起動(ホストOSのマウントポイントをディレクトリ(/test_mount)で指定
[~]docker run --name test_container -v /test_mount:/test_volume -dt centos_mod
e5e70d6235dbfe54950e2053f61236c1450d43c0b3aacfa38341e37cfacecaaa
#Volumeの確認(コンテナ起動後)
#下記コマンドではマウントポイントは表示されない
[~]docker volume ls
DRIVER VOLUME NAME
#コンテナ情報からマウントポイントを確認
[~]docker inspect test_container
##一部抜粋
"Mounts": [
{
"Type": "bind",
"Source": "/test_mount",
"Destination": "/test_volume",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
進行動作验证以理解事情.
-
- VOLUMEが定義されたDockerイメージを使用してコンテナ起動すると、
-
- VOLUMEで指定されたディレクトリが永続化領域としてコンテナ内に作成される
-
- Dockerコンテナ起動時(run)にVOLUMEで指定されたディレクトリに対応するホストOS上のマウントポイント(ディレクトリ)を指定しない場合、ホストOS上のDockerのVolume領域(上記検証では/var/lib/docker/volumes)にマウントポイントが自動で作成される
-
- 起動時にVOLUMEで指定されたディレクトリに対応するホストOS上のマウントポイント(名称)を指定した場合、無指定時と同様、ホストOS上のDockerのVolume領域にマウントポイントが指定した名称/_dataで作成される
docker volume lsで表示されるマウントポイントはホストOS上のDockerのVolume領域(/var/lib/docker/volumes)に作成されたディレクトリを表示している
※Volume領域以外のディレクトリをマウントポイントに指定した場合は表示されない
ホストOS上に作成されたマウントポイントはコンテナを停止、破棄しても削除されない(永続化領域なんだから当たり前)
※VOLUME指定されたイメージ(MySQLなど)からのコンテナ起動を繰り返していると認識していないディレクトリが山のように発生している可能性も。。)
确认图片是否指定了Volume的方法
使用 docker inspect <镜像名称> 命令来显示镜像的信息,并确认 “Volumes” 部分是否指定了目录。
对于MySQL容器而言,将持续存储区域定义为容器内的/var/lib/mysql。
"Volumes": {
"/var/lib/mysql": {}
},