Docker容器技术之数据
Docker容器在退出之后,里面的数据在用户眼里就是不见了,删除了。在生产环境中,这样不利于需要持久化的数据。为了解决这个问题,就需要引入Docker的数据管理。
一、Data Volume
Data Volume本质上是本地系统环境中的目录或者文件,在启动容器的过程中直接mount到容器中。具有以下特点:
- 是目录或者文件,不是没有格式化的磁盘;
- 容器能够读写volume中的数据;
- volume数据可以被永久的保存,即使容器已经销毁。
在使用上,docker提供了两种类型的volume:bind mount和docekr managed volume.
(一)bind mount
bind mount是将host上已存在的目录或文件mount到容器。
下面进行演示:
在上面的演示中,我们讲用户家目录下的test目录挂载到容器下面的根目录里面的test目录里面,分别在主机环境和容器环境看到的内容是完全一样的。
当我们在容器当中修改文件会出现什么样的情况:
首先在容器中修改文件,然后在主机中查看,里面的内容完全一样。
-v标志使用的格式是
-v <host path>:<container path>
如果在镜像中不存在,则在创建容器的过程中会自动创建。挂载之后,如果里面有内容,则会被隐藏起来,取而代之的是跟操作系统的mount行为一样。-v的使用便达到了本地主机和容器共享数据了。这样的使用场景非常的多,比如web静态文件可以放在主机中,在主机中修改文件就可以直接起到作用。
docker managed volume
docker managed volume与bind mount在使用上的最大区别是不需要指定mount源,指明mount point就行了。使用的方法为:
在启动容器的时候还是使用-v标志,但是跟bind mount不一样额地方是不需要:(冒号也不要),直接跟进挂载点就行了,docker会自动创建数据卷。
可以看到test目录已经出现在容器的系统根目录里面了。那么这个数据卷具体是在哪里呢?
helmer@Hanssen:~$ docker inspect box
[
"Mounts": [
{
"Type": "volume",
"Name": "69727dec1d590123a478f03046d09a92ba01ce4f2b6599ec816d2ee3e5f7e4a3",
"Source": "/var/lib/docker/volumes/69727dec1d590123a478f03046d09a92ba01ce4f2b6599ec816d2ee3e5f7e4a3/_data",
"Destination": "/test",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
从上面docker inspect box命令的输出结果可以看出,数据卷的存放位置在"/var/lib/docker/volumes/69727dec1d590123a478f03046d09a92ba01ce4f2b6599ec816d2ee3e5f7e4a3/_data"目录里面,现在容器里面写入数据,然后到主机目录里面查看:
从上图中可以看到,在容器里面添加的文件在主机上可以看到,并且是一样的。
bind mount 和docker managed volume实现了相同的功能,但是也有区别: