Docker的持久化存储和数据共享,是课程第五章的内容

1.本章介绍

我们知道镜像是只读的,也就是我们是无法在镜像里面写入数据的。但是容器层是可以写的,但是容器层写的数据,只在容器里面,我们要是删除这个容器,之前写入的数据也会被一起删除。所以我们需要Data Volume来保存数据。

1.1Docker持久化数据的方案

  1. 基于本地文件系统的Volume
    可以在执行docker create或docker run时,通过-v参数将主机的目录作为容器的数据卷。这部分功能便是基于本地文件系统的volume管理
  2. 基于plugin的Volume
    支持第三方的存储方案,比如NAS,aws

1.2Volume的类型

  1. 受管理的data Volume,由docker后台自动创建
  2. 绑定挂载的Volume,具体挂载位置可以由用户指定

2.本章实验环境介绍

3.数据持久化之Data Volume

volume

Dockerfile里面定义了:
VOLUME /var/lib/mysql
这样容器启动的时候就会创建一个docker volume了,容器的相应数据就会存储在这个volume里面,可以有多个volume

相关命令:

  • docker volume ls,查看所有的volume
  • docker volume inspect volume_id,查看一个volume的详细信息,需要注意,这个命令输入短的id没有用,一定要输入完整的id
  • docker volume rm volume_id,删除一个volume
  • docker rm -f container_id,强制停止一个容器并删除
  • docker run -d --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql,容器创建的时候会自动创建一个volume,volume的name是随机的 5.docker run -d -v mysql:/var/lib/mysql –name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql,这个命令里面使用-v mysql:/var/lib/mysql,mysql会是volume的名字,不再是docker自动生成的那个name了,/var/lib/mysql是镜像的Dockerfile里面VOLUME后面跟随的路径,也就是docker容器里面的路径。也就是这个路径的VOLUME生成名字会是mysql。

NOTICE

  1. 删除容器之后,volume是不会删除的
  2. -v参数,比如-v mysql:/var/lib/mysql,如果还没有volume的name为mysql,那么就是新建一个volume,但是要是已经存在了,那么用这个命令的时候,也就是新开的容器的/var/lib/mysql会挂载到这个volume上

4.数据持久化之Bind Mouting

mouting /home/aaa是本机的路径,/root/aaa是容器里面的路径。两个就映射了,两边的数据都是一样的

相关命令:

  • docker run -d -v $(pwd):/usr/share/nginx/html --name web nginx,这个是把本机的当前目录,$(pwd),和容器里面的/usr/share/nginx/html相互映射

5.开发者利器-Docker+Bind Mout

我们在开发的时候,使用bind mouting这种方式是比较方便的,因为我们在本机的一旦修改了,docker里面的文件也会一样。