赞
踩
问题发现
什么是数据卷
数据卷是宿主机中一个可供一个或多个容器使用的特殊目录,它绕过 UFS(联合文件系统),可以提供很多有用的特性:
数据卷的使用,类似于 Linux 下对目录或文件进行 mount(磁盘挂载)。
数据卷的作用
创建数据卷
在用 docker run 命令的时候,使用 -v 标记来创建一个数据卷并挂载到容器里。
下面创建一个 centos容器,把宿主机的 /home/ceshi 目录挂载到容器内的 /home 目录:
docker run -it -v /home/ceshi:/home centos /bin/bash
注:
1、上面是以目录作为数据卷,也可以使用文件作为数据卷,如使用 ceshi.md:
docker run -it -v /home/ceshi.md:/home centos /bin/bash
2、宿主机目录的路径必须是绝对路径,如果目录不存在 Docker 会自动创建。
docker inspect 查看 centos容器的元数据:
docker inspect 8347cbed874d
数据卷成功挂载:
文件同步测试
1、在容器的 /home下创建一个文件 test.md:
2、查看宿主机的数据卷 /home/ceshi 目录:
文件同步成功。
3、如果容器停止运行了,在宿主机修改了文件,也会同步到容器中。
共享数据卷
多个容器的卷使用同一个主机目录,例如:
docker run –it --name c1 -v /home/v1:/home centos /bin/bash
docker run –it --name c2 -v /home/v1:/home centos /bin/bash
1、下载mysql5.7镜像:
docker pull mysql:5.7
2、运行创建 mysql 容器,挂载两个数据卷,创建mysql密码(123456):
docker run -d -p 9200:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/date:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name=mysql01 mysql:5.7
3、本地启动SQLyog连接数据库,SQLyog连接服务器的9200端口,而9200端口又映射到容器内mysql的3306端口,从而连接上mysql。
连接数据库成功:
4、在本地SQLyog创建一个数据库test:
5.查看服务器上的数据卷目录 /home/mysql/date:
数据立即同步到服务器上。
6、查看容器上被挂载的目录 /var/lib/mysql:
数据也立即同步到容器上。
7、哪怕我们删除mysql了容器,数据也会在服务器的数据卷上保存:
删除容器:
docker rm -f mysql01
查看服务器上的数据卷目录 /home/mysql/date:
数据依然存在于服务器上;另外,删除容器后,SQLyog也就不能连接mysql服务了。
匿名挂载
挂载时没有对外部的数据卷文件命名,称之为匿名挂载(内外部时针对docker来说的)。在 -v 后只写了容器内的路径,没有写宿主机数据卷路径,如:
docker run -d -P --name nginx01 -v /etc/nginx nginx
使用 docker volume ls 命令查看当前docker中挂载的所有数据卷:
具名挂载(常用)
具名挂载:在 -v 后写上要挂载数据卷的命名,如:
# -v 数据卷名:容器内路径
docker run -d -P --name nginx02 -v juming-nginx02:/etc/nginx nginx
使用 docker volume ls 命令查看当前docker中挂载的所有数据卷:
查看匿名挂载数据卷的路径
命令:docker volume inspect VOLUME NAME
查看匿名挂载时数据卷的路径:
docker volume inspect efcc648ba9b53a1975c3e88eed1570831fb194a2395d9c3a55ec949b373673d6
在服务器上进入匿名挂载数据卷的文件目录:
查看具名挂载时数据卷的路径
命令:docker volume inspect VOLUME NAME
查看匿名挂载时数据卷的路径:
docker volume inspect juming-nginx02
在服务器上进入具名挂载数据卷的文件目录:
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
编写Dockerfile 构建镜像,并在构建镜像的过程中实现数据卷的挂载:
1、创建一个存放 Dockerfile 文本文件的目录,并在里面编写 Dockerfile 文本文件 :
mkdir docker-test-volume
2、编写 Dockerfile 文本文件
FROM centos #基础镜像信息
VOLUME ["/volume01","/volume02"] #匿名挂载,指定容器内的路径
CMD echo "=======end=======" #镜像操作指令
CMD /bin/bash #容器启动时执行指令
3、执行 Dockerfile,构建镜像
# -f 指定要使用的Dockerfile路径
# -t 镜像的名字及标签,通常 name:tag 或者 name 格式
docker build -f dockerfile1 -t cheng/centos:1.0 .
4、查看上面创建的镜像
镜像构建完成。
5、以上面的镜像创建并运行容器
docker run -it ebc9aefdc83b /bin/bash
6、进入 cheng/centos:1.0 容器后,可以看到创建镜像时供数据卷挂载的目录 volume01 和 volume02
在 volume01 中创建一个文件,进行同步测试
touch test.txt
这是容器内部和数据卷挂载的文件目录,容器外部肯定也有一个与之同步的数据卷目录。
查看容器的元数据,找到数据卷路径:
docker inspect 60c0cc9d5fd7
进入挂载到 volume01 目录的数据卷:
发现在容器内创建的test.txt文件同步到数据卷中了。
如果有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。
数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
1、首先创建一个容器 docker01:
docker run -it --name docker01 cheng/centos:1.0
2、再创建一个容器 docker02,在docker02容器中使用 –volumes-from 来挂载 docker01容器中的数据卷
docker run -it --name docker02 --volumes-from docker01 cheng/centos:1.0
3、在docker01容器的volume01目录下新建一个文件:
4、查看docker02容器的volume01目录:
发现docker01容器内的数据同步到docker02容器中,这里的docker01容器就叫做数据卷容器。
5、如果想再创建一个容器docker03 ,来挂载 docker01容器中的数据卷:
docker run -it --name docker03 --volumes-from docker01 cheng/centos:1.0
6、如果把数据卷容器docker01删除了,docker02和docker03上的同步数据还会存在。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。