⭐容器数据卷

  • 什么是容器数据卷
  • 使用数据卷
  • 方式一:使用命令挂载
  • 实战: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 .

docker 容器连不上数据库 docker容器 连接容器数据库_nginx

# 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

docker 容器连不上数据库 docker容器 连接容器数据库_centos_02

这两个目录就是我们生成镜像的时候自动挂载的,数据卷目录。

数据卷容器

容器与容器之间数据共享

# 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这两个数据卷

# 此时这两个容器的数据卷数据就共享了

结论:

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。但是一旦你持久化到了本地,此时本地的数据是不会删除的。