文章目录

  • Docker——数据卷的概述和使用
  • 1、数据卷简介
  • 2、-v 创建数据卷
  • 3、实战:MySQL 同步数据
  • 4、具名挂载和匿名挂载
  • 5、Dockerfile 创建数据卷
  • 6、数据卷容器


Docker——数据卷的概述和使用

1、数据卷简介

问题发现

  • Docker 容器删除后,在容器中产生的数据也会随之销毁,类似删库跑路,不安全
  • Docker 容器怎么和外部机器交换文件
  • 容器之间怎么进行数据交互
  • 解决:使用数据卷

什么是数据卷

数据卷是宿主机中一个可供一个或多个容器使用的特殊目录,它绕过 UFS(联合文件系统),可以提供很多有用的特性:

  • 一个数据卷可以在多个容器之间共享和重用
  • 当容器和数据卷绑定后,对数据卷的修改会立即同步
  • 对数据卷的更新,不会影响镜像
  • 卷会一直存在,直到没有容器使用
  • 一个容器可以被挂到多个数据卷

数据卷的使用,类似于 Linux 下对目录或文件进行 mount(磁盘挂载)。

数据卷的作用

  • 容器数据持久化
  • 外部机器和容器间接通信
  • 容器之间数据交换

2、-v 创建数据卷

创建数据卷

在用 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 运行 本机数据卷在哪找 docker中的数据卷_镜像

docker inspect 查看 centos容器的元数据:

docker inspect 8347cbed874d

数据卷成功挂载:

docker 运行 本机数据卷在哪找 docker中的数据卷_run_02

文件同步测试

1、在容器的 /home下创建一个文件 test.md:

docker 运行 本机数据卷在哪找 docker中的数据卷_docker 运行 本机数据卷在哪找_03

2、查看宿主机的数据卷 /home/ceshi 目录:

docker 运行 本机数据卷在哪找 docker中的数据卷_docker 运行 本机数据卷在哪找_04

文件同步成功。

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

3、实战:MySQL 同步数据

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。

docker 运行 本机数据卷在哪找 docker中的数据卷_run_05

连接数据库成功:

docker 运行 本机数据卷在哪找 docker中的数据卷_Docker_06

4、在本地SQLyog创建一个数据库test:

docker 运行 本机数据卷在哪找 docker中的数据卷_docker 运行 本机数据卷在哪找_07

5.查看服务器上的数据卷目录 /home/mysql/date:

docker 运行 本机数据卷在哪找 docker中的数据卷_镜像_08

数据立即同步到服务器上。

6、查看容器上被挂载的目录 /var/lib/mysql:

docker 运行 本机数据卷在哪找 docker中的数据卷_docker 运行 本机数据卷在哪找_09

数据也立即同步到容器上。

7、哪怕我们删除mysql了容器,数据也会在服务器的数据卷上保存:

删除容器:

docker rm -f mysql01

查看服务器上的数据卷目录 /home/mysql/date:

docker 运行 本机数据卷在哪找 docker中的数据卷_Docker_10

数据依然存在于服务器上;另外,删除容器后,SQLyog也就不能连接mysql服务了。

4、具名挂载和匿名挂载

匿名挂载

挂载时没有对外部的数据卷文件命名,称之为匿名挂载(内外部时针对docker来说的)。在 -v 后只写了容器内的路径,没有写宿主机数据卷路径,如:

docker run -d -P --name nginx01 -v /etc/nginx nginx

docker 运行 本机数据卷在哪找 docker中的数据卷_docker 运行 本机数据卷在哪找_11

使用 docker volume ls 命令查看当前docker中挂载的所有数据卷:

docker 运行 本机数据卷在哪找 docker中的数据卷_数据卷_12

具名挂载(常用)

具名挂载:在 -v 后写上要挂载数据卷的命名,如:

# -v 数据卷名:容器内路径
docker run -d -P --name nginx02 -v juming-nginx02:/etc/nginx nginx

docker 运行 本机数据卷在哪找 docker中的数据卷_数据卷_13

使用 docker volume ls 命令查看当前docker中挂载的所有数据卷:

docker 运行 本机数据卷在哪找 docker中的数据卷_docker 运行 本机数据卷在哪找_14

