什么是数据卷?
卷就是目录或文件,存在于一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能绕过Union File System提供一些用于持续存储或者共享数据的特性;
特点
1. 数据卷可在容器之间共享或重用数据
2. 卷中的更改可以直接生效
3. 数据卷中的更改不会包含在镜像的更新中
4. 数据卷的生命周期一直持续到没有容器使用它为止
5. 数据卷可以完成容器到宿主机,宿主机到容器之间的数据共享
一句话,数据卷就是用来解决数据持久化和数据共享的。
容器内添加数据卷
容器内添加数据卷有两种方法:一种是直接用命令添加,另一种是使用dockerfile添加
- 直接命令添加数据卷
命令:docker run -it -v /宿主机绝对路径目录: /容器内目录 镜像名
说明:-v是volume卷的意思
宿主机绝对目录和容器内目录都不用提前建立
[root@t-docker lbb]# docker run -it -v /myDataVolume:/dataVolumeContainer centos
[root@8ad4df9ec2fd /]# ls
anaconda-post.log dataVolumeContainer etc lib media opt root sbin sys usr
bin dev home lib64 mnt proc run srv tmp var
[root@8ad4df9ec2fd /]# cd dataVolumeContainer/
- 查看数据卷是否挂载成功
[root@t-docker myDataVolume]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8ad4df9ec2fd centos "/bin/bash" 5 minutes ago Up 5 minutes lucid_swartz
[root@t-docker myDataVolume]# docker inspect 8ad4df9ec2fd
"Mounts": [
{
"Type": "bind",
"Source": "/myDataVolume",
"Destination": "/dataVolumeContainer",
"Mode": "",
"RW": true, ##注意RW是true才能可读写(read and write)
"Propagation": "rprivate"
- 验证容器和宿主机之间的数据共享
在/myDataVolume和/dataVolumeContainer上各创建文件,都能互相看到。
注意:
容器停止退出后,主机修改后数据还在同步
- 带权限的数据卷
命令:docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
说明:-v是volume卷的意思
宿主机绝对目录和容器内目录都不用提前建立
ro:是read only的意思
[root@t-docker lbb]# docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos
[root@c13998a78deb /]# ls
[root@t-docker myDataVolume]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c13998a78deb centos "/bin/bash" 2 minutes ago Up 2 minutes wonderful_khorana
[root@t-docker myDataVolume]# docker inspect c13998a78deb
"Mounts": [
{
"Type": "bind",
"Source": "/myDataVolume",
"Destination": "/dataVolumeContainer",
"Mode": "ro",
"RW": false, ##不能写,只能读
"Propagation": "rprivate"
dockerfile方式添加数据卷
- 根目录下新建mydocker文件夹并进入
[root@t-docker lbb]# mkdir /mydocker
[root@t-docker lbb]# cd /mydocker/
- 可在dockerfile中使用colume指令来给镜像添加一个或多个数据卷
语法:VOLUME ["/dataVolumeContainer",'/data/VolumeContainer2','/dataVolumeContainer3']
说明:出于可移植性和分享的考虑,用-v主机目录:容器目录这种方法不能直接在dockerfile中实现。因为宿主机目录是依赖于特定宿主机的,并不能保证在所有的宿主机上都存在这样的特定目录。
- dockerfile构建
[root@t-docker lbb]# cd /mydocker/
[root@t-docker mydocker]# cat Dockerfile
#volume test
#继承centos镜像
FROM centos
#在上面继承的centos目录下建立两个数据卷
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash
- build生成镜像
[root@t-docker mydocker]# cd /mydocker/
[root@t-docker mydocker]# docker build -f /mydocker/Dockerfile -t lbb/centos .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 5182e96772bf
Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
---> Running in d7a71c40c684
Removing intermediate container d7a71c40c684
---> 1edef45a66a2
Step 3/4 : CMD echo "finished,--------success1"
---> Running in 0cad5eaf3a5e
Removing intermediate container 0cad5eaf3a5e
---> 027d129bc237
Step 4/4 : CMD /bin/bash
---> Running in 0f4088e1bf0e
Removing intermediate container 0f4088e1bf0e
---> a37b96c1c7a7
Successfully built a37b96c1c7a7
Successfully tagged lbb/centos:latest
[root@t-docker mydocker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lbb/centos latest a37b96c1c7a7 18 seconds ago 200MB
说明: -t是-tag list的意思
- 启动容器
[root@t-docker mydocker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lbb/centos latest a37b96c1c7a7 7 minutes ago 200MB
[root@t-docker mydocker]# docker run -it lbb/centos
[root@3ccb67a921de /]#
[root@3ccb67a921de /]# ls
anaconda-post.log dataVolumeContainer1 dev home lib64 mnt proc run srv tmp var
bin dataVolumeContainer2 etc lib media opt root sbin sys usr
[root@3ccb67a921de /]#
ls后看到容器内有dataVolumeContainer1和dataVolumeContainer2两个目录
- 查看容器内的卷目录地址对应宿主机目录地址
[root@t-docker /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3ccb67a921de lbb/centos "/bin/sh -c /bin/bash" 6 minutes ago Up 6 minutes gallant_jang
[root@t-docker /]# docker inspect 3ccb67a921de
"Mounts": [
{
"Type": "volume",
"Name": "0055c21730734a9a73751de1ae1c7a5865f369e180d911490569d4aa1b78479d",
"Source": "/var/lib/docker/volumes/0055c21730734a9a73751de1ae1c7a5865f369e180d911490569d4aa1b78479d/_data",
"Destination": "/dataVolumeContainer1",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "18c5bc0fba2ec1913a7fd4997fc2181d16f2640d0c271571c0b580db89797c06",
"Source": "/var/lib/docker/volumes/18c5bc0fba2ec1913a7fd4997fc2181d16f2640d0c271571c0b580db89797c06/_data",
"Destination": "/dataVolumeContainer2",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
至此两种创建数据卷的方式已成功