Docker容器数据卷及使用详解

一、什么是容器数据卷

docker理念:将应用和环境打包成一个镜像。

那数据保存在哪里呢?
如果数据都在容器中,那么我们容器删除,数据就会丢失。(比如在docker中安装了MySQL,如果容器删除了,数据就没了)
需求:数据可以持久化且MySQL数据可以存储在本地。
容器之间可以有一个数据共享的技术,将Docker容器中产生的数据,同步到本地,这就是卷技术。(其实就是目录的挂载,将我们容器内的目录,挂载到Linux上面)

Docker容器数据卷及使用详解_第1张图片
总结:实现容器的持久化和同步操作,且容器间也是可以数据共享的。(多个容器绑定同一个目录,比如上图中的/home/mysql)

二、数据卷的使用

直接使用命令挂载 -v

-v, --volume list          Bind mount a volume
docker run -it -v 主机目录:容器内目录  -p 主机端口:容器内端口
➜ ~ docker run -it -v /home/ceshi:/home centos /bin/bash
#通过 docker inspect 容器id 查看

在这里插入图片描述
在这里插入图片描述
检查是否挂在成功:
在这里插入图片描述
Docker容器数据卷及使用详解_第2张图片
此时在容器中存放的文件会自动同步到本机,在本机中存放的文件也会自动同步到容器中。

测试文件的同步:
在这里插入图片描述
在这里插入图片描述
若在主机中修改文件:
先停止容器
在这里插入图片描述
在这里插入图片描述
在容器中:
Docker容器数据卷及使用详解_第3张图片
好处:我们以后修改只需要在本地修改即可,容器内会自动同步。

三、MySQL----实现数据持久化

MySQL的数据存放在data目录下
在这里插入图片描述
运行容器时需要做数据挂载 (安装启动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=1/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

在这里插入图片描述
Docker容器数据卷及使用详解_第4张图片

打开Navicat进行测试连接:
Docker容器数据卷及使用详解_第5张图片
Navicat----连接到服务器的3310端口----和容器内的3306端口映射

此时在本地创建数据库test,Linux服务器和docker中都映射了test数据库。所以之后的持久化是绑定到本地的

假设我们将容器删除,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能。
在这里插入图片描述
删除后查看:
在这里插入图片描述
在这里插入图片描述

四、具名和匿名挂载

1. 匿名挂载

# -v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx

# 查看所有的卷的情况
docker volume ls  

Docker容器数据卷及使用详解_第6张图片
这种就是匿名挂载,我们在 -v只写了容器内的路径,没有写容器外的路径。

2. 具名挂载

# -v 卷名:容器内路径
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

docker volume ls         
DRIVER       VOLUME NAME
local        juming-nginx

# 查看一下这个卷
docker volume inspect juming-nginx

Docker容器数据卷及使用详解_第7张图片

所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data下。

#指定路径挂载 docker volume ls 是查看不到的
-v /宿主机路径:容器内路径

五、拓展

# 通过 -v 容器内路径:ro rw 改变读写权限
ro #readonly 只读
rw #readwrite 可读可写
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作

六、通过dockerfile来实现挂载

dockerfile详见 DockerFile的构建和使用

简单理解:Dockerfile就是用来构建docker镜像的构建文件,是一段命令脚本。
通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令就是镜像的一层。

# 创建一个dockerfile文件,名字可以随便取,建议Dockerfile
cd /home/docker-test-volume
vim docerfile01

# 文件中的内容 指令(大写) 参数   ----(这里的每个命令,就是镜像的一层。)
FROM centos
VOLUME ["volume01","volume02"]   #挂载
CMD echo "----end----"    
CMD /bin/bash

#构建镜像
docker build -f /home/docker-test-volume/docerfile01 -t jess/centos .

#查看镜像
docker images

七、数据卷容器

若需要在多个容器之间共享持续更新的数据,可使用数据卷容器。
数据卷容器也是容器,它专门提供数据卷以供其他容器挂载。
数据卷容器:使用特定容器维护数据卷

Docker容器数据卷及使用详解_第8张图片

docker run it --name docker01 jess/centos #启动容器docker01
docker run it --name docker02 --volumes-from docker01 jess/centos #启动容器docker02,挂载docker01 
#此时若在docker01里面创建一个文件,docker02也会相应的生成一个文件(同步),docker01就是数据卷容器

docker run it --name docker03 --volumes-from docker01 jess/centos #启动容器docker03,挂载docker01 
#通过--volumes-from实现容器中的数据共享

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

你可能感兴趣的:(Docker,docker,centos)