请按以下顺序阅读
- docker命令(镜像+帮助)
- docker命令(容器)
- docker数据容器卷
- Dockerfile基础知识
- 自定义mycentos镜像
- CMD与ENTRYPOINT的区别
- 自定义Tomcat镜像
- jar包镜像的构建以及war包镜像的构建
- docker的一些常用安装
数据容器卷的概念
docker的使用流程,运行docker镜象,创建docker容器,运行伴随着容器,运行时产生的一些数据也将存储在docker容器中欧。
我们希望数据能够永久地保存下来,容器之间能够实行数据共享;
但是Docker产生的数据,如果不构建成新的镜像,一旦把容器删除了,数据就不复存在了。
为了实现docker数据的持久化,可以使用数据容器卷。
数据容器卷的作用
- 存储Docker容器产生的数据
- 容器之间继承和共享数据
数据容器卷的用法
添加容器数据卷的方式共有两种
3.1 通过指令来添加
docker run -it -v 宿主机目录:docker容器目录 镜像名:[版本号] /bin/bash
,-v代表volume,即卷的意思
查看容器卷是否挂载成功
docker inspect 容器id
现在已经进入容器的根路径下。
接下来进入/root/data目录下,创建一个host.txt,如果出现如下情况:
只需要在添加容器卷的时候,在目录的后面添加--privileged=true
即可
进入/root/data目录,创建hello.txt,修改hello.txt的内容
退出容器,进入宿主的/root/data目录,发现目录下有一个hello.txt文件,查看文件的内容可以看到和容器里添加内容是一样的。
在宿主机中修改hello.txt文件
在进入容器的/root/data目录,查看hello.txt文件,文件内容与在宿主机修改的内容是一样的。
总结:
添加数据容器卷之后,宿主机和容器的数据实现了共享,如果删除了容器,宿主机的数据不会变,从而实现了数据的持久化
3.2 通过Dockerfile来添加
①在宿主机的根目录下创建mydocker文件夹并进入
②在当前目录创建一个DockerFile的文件
③编写DockerFile
FROM centos
VOLUME ["data1","data2"]
CMD echo "what's the fork say?"
CMD echo /bin/bash
④build生成一个新的镜像
docker build -f /mydocker/DockerFile -t laolei/centos .
注意后面有一个点不能少
查看容器中用两个容器卷data1和data2
在使用Dockerfile挂载容器卷时,宿主机的容器卷的名称是一个随机的字符串,source的值就是与容器共享的目录。
这里只示范data1,data2是一样的,只不过与宿主机共享的目录不一样而已。复制source后面的目录,并进入这个目录;在目录中创建一个host.txt 文件,并修改内容
进入容器中,访问容器的data1目录,不出意料地有了host.txt,内容也不出意料地相同
数据卷容器
在学习数据卷容器之前,我们回顾数据容器卷的应用过程,容器与宿主机之间实现了数据共享,那么如何实现容器与容器间的数据共享呢?
很容易想到,可以将一个容器与宿主机挂载容器卷,另一个容器也与宿主机挂载容器卷,且是同一个目录,这样,通过宿主机这一中间商,容器与容器之间也实现了数据的共享。
但这只是简单的两个容器之间的简单的共享,如果容器之间共享数据的关系比较复杂,那么这种方法就显得尤为的繁琐;
为了实现容器与容器之间的数据共享,可以使用数据卷容器;数据卷容器的作用就是实现容器间的数据共享。
操作思路:
启动一个容器,dev1
在启动一个容器,dev2,并且继承dev1
语法:
docker run -it --name="dev2" --volumes-from dev1 镜像名:[版本号]
,其中继承的语句段是--volumes-from dev1
步骤:
-
启动一个容器,并命名为dev1
-
启动一个容器,命名为dev2, 并继承dev1
-
在dev2中创建hello.txt,并修改hello.txt
-
查看dev1中的data1目录
- 启动一个容器,并命名为dev1
- 启动一个容器,命名为dev2, 并继承dev1
- 在dev2中创建hello.txt,并修改hello.txt
- 查看dev1中的data1目录,目录中有hello.txt,且内容就是data2修改的内容,两个容器就此实现了共享
扩展:如果三个容器实现共享呢?
就让第三个容器继承第二个容器。
如果往第三个容器中添加一个文件,其余两个容器的目录里都会有这个文件,三者文件是一样的;
如果删除了第三个容器,对其他容器没有任何影响,这几个文件还是存在的,不会因为其中有一个文件是第三个容器创建的就会随着容器的灭亡而灭亡;
因为前两个容器与宿主机之间挂载了容器卷,宿主机也会有这些文件,所以光删除第三个容器是没有用的,除非把宿主机中的文件也删了;
总结:
容器通过挂载容器卷实现了宿主机与容器,容器与容器之间的数据共享,从而实现了数据的持久化;
容器与容器之间的共享是基于宿主机与容器之间的共享的,也就是说,宿主机与容器之间没有挂载容器卷的话,即便是一个容器继承一个容器,也无法实行数据共享。说到底都是通过把数据放到宿主机中,以此来实现数据的持久化。
- 启动一个容器,并命名为dev1