当以默认的方式创建容器时,容器中的数据无法直接和其他容器或宿主机共享。为了解决这个问题需要学习一些Docker 存储卷的知识。
Docker提供了三种存储的方式。
- bind mount共享宿主机文件目录
- volume共享docker存储卷
- tmpfs mount共享内存
volume*
volume方式是容器间数据分享的推荐方式。它的运行和管理都是由docker负责。
添加
此处的添加可以分为两层意思,第一层如何添加一个volume,第二层如何向容器中添加一个volume。
添加一个volume
利用`docker volume create`指令创建一个volume,当不指定volume名称时,docker会以一个volume id位置volume的名称。
如下:
当指定volume名称时,docker将创建一个指定名称的volume。
当volume名称相同时,docker不会创建一个新的,而是利用之前创建的volume。
向容器中添加volume
向容器中有两种选项可供选择一种是利用--mount选项,另一种是利用-v选项。
--mount方式
--mount选项支持详细的设定绑定方式,type设定绑定的类型,source设定卷名称,target设定绑定到容器的哪个目录下。
-v方式
-v选项支持简洁的设定绑定方式,利用:作为分隔,可以分成三个部分。第一个部分为volume的名称,当使用匿名volume时可以忽略。第二个部分为绑定到容器的哪个目录下。第三个部分为一些选项。
查询
查看有哪些volume
利用`docker volume ls`指令可以查看系统中所有的volume情况。
查看详细信息
利用`docker volume inspect <volumeName>`指令可以查看某个volume的详细信息。
删除volume
删除volume的前提条件是没有容器正在使用(不管容器是否在运行)该volume,否则会报错无法删除volume。
利用`docker volume rm <volumeName>`指令可以删除指定的volume名称。
备份&还原
备份
就是将容器中volume绑定的目录进行tar打包。
bash
// 将容器中volume绑定的目录打包成压缩文件
tar cfv backup.tar ./mysql
// 将压缩文件转移到宿主机中
docker cp <contianerId>:<tarFilePath> <hostPath>
还原
就是创建一个新的绑定匿名volume的容器,并将tar解压到指定的目录下即可
bash
// 创建一个绑定目录一致的匿名volume容器
docker container create -e MYSQL_ROOT_PASSWORD=SECRET -v /app mysql:5.7
// 将宿主机中backup.tar文件复制到容器的绑定目录下
docker cp backup.tar <contianerId>:<path>
// 进入容器,并将backup.tar文件解压
docker exec -it <containerId> bash
cd <path>
tar xvf backup.tar
bind mount
bind mount是宿主机和容器之间共享数据的方式。它的作用就是将宿主机中的特定目录或文件绑定到容器的特定目录中。
添加
- 此处向容器中添bind mount的方式和添加volume的方式非常相似,不同点在于绑定的不是volume名称而是一个宿主机中特定的目录。同样也存在--mount和-v两种方式,向容器中绑定共享的目录。
bash
## 利用--mount方式进行添加
docker container create
-e MYSQL_ROOT_PASSWORD=SECRET
--mount type=bind,source=<hostPath>,target=<containerPath>
mysql:5.7
## 利用-v方式进行添加
docker container create
-e MYSQL_ROOT_PASSWORD=SECRET
-v <hostPath>:<containerPath>
mysql:5.7
查询
此处也是通过docker container inspect <containerID>指令查看某个容器下Mounts的信息来查看其共享数据的信息。
Volume和bind mount比较
|------------------|-------------------|---------------------------|
| 不同点 | bind mount | volume |
| volume位置 | 可任意指定 | /var/lib/docker/volumes/下 |
| 对已有mount point影响 | 隐藏并替换为volume | 原有数据复制到volume |
| 是否支持单个文件 | 支持 | 不支持,只能是目录 |
| 权限控制 | 可设置为只读,默认为读写权限 | 无控制,均为读写权限 |
| 移植性 | 移植性弱,与host path绑定 | 移植性强,无须指定host目录 |
tmpfs mount
tmpfs表示将信息临时存储起来,并保存在宿主机的内存中。需要注意的两点:
- 此处保存的数据无法持久化,只能是临时存储
- 目前只支持宿主机是linux系统
添加
也是通过--mount的方式进行添加,不同点在于其类型为tmpfs,且没有source项
bash
docker container create
--mount type=tmpfs,target=/app
-e MYSQL_ROOT_PASSWORD=SECRET
mysql:5.7
容器间共享数据的方法
bind mount方式
就是将需要共享的数据存储在宿主机特定目录下,然后需要访问这部分数据的容器都通过bind mount绑定这个数据。
volume container方式
就是说创建一个专门为其他容器提供volume的容器,它可以是bind mount方式,也可以是volume方式。
bash
## 创建一个volume container并绑定多个形式的共享数据
docker container create
-v ~/hostData:/hostData
-v containerData:/containerData
--name vc_data
<image_name>
然后其他容器利用--volumes-from参数绑定到volume container上即可,这样所有这样创建的容器就都有了volume container一样的数据了。
bash
## 创建与volume container共享数据的容器
docker container create
--volumes-from <volume container name>
<image_name>