docker学习(一)容器数据卷与数据卷容器


title: docker学习(一)容器数据卷与数据卷容器
date: 2020-07-15 16:03:38
tags: docker

一、容器数据卷目的

使用docker容器时会有产生很多的数据,例如mysql容器,有的时候我们删除容器的时候不希望数据丢失,则需要用道容器数据卷。

可以理解为一种同步技术。实现持久化和同步操作

在这里插入图片描述

在容器中产生的数据可以同步在Linux系统中

二、实现方法

添加数据卷的方式有两种,第一种是直接通过命令行挂载,第二种是通过dockerFile添加

2.1命令行挂载

docker run -it -v  /宿主机绝对路径目录:  /容器内目录  镜像名

个命令会在宿主机和容器内分别建立两个目录,两个目录是对接的,里面的数据可以共享。如果我们不知道数据卷是否挂载成功时,我们可以通过以下方式来检查数据卷的挂载结果。

docker inspect  容器id

img

source 是主机内的地址

Destination: docker容器内的地址

一个小测试

docker pull mysql :5.7
#运行容器,需要做数据挂载! # 安装启动mysql,需要配置密码
#官方测试:
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


-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字

docker rm -f mysql01

还可以设置可读可写


ro readonly
rw readwrite

docker run -d -P --name nginx02 -v jumingaaaa :/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v jumingaaaa :/etc/nginx:rw nginx

2.2 dockerFile

dockerFile对于docker镜像而言就如同java中某个类的.class文件对应上该类的.java文件。

首先在linux服务器根目录上新建docker文件夹并建立DockerFile文件,使用volume命令(出于可移植可分享的的考虑,用以上 -v /宿主机绝对路径目录 : /容器内目录 的这种方式不能够直接在dockerFile中直接实现,因为宿主机目录是依赖于特定的宿主机的,并不能保证所有的宿主机都存在这样特定的目录)

先写一个dockerFile

FROM  镜像名

VOLUME ["/生成的目录路径"]  -- privileged=true

CMD echo "success build"

CMD /bin/bash

相当于命令行: docker run -it -v /宿主机目录路径 : /生成的目录路径

echo 是指 运行完之后打印出来一些东西

然后我们通过命令行docker build执行我们写好的dockerFile文件

(docker build和docker commit两个命令都可以建立docker镜像,docker commit 需要在容器内进行,docker build 不需要)

docker build -f  /docker/DockerFile -t  命名空间/镜像名

docker build -f dockerfile1 -t /zhanghaohui/free:1.0 .

-t target

. 是当前目录

在这里插入图片描述

执行后输入docker images就可以发现自己通过DockerFile所build的镜像,里面有挂载数据卷,那么问题来了宿主机所对应的目录是什么呢?同上,我们可以通过docker inspect来查看当前容器的Volumes,里面会有宿主机的数据卷目录。

三、数据卷容器

多个容器怎么实现数据同步?

容器一 --volumes from 容器二

官网解析:命名的容器挂载数据卷,其他的容器通过挂载这个父容器实现数据共享,挂载数据卷的容器,我们称为数据卷容器。

首先,我们建立父容器

docker run -it - -name parentContainer  镜像名

然后建立两个子容器继承父容器

docker run -it - -name sonContainer1 --volumes -from parentContainer 镜像名

docker run -it - -name sonContainer2 --volumes -from parentContainer 镜像名

假设我们DockerFile里面定义的容器卷目录为dockerVolume,父容器里面有dockerVolume目录,子容器继承了父容器的dockerVolume,在字容器中的dockerVolume目录作出的修改会同步到父容器的dockerVolume目录上,达到了继承和数据共享的目的。

官网上有一句话描述的是,容器之间配置信息的传递,数据卷的生命周期会一致持续到没有容器使用它为止,换言之,只要有一个容器仍在使用该数据卷,该数据卷一直都可以进行数据共享,通俗地来说,如果此时我们把父容器关闭掉,两个字容器之间依旧可以进行数据共享,而且通过继承子容器生成的新容器,一样可以与子容器进行数据共享。这就是docker容器间的数据传递共享。

猜你喜欢

转载自blog.csdn.net/qq_43263481/article/details/107400601
今日推荐