Docker容器数据卷可以实现本机的本地文件和Dokcer容器里的文件夹或文件进行双向绑定,从而达到文件同步的效果,这样就不需要每次修改Docker容器配置文件就要进入容器,十分的方便快捷
1、基础概念
什么是容器数据卷?
程序运行是需要数据的,如果数据都在容器中,那么我们容器被删除了,数据就丢失了,例如,使用容器安装MySQL,容器删了,MySQL数据就没了
容器数据卷:容器之间可以有一个数据共享的技术,Docker可以将容器中产生的数据,同步到本地
为什么要用容器数据卷?
容器的持久化和同步操作,容器之间也是可以进行数据共享的
使用数据卷
使用centos镜像生成容器并实现数据卷挂载到本地
docker run -it -v E:/Docker/test:/home centos /bin/bash
# 查看是否挂载成功
docker ps
docker inspect dea61ecc553c
"Mounts": [
{
"Type": "bind",
"Source": "E:/Docker/test",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
# 容器内新建文件测试
touch test.java
ls
# 本地查看文件是否存在,结果是存在test.java的
这两个文件进行双向绑定,无论是在容器内修改,还是在本机修改,另外一个文件都会发生变化
2、实战:MySQL同步数据
# 启动mysql镜像
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名称
docker run -d -p 3310:3306 -v E:/Docker/MySQL/conf/:/etc/conf/conf.d -v E:/Docker/MySQL/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
docker ps
注意:此时由于是本机启动的docker启动的MySQL镜像,连接MySQL服务时,需要使用本机IP地址进行连接
假设将容器彻底删除,本地的数据文件依旧还存在,不会因为容器的删除而丢失数据。
3、具名挂载和匿名挂载
# 匿名挂载
docker run -d -P --name nginx02 -v /etc/nginx nginx
docker volume --help
# 参数
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
# 查看本地所有 volume 情况
docker volume ls
# 结果
DRIVER VOLUME NAME
local 5a9949ed0f54f12a8f49c89c689a0a29ea814f4e38989376398dde2c1004bba8
local 8ffd4a5aedeacc54d8473748dbed1d6fa90ef929df40e7b9e84ed83b34d1dc7d
local b54f08994daf37d3db852aaa8f14ec97b07f125daf24524f2d2bfb9fc3163744
# 查看本地 volume的具体情况
docker volume inspect [VOLUME NAME]
# 结果
[
{
"CreatedAt": "2022-03-17T01:28:53Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/8ffd4a5aedeacc54d8473748dbed1d6fa90ef929df40e7b9e84ed83b34d1dc7d/_data",
"Name": "8ffd4a5aedeacc54d8473748dbed1d6fa90ef929df40e7b9e84ed83b34d1dc7d",
"Options": null,
"Scope": "local"
}
]
# 具名挂载
docker run -d -P --name nginx03 -v nginx03:/etc/nginx nginx
所有未指定目录的docker容器卷,都会放在 /var/lib/docker/volumes/xxx/_data 目录下
-v 容器内路径
-v 卷名:容器内路径
-v 主机路径:容器内路径
-v E:/Docker/MySQL/data:/var/lib/mysql
-v /e/Docker/MySQL/data:/var/lib/mysql
-v 主机路径:容器内路径:ro # 容器内只读
-v 主机路径:容器内路径:rw # 容器内可读可写
4、初识DockerFile
DockerFile就是用来构建Docker镜像的构建文件
DockerFile文件如下所示
# 创建一段脚本文件dockerfile01
# 这里的每个命令都是镜像的一层
FROM centos
VOLUME {"volume01","volume02"}
CMD echo "-----end-----"
CMD /bin/bash
# 运行生成镜像
docker build -f /home/docker-test/dockerfile01 -t huzeyo/centos:1.0 .
使用数据卷甚至可以让多个MySQL同步数据
5、数据卷容器
docker run -d -v E:/Docker/centos/data/:/home --name docker01 centos
docker run -d --name docker02 --volumes-from docker01 centos
docker run -d --name docker03 --volumes-from docker01 centos
这里的docker01叫做数据卷容器
如果将docker01停止并删除,docker02和docker03文件依旧存在
# 两个MySQL共享同步数据
docker run -d -p 3310:3306 -v E:/Docker/MySQL/conf/:/etc/conf/conf.d -v E:/Docker/MySQL/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql