1.1 什么是容器数据卷
1、容器数据卷产生前提
- 将应用和运行的环境打包形成容器运行,运行结果可以伴随着容器,对于数据的要求,我们是希望能够持久化的,假设说你安装一个
redis
,如果把容器删了,就相当于删库跑路,出现以上的问题,我们希望容器之间有可能可以共享数据,Docker容器产生的数据,如果不通过docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了! - 为了能保存数据在
Docker
中就可以使用卷!让数据挂载到我们本地!这样数据就不会因为容器删除而丢失了!
2、数据卷基本作用
数据卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System , 提供一些用于持续存储或共享数据的特性。卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
3、数据卷基本特点
- 数据卷可在容器之间共享或重用数据,卷中的更改可以直接生效。
- 数据卷中的更改不会包含在镜像的更新中。
- 数据卷的生命周期一直持续到没有容器使用它为止。
总结: 就是容器的持久化,以及容器间的继承和数据共享!!!
1.2 使用数据卷
方式一:直接使用命令挂载 -v
1、基本语法
docker run -it -v 主机目录:容器内目录 镜像名
2、测试容器和宿主机之间数据共享:在容器中,创建的会在宿主机中看到!
docker run -it -v /home/test:/home centos:7 /bin/bash
3、查看数据卷是否挂载成功: docker inspect 容器id
docker inspect 0fd75c2bddab
4、测试容器停止退出后,主机修改数据是否会同步?
- 停止容器。
- 在宿主机上修改文件,增加些内容。
- 启动刚才停止的容器。
- 然后查看对应的文件,发现数据依旧同步。
1.3 匿名和具名挂载
1.3.1 匿名卷挂载
1、基本语法-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
2、查看卷命令docker volume ls
, 匿名挂载的缺点,就是不好维护。
1.3.2 具名卷挂载
1、基本语法: -v 卷名:/容器内路径
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx nginx
2、查看数据卷名
docker volume ls
3、查看挂载路径
4、总结
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/????/_data
。
通过具名挂载可以方便的找到自己的数据卷,大多数情况在使用的是具名挂载。
## 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!!
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径::容器内路径 #指定路径挂载!!
1.3.3 拓展卷挂载
1、通过 -v
容器内路径, ro rw
改变读写权限。
ro: readonly #只读操作
rw: readwrite # 可读可写
2、一旦这个设置了容器权限,容器对挂载出来的内容就有限定了
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:rw nginx
注意:只要看到ro
就说明这个路径只能通过宿主机来操作,容器内部是无法操作的。
1.4 Docker File初体验
DockerFile 是用来构建Docker镜像的构建文件,是由一些列命令和参数构成的脚本。
1、在宿主机 /home 目录下新建一个 docker-test-volume
文件夹。
mkdir docker-test-volume
2、进入docker-test-volume
创建dockerfile1
[root@Linux docker-test-volume]# vim dockerfile1
[root@Linux docker-test-volume]# cat dockerfile1
FROM centos
# 匿名挂载
VOLUME ["/dockerVolume1", "/dockerVolume2"]
CMD echo "-------end------"
CMD /bin/bash
[root@Linux docker-test-volume]#
3、build后生成镜像,获得一个新镜像 guardwhy/centos:7
docker build -f dockerfile1 -t guardwhy/centos:7 .
4、查看生成的镜像
[root@Linux docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
guardwhy/centos latest 086cf1afb24c 5 minutes ago 209MB
centos latest 300e315adb2f 6 months ago 209MB
5、启动容器
docker run -it 086cf1afb24c /bin/bash
6、在数据卷中新建一个spring.java
文件
[root@6c0b413d6544 /]# ls
bin dockerVolume1 etc lib lost+found mnt proc run srv tmp var
dev dockerVolume2 home lib64 media opt root sbin sys usr
[root@6c0b413d6544 /]# cd dockerVolume1
[root@6c0b413d6544 dockerVolume1]# touch spring.java
[root@6c0b413d6544 dockerVolume1]# ls -l
total 0
-rw-r--r--. 1 root root 0 Jun 9 16:36 spring.java
[root@6c0b413d6544 dockerVolume1]#
6、在查看下这个容器的信息,查看卷挂载的路径。
[
"Mounts": [
{
"Type": "volume",
"Name": "e475a2359f45348bbc991b1518f95d18a9373b8cc878d886b38de35adbf10a22",
"Source": "/var/lib/docker/volumes/e475a2359f45348bbc991b1518f95d18a9373b8cc878d886b38de35adbf10a22/_data",
"Destination": "/dockerVolume1",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "e47420ec9c9fb494119e73eed85e96a8b60f2e66947d0b6cbdf131bf08758ead",
"Source": "/var/lib/docker/volumes/e47420ec9c9fb494119e73eed85e96a8b60f2e66947d0b6cbdf131bf08758ead/_data",
"Destination": "/dockerVolume2",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
]
7、测试spring.java
是否同步!!!
执行命令,查看结果!!!
cd /var/lib/docker/volumes/e475a2359f45348bbc991b1518f95d18a9373b8cc878d886b38de35adbf10a22/_data
1.5 数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
使用上一步的镜像:guardwhy/centos
为模板,运行容器 centOS01
,centOS02
,centOS03
,这些容器都会具有容器卷。
"/dockerVolume1"
"/dockerVolume2"
容器间传递共享,多个容器同步数据
1、先启动一个父容器centOS01
,然后在dockerVolume1
新增文件。
docker run -it --name centOS01 guardwhy/centos
退出容器不停止命令:ctrl+P+Q
2、创建centOS02
,让它继承(关键字: --volumes-from
)centOS01
容器,然后在dockerVolume1
新增文件spring.java
,分别查看两个容器。
docker run -it --name centOS02 --volumes-from centOS01 guardwhy/centos
进入两个容器中,发现文件同步(实现文件共享)!!!
2、创建centOS03
,让它继承(关键字: --volumes-from
)centOS01
容器,然后在dockerVolume1
新增文件SpringMVC.java
,分别查看这三个容器。
docker run -it --name centOS03 --volumes-from centOS01 guardwhy/centos
3、删除容器centOS1
,查看其它容器还能否访问!!!
4、小结
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止,但是一旦持久化到了本地,这个时候本地的数据是不会删除的!!!