Docker-容器数据卷

Posted guardwhy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker-容器数据卷相关的知识,希望对你有一定的参考价值。

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 为模板,运行容器 centOS01centOS02centOS03,这些容器都会具有容器卷。

"/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、小结

容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止,但是一旦持久化到了本地,这个时候本地的数据是不会删除的!!!

以上是关于Docker-容器数据卷的主要内容,如果未能解决你的问题,请参考以下文章

Docker学习笔记(8-2)Docker - 数据卷容器

docker数据卷容器

Docker 数据卷

docker数据卷容器

Docker之七:Docker数据卷管理

06-Docker-容器数据卷