Docker容器数据卷
- 简介
docker的理念:将运行的环境打包形成容器运行,运行可以伴随容器,但是我们对数据的要求是希望持久化,
容器之间可以共享数据,Docker容器产生的数据,如果不通过docker commit生成新的镜像,
使得数据作为容器的一部分保存下来,那么当容器被删除之后,
数据也就没了,为了能够保存数据,在docker容器中使用卷。
卷就是目录或者文件,存在于一个或者多个容器中,但是不属于联合文件系统,因此能够绕过Union File System提供一些用于持久化数据或共享数据的特点
- 作用
卷的设计目的就是数据的持久化,完全独立与容器的生命周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
1. 数据卷可以在容器之间共享和重用数据。
2. 卷的更改可以直接生效。
3. 数据卷的更改不会包含在镜像的更新中。
4. 数据卷的生命周期一直持续到没有容器使用它为止。
容器的持久化
容器间继承+共享数据
- 数据卷
容器内添加数据卷的两种方式
1.直接命令添加:
命令
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it -v /myDataVolume:/datavolumeContainer centos
将宿主机目录与容器内目录绑定,容器目录内生成的文件,在宿主机目录中也存在一份同步的数据
查看数据卷是否挂载成功。
使用docker imspect 容器ID,返回的json串有这么一串数据说明挂载成功。
2.DockerFile添加
根目录下新建mydocker文件
可在DockerFile中使用VOLUME指令来给镜像添加一个或多个数据卷
File构建(Dockerfile)
docker build -f ./Dockerfile -t zzmm/centos .
build后生成镜像 ,获得一个新的镜像 zzmm/centos
docker run -it zzmm/centos #run容器,由镜像文件生成容器,不需要 /bin/bash,Dockerfile 文件中已包含该指令
此时会进入到新容器的根目录,
ls -l 查看
容器内会有dataVolumeContainer1 和 dataVolumeContainer2 两个数据卷目录
容器内的卷目录地址已知--->()
对应的主机目录地址在哪?
进入宿主机
docker ps 查看zzmm/centos 容器id
docker inspect 容器id
可以看到:
"Source": "/var/lib/docker/volumes/e8511fc4cb72b2919227a35643d114148c91be42239385b8ae7253b4f008f329/_data",
"Source": "/var/lib/docker/volumes/12717a9d775db7dccfc3c130a4d58f8a1a6340c1f36be1a099627c744c478f50/_data",
解析:使用Dockerfile 生成 数据卷,没有指定宿主机路径时,默认会在该目录下会有与容器数据卷绑定的目录文件
测试:
在容器的数据卷dataVolumeContainer1中添加文件 -rw-r--r--. 1 root root 0 Nov 4 08:33 containt01.txt
再开个窗口进入宿主机,进入目录/var/lib/docker/volumes/e8511fc4cb72b2919227a35643d114148c91be42239385b8ae7253b4f008f329/_data
此时存在文件 containt01.txt
因此可验证宿主机有与容器zzmm/centos 中数据卷对应文件目录
容器和宿主机之间通信
容器关闭后在宿主机更改文件,容器再次启动数据仍然同步
命令(带权限)
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 (read only)
此时主机能对数据卷进行更改,但是容器不能对其更改,只允许读。
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,------------success1"
CMD /bin/bash
[root@centos7-basic mydocker]# pwd
/home/zhoumm/homeRoot/mydocker
[root@centos7-basic mydocker]# docker build -f ./Dockerfile -t zzmm/centos .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
latest: Pulling from library/centos
729ec3a6ada3: Pull complete
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for centos:latest
---> 0f3e07c0138f
Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
---> [Warning] IPv4 forwarding is disabled. Networking will not work.
---> Running in bf779547b0d8
Removing intermediate container bf779547b0d8
---> 77370ed61f39
Step 3/4 : CMD echo "finished,------------success1"
---> [Warning] IPv4 forwarding is disabled. Networking will not work.
---> Running in ea5d6a998b21
Removing intermediate container ea5d6a998b21
---> 7e55e1deb959
Step 4/4 : CMD /bin/bash
---> [Warning] IPv4 forwarding is disabled. Networking will not work.
---> Running in d14088f09d67
Removing intermediate container d14088f09d67
---> 0f897b9ef509
Successfully built 0f897b9ef509
Successfully tagged zzmm/centos:latest
[root@centos7-basic volumes]# pwd
/var/lib/docker/volumes
[root@centos7-basic volumes]# ll
total 24
drwxr-xr-x. 3 root root 19 Nov 4 16:21 12717a9d775db7dccfc3c130a4d58f8a1a6340c1f36be1a099627c744c478f50
drwxr-xr-x. 3 root root 19 Nov 4 16:21 e8511fc4cb72b2919227a35643d114148c91be42239385b8ae7253b4f008f329
- 数据卷容器
- 命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器 (活动硬盘上挂载活动硬盘,实现数据依赖)
- 容器间的传递共享(–volumes from)
#以dc01做父容器
exit 退出
docker ps # 没有容器在运行
宿主机执行 docker run -it --name dc01 zzmm/centos
查看容器:
[root@centos7-basic zhoumm]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a31838be046d zzmm/centos "/bin/sh -c /bin/bash" 5 minutes ago Up 5 minutes dc01
宿主机执行 docker run -it --name dc02 --volumes-from dc01 zzmm/centos
容器查看:
[root@centos7-basic zhoumm]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d61c930d46b6 zzmm/centos "/bin/sh -c /bin/bash" 2 minutes ago Up 2 minutes dc02
a31838be046d zzmm/centos "/bin/sh -c /bin/bash" 10 minutes ago Up 10 minutes dc01
此时dc01中的数据卷,在dc02中也存在,若在的dc01容器的数据卷中添加文件,在dc02容器对用的数据卷中也会有,验证了继承性,父到子,子到父实现共享
docker rm -f dc01
若1,删除容器dc01, 则容器dc02,dc03依然存在,文件也存在,
若2,再再dc02容器中添加文件,那再dc03容器中依然存在新增的文件
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止