1. 容器的数据
容器中的文件系统由分层文件系统提供的,包含只读层(镜像)和可读可写层(容器运行时层),这些都被封装在容器内部,如果用户需要将主机上的文件系统共享给容器使用,目前由两种处理方式:
- 数据卷——将主机的卷mount进入容器。
- 数据容器——将外部容器分享给容器。
1.1 数据卷
先来看看Docker的理念:
- 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
- 容器之间希望有可能共享数据
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,
那么当容器删除后,数据自然也就没有了。
为了能保存数据在docker中我们使用卷。有点类似我们Redis里面的rdb和aof文件,持久化功能。
1.2 数据卷能干嘛
- 容器的持久化
- 容器间继承+共享数据
数据卷提供了一种主机和容器共享数据的方式,有些时候需要用它来做持久化和数据共享。
当作持久化时,通常数据卷都会比较大,可以将其放在一个单独的磁盘、卷或者阵列上,这个时候容器只是一个执行环境。
当做数据共享时,可以用于开发和测试分布式环境,如需要用到共享盘、处理fencing等。
数据卷主要通过 -v 参数来指定。
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
2. 如何操作
2.1 映射一个外部卷
命令:docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
如果以 -v src:des
的方式指定,那么容器则会直接将宿主机的目录挂在到容器内部。
容器更目录:
主机根目录:
查看数据卷是否挂在成功:
docker inspect 镜像Id
容器与宿主机之间的数据共享
测试数据共享,在主机中创建文件,容器中可查看到该文件。
测试容器停止退出后,主机修改后数据是否同步。
首先停止退出容器,然后主机修改共享数据。启动容器后查看共享数据是否同步。
发现容器即使关闭了,主机修改共享数据后容器仍可以获取。
2.2 创建一个数据卷
若需要一个外部卷来存放持久化数据,而不享把数据包含在容器内部。例如:
创建了一个名为centos02的容器,同时为其创建一个/webapp的数据卷,这是数据卷在其内部的位置。
它在主机的位置:
docker inspect 镜像id
这个位置在 /var/lib/docker下。
2.3 DockerFile添加
可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
说明:
出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。
由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。
- File构建
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,----success"
CMD /bin/bash
- build后生成镜像
[root@zxg mydocker]# docker build -f ./dockerfile -t zxg/centos .
生成了一个新的镜像 zxg/centos
- 运行容器
我们定义的两个数据卷在容器中已经存在。
主机中默认的地址仍然在/var/lib/docker
下面。
2.4 使用数据型容器
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
由于容器本身就可以包含文件系统,那么可以把容器的卷分享给另一个容器使用。步骤如下:
- 创建一个包含外部卷的容器,
注意是 create
,不是run。 run是create之后再start。本例只需要容器的文件系统,所以只需要create。
[root@zxg ~]# docker create -v /dbdata --name centos03 centos
- 在另一个容器中通过
--volumes-from来映射
[root@zxg ~]# docker run --rm -it --volumes-from centos02 centos
相关博客