Docker(5)---数据卷

在这里插入图片描述

上一篇:Docker(4)—镜像

1. 如何保证数据持久化?

  到这里我们应该知道,docker技术就是使用下载好的镜像文件生成运行实例—容器,也就是说镜像文件相当于是一个模板,比如mysql的镜像文件,无论在docker上面运行多少次mysql,使用的始终是下载好的同一个mysql镜像文件。那我运行期间产生的数据怎么保存?第二次运行的时候想使用第一次运行期间产生的数据怎么办?

  在Docker中,数据卷提供数据持久化功能。数据卷呈现为一种目录或者文件的形式存在于一个或者多个容器中,由docker挂载到容器,但是不属于联合文件系统的一部分,所以当docker关闭或者删除容器的时候,不会影响到数据卷中的数据。数据卷可以用于存储数据,也可以用来在容器间进行数据共享。

2. Dockerfile保留字指令

指令 描述
FROM 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 容器构建时需要运行的命令
EXPOSE 当前容器对外暴露出的端口
WORKDIR 指定在创建容器后,终端默认登录进来工作的目录,一个落脚点
ENV 用来在构建镜像过程中设置环境变量
ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置 {COPY src dest}
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定一个容器启动时要运行的命令。Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换。
ENTRYPOINT 指定一个容器启动时要运行的命令。ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。
ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发。

3. 数据卷特点?

  • 数据卷可以在容器间共享或者重用数据
  • 数据卷中的更改不会包含在容器的更新中
  • 数据卷中的更改可以直接生效
  • 数据卷的生命周期一直持续到没有容器使用它为止

3. 实现宿主机与容器之间的数据共享?

  在这里需要明确两个概念:
1. 宿主机:
  宿主机指的就是我们通过VMWare-----》CentOs的方式进入的Linux系统就是我们的宿主机。
2. 容器
  就是宿主机上拉取的镜像文件生成的运行实例~

需求:
  现在我有一个centos镜像,希望centos镜像运行起来的时候其containerdata目录与宿主机的mydata两个目录之间能够进行数据共享;

命令:
  docker run -it -v 宿主机中的共享目录(mydata)路径:容器中的共享目录(containerdata)的路径 容器名

示例:
  比如mydata在宿主机的根目录下(/mydata),containerdata在容器的根目录下(/containerdata

下图是宿主机的根目录,现在没有mydata文件夹
在这里插入图片描述
下图是容器centos的根目录,现在也没有containerdata文件夹
在这里插入图片描述
1.首先进行目录绑定:

docker run -it -v /mydata:/containerdata centos

2.查看宿主机和容器的绑定关系

docker inspect 容器ID

在这里插入图片描述
3.查看宿主机和容器中是否分别有mydatacontainerdata文件夹

宿主机:
在这里插入图片描述
容器:
在这里插入图片描述
现在在mydata目录中创建一个文档:

扫描二维码关注公众号,回复: 10726578 查看本文章
[root@bogon mydata]# touch file.txt
[root@bogon mydata]# ll
总用量 0
-rw-r--r--. 1 root root 0 3月  22 14:57 file.txt
[root@bogon mydata]# 

既然mydata目录和centos的容器中的containerdata目录进行了数据共享,那么现在containerdata目录下应该也有一个file.txt文档。查看containerdata目录:

[root@7453e78d6615 /]# cd containerdata/
[root@7453e78d6615 containerdata]# ls -l
total 0
-rw-r--r--. 1 root root 0 Mar 22 06:57 file.txt
[root@7453e78d6615 containerdata]# 

发现containerdata目录下确实有file.txt文档,现在通过容器编辑该文档:
在这里插入图片描述
在该文档中输入一段话,按照数据共享的原理,在宿主机的mydata目录下的file.txt文档中应该也会有这样一句话:
在这里插入图片描述
此时再次查看宿主机的containerdata下的file.txt
在这里插入图片描述
到这里就实现了宿主机与容器之间的数据共享~

注意:

  通过上面的绑定操作之后,即使我们的容器关闭运行了,但是如果我们在宿主机的mydata目录下进行的操作依然会被同步到与其绑定的centos镜像中的containerdata目录下:

示例:

  关闭centos的运行并退出:`

在这里插入图片描述
查看此时运行的镜像文件:
在这里插入图片描述
确认上面的centos镜像文件已经退出运行了~
此时在宿主机的mydata目录下创建一个file001.txt文件,并添加内容:this content is edited in the host
在这里插入图片描述
此时再运行centos镜像文件,到containerdata目录下查看:
查看上次关闭的centos镜像ID:docker ps -l
在这里插入图片描述
重新启动上次关闭的centos镜像文件:docker start 镜像ID

在这里插入图片描述

进入处于运行状态的centos容器:docker attach 镜像ID
在这里插入图片描述
查看containerdata目录下是否有新增的file001.txt文档:

[root@e2fde7599c8b /]# cd containerdata/
[root@e2fde7599c8b containerdata]# ls -l
total 8
-rw-r--r--. 1 root root 38 Mar 22 07:22 file.txt
-rw-r--r--. 1 root root 35 Mar 22 07:13 file001.txt
[root@e2fde7599c8b containerdata]# cat file001.txt 

this content is edited in the host

[root@e2fde7599c8b containerdata]# 

发现我们在宿主机上新建的file001.txt文档以及里面的数据同步到了centos容器相应的绑定位置;

4. 宿主机与容器数据共享的时候添加权限

宿主机与容器进行数据共享的目录绑定命令:

docker run -it -v /宿主机共享文件的绝对路径:/容器共享文件的绝对路径 :ro 镜像名

注:ro就是read only(只读权限)

通过以上命令进行共享数据目录绑定之后,我们可以从宿主机上写数据(增删改),而容器上只能读数据

发布了117 篇原创文章 · 获赞 57 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43655835/article/details/104944691