⭐容器数据卷
- 什么是容器数据卷
- 使用数据卷
- 方式一:使用命令挂载
- 实战:MySQL
- 具名和匿名挂载
- 方式二、DockerFile
- 数据卷容器
什么是容器数据卷
如果数据都在容器中,那么容器被删除后,数据就会丢失!
需求:数据可以持久化
容器之间可以有一个数据共享的技术。Docker容器中产生的数据,同步到本地。
就是目录的挂载,将容器中的目录挂载到Linux上面。
总结:容器的持久化和同步操作。容器之间也是可以数据共享的。
使用数据卷
方式一:使用命令挂载
# -v 主机目录:容器目录
docker run -it -v 主机目录:容器目录
好处:只需要在本地修改即可,容器内会自动同步。
实战:MySQL
# 获取MySQL镜像
docker pull mysql:5.7
# 运行容器,需要做数据挂载 运行mysql时需要设置mysql的密码
# -d 后台运行 -p 端口映射 -v数据卷挂载 -e环境配置 --name容器名字
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
# 启动成功后,可使用数据库软件测试链接
# Navicat链接到服务器的3310端口 ---- 3310端口与容器内的mysql的3306端口映射,这样既可连接成功。
# 在本地创建数据库,发现与容器挂载的本地目录出现了创建的数据库
即使将容器删除,挂载到本地的数据卷也不会丢失,这就是容器数据持久化功能。
具名和匿名挂载
# 匿名挂在
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的volume
docker volume ls
# 这种就是匿名挂载,我们在-v后只写容器内路径,没有写容器外路径
[root@192 data]# docker volume ls
DRIVER VOLUME NAME
local e0a347ca469211fce79e97394675e71d92a061af14502242d34735e706793089
local fe5408ab3970c74557bf800362dc9b4524642c74adacdf1580cf987fa04111ad
# 具名挂载
-v 卷名:容器内路径
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
# 查看volume
docker volume ls
# 会发现juming-nginx卷
[root@192 data]# docker volume ls
DRIVER VOLUME NAME
local e0a347ca469211fce79e97394675e71d92a061af14502242d34735e706793089
local fe5408ab3970c74557bf800362dc9b4524642c74adacdf1580cf987fa04111ad
local juming-nginx
# 查看juming-nginx
[root@192 data]# docker inspect juming-nginx
[
{
"CreatedAt": "2020-11-17T13:40:42+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有的docker容器内的卷,没有指定目录的情况下都是在:/var/lib/docker/volumes/卷名/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况使用的就是具名挂载
区分:
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v 本机路径:容器内路径 # 指定路径挂载
拓展
# 通过-v容器内路径:ro/rw 可以改变读写权限
ro # 只读
rw # 读写
# 一旦设置了容器权限,容器对我们挂载出来的内容就有了限制
docker run -d -P --name nginx03 -v juming-nginx03:/etc/nginx:ro nginx
docker run -d -P --name nginx03 -v juming-nginx03:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的。
方式二、DockerFile
DockerFile就是用来构建docker镜像的构建文件。命令脚本。通过这个脚本可以生成镜像。
# 1.创建一个dockerfile文件,名字随意,建议dockerfile
vim dockerfile1
# 文件内容如下
FROM centos
VOLUME ["volume01", "volume02"]
CMD echo "---end---"
CMD /bin/bash
# 这里的每一个命令都是镜像的一层
# 2.创建镜像
docker build -f dockerfile1 -t chenjiahe/centos:1.0 .
# 3.查看镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
chenjiahe/centos 1.0 6df3696546ea 28 seconds ago 215MB
# 4.启动自己写的容器
docker run -it 6df3696546ea /bin/bash
这两个目录就是我们生成镜像的时候自动挂载的,数据卷目录。
数据卷容器
容器与容器之间数据共享
# 1.使用刚才自己创建的镜像先启动一个容器命名为docker01
docker run -it --name docker01 chenjiahe-centos:1.0 /bin/bash
# 容器中存在先前创建镜像时挂载的数据卷
volume01
volume02
# 2.再使用镜像启动第二个容器命名为docker02,并且使用--volumes-from与docker01挂载
docker run -it --name docker02 --volumes-from docker01 chenjiahe-centos:1.0 /bin/bash
# docker02中也存在volume01和volume02这两个数据卷
# 此时这两个容器的数据卷数据就共享了
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。但是一旦你持久化到了本地,此时本地的数据是不会删除的。