查看匿名挂载数据卷的路径

命令:docker volume inspect VOLUME NAME

查看匿名挂载时数据卷的路径:

docker volume inspect efcc648ba9b53a1975c3e88eed1570831fb194a2395d9c3a55ec949b373673d6

docker 运行 本机数据卷在哪找 docker中的数据卷_镜像_15

在服务器上进入匿名挂载数据卷的文件目录:

docker 运行 本机数据卷在哪找 docker中的数据卷_Docker_16

查看具名挂载时数据卷的路径

命令:docker volume inspect VOLUME NAME

查看匿名挂载时数据卷的路径:

docker volume inspect juming-nginx02

docker 运行 本机数据卷在哪找 docker中的数据卷_Docker_17

在服务器上进入具名挂载数据卷的文件目录:

docker 运行 本机数据卷在哪找 docker中的数据卷_docker 运行 本机数据卷在哪找_18

5、Dockerfile 创建数据卷

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

编写Dockerfile 构建镜像,并在构建镜像的过程中实现数据卷的挂载:

1、创建一个存放 Dockerfile 文本文件的目录,并在里面编写 Dockerfile 文本文件 :

mkdir docker-test-volume

docker 运行 本机数据卷在哪找 docker中的数据卷_run_19

2、编写 Dockerfile 文本文件

FROM centos  #基础镜像信息

VOLUME ["/volume01","/volume02"] #匿名挂载,指定容器内的路径

CMD echo "=======end======="  #镜像操作指令
CMD /bin/bash  #容器启动时执行指令

docker 运行 本机数据卷在哪找 docker中的数据卷_数据卷_20

3、执行 Dockerfile,构建镜像

# -f 指定要使用的Dockerfile路径
# -t 镜像的名字及标签,通常 name:tag 或者 name 格式
docker build -f dockerfile1 -t cheng/centos:1.0 .

docker 运行 本机数据卷在哪找 docker中的数据卷_run_21

4、查看上面创建的镜像

docker 运行 本机数据卷在哪找 docker中的数据卷_数据卷_22

镜像构建完成。

5、以上面的镜像创建并运行容器

docker run -it ebc9aefdc83b /bin/bash

6、进入 cheng/centos:1.0 容器后,可以看到创建镜像时供数据卷挂载的目录 volume01 和 volume02

docker 运行 本机数据卷在哪找 docker中的数据卷_docker 运行 本机数据卷在哪找_23

在 volume01 中创建一个文件,进行同步测试

touch test.txt

这是容器内部和数据卷挂载的文件目录,容器外部肯定也有一个与之同步的数据卷目录。

查看容器的元数据,找到数据卷路径:

docker inspect 60c0cc9d5fd7

docker 运行 本机数据卷在哪找 docker中的数据卷_镜像_24

docker 运行 本机数据卷在哪找 docker中的数据卷_镜像_25

进入挂载到 volume01 目录的数据卷:

docker 运行 本机数据卷在哪找 docker中的数据卷_docker 运行 本机数据卷在哪找_26

发现在容器内创建的test.txt文件同步到数据卷中了。

6、数据卷容器

如果有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。

数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。

1、首先创建一个容器 docker01:

docker run -it --name docker01 cheng/centos:1.0

docker 运行 本机数据卷在哪找 docker中的数据卷_镜像_27

2、再创建一个容器 docker02,在docker02容器中使用 –volumes-from 来挂载 docker01容器中的数据卷

docker run -it --name docker02 --volumes-from docker01 cheng/centos:1.0

docker 运行 本机数据卷在哪找 docker中的数据卷_镜像_28

3、在docker01容器的volume01目录下新建一个文件:

docker 运行 本机数据卷在哪找 docker中的数据卷_Docker_29

4、查看docker02容器的volume01目录:

docker 运行 本机数据卷在哪找 docker中的数据卷_run_30

发现docker01容器内的数据同步到docker02容器中,这里的docker01容器就叫做数据卷容器。

5、如果想再创建一个容器docker03 ,来挂载 docker01容器中的数据卷:

docker run -it --name docker03 --volumes-from docker01 cheng/centos:1.0

6、如果把数据卷容器docker01删除了,docker02和docker03上的同步数据还会存在。