默认容器的数据是保存在容器的可读写层,当容器被删除时其上的数据将会丢失,所以为了实现数据的持久性则需要选择一种数据持久技术来保存数据,当前有以下几种方式:
- Volumes
- Bind mounts
- tmpfs
其中tmpfs的数据只保存在容器的内存中暂不讨论,而Volumes也叫Docker Managed Volume。
先简述实现方式:
Bind mounts
此方式与Linux系统的mount方式很相似,即是会覆盖容器内已存在的目录或文件,但并不会改变容器内原有的文件,当umount后容器内原有的文件就会还原。
实现语法有两种:
分别是,
使用-v或--volume,第一个冒号左边是Host的路径,右边是容器内的路径,第二个冒号的右边是可选项默认是可读写。
docker run -d \
-it \
--name devtest \
--volume "$(pwd)"/target:/app:ro \
nginx:latest
docker run -d \
-it \
--name devtest \
--mount type=bind,source="$(pwd)"/target,target=/app,readonly \
nginx:latest
两种语法的比较,后者更容易理解,建议采用后者。
还可以设定bind-propagation参数,如:
docker run -d \
-it \
--name devtest \
--mount type=bind,source="$(pwd)"/target,target=/app \
--mount type=bind,source="$(pwd)"/target,target=/app2,readonly,bind-propagation=rslave \
nginx:latest
有以下的可选参数:
属性值 |
描述 |
shared |
原始mount的次级mount会显示在重复mount中, 且重复mount的次级mount的内容也会在原始mount中显示 |
slave |
与shared mount相似,只是内容单方向可见,重复mount的内容不会在原始mount中显示。 |
private |
次级mount在原始mount和重复mount之间互不可见 |
rshared |
与shared mount一样,只是传播范围扩展至嵌套的重复mount和原始mount |
rslave |
与slave mount一样,只是传播范围扩展至嵌套的重复mount和原始mount |
rprivate |
默认值,与private mount一样,即原始mount和重复mount之间都不会传播内容。 |
注:更多关于mount的说明请见:
https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt
volume mount
使用以下命令建立由docker管理的volume
docker volume create my-vol
查看已建立的volume
docker volume ls
删除已建立的volume
docker volume rm my-vol
使用已建立的volume
docker run -d \
--name devtest \
--mount source=myvol,target=/app \
nginx:latest
或
docker run -d \
--name devtest \
-v myvol2:/app \
nginx:latest
可以使用以下命令检查容器中的volume路径
docker inspect devtest
注:当使用docker service create命令时只能使用--mount而不能使用-v
通过vieux/sshfs实现跨主机的volume
第1步,安装vieux/sshfs插件
docker plugin install --grant-all-permissions vieux/sshfs
第2步,建立ssh volume
docker volume create --driver vieux/sshfs \
-o sshcmd=test@node2:/home/test \
-o password=testpassword \
sshvolume
第3步,使用ssh volume
docker run -d \
--name sshfs-container \
--volume-driver vieux/sshfs \
--mount src=sshvolume,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \
nginx:latest
注:如果两主机之间已设定ssh key验证,则可以不使用opt=password指定密码
注:Bind mount 和 volume mount的一个区别
Bind mount会覆盖容器中的文件,而volume mount则不会,即如果容器中已有文件,则会将文件同步到主机的目录上。