今天继续研究Docker容器持久化相关的东西。
之前,去了解数据卷和数据卷容器是因为在刚开始了解Docker的工作模式时遇到了两个疑问:关于Docker数据持久化和Docker如何共享数据。
通过对于数据卷和数据卷容器的了解,目前从整体上可以知道Docker如何共享数据和持久化数据。在不断学习的过程中,了解到Docker通过镜像创建容器时,实际上是在镜像上面加了一层读写层,我们对于Docker数据的修改都是在这个读写层发生的。
那么问题来了,如果我要创建一个web或者数据库容器,在里面安装好配置好相关软件,如tomcat或者mysql之类。这些更改如何保存下来,从而可以在以后创建容器时使用?
之前的数据卷和数据卷容器都是保存了我们对于文件的更改,现在这个实际上是需要对创建的容器进行持久化,使他变成一个镜像.我们之前在使用Docker命令创建容器的时候,很多新创建的容器里都有一些安装好的软件,用的就是这个。这个实现起来也很简单,Docker给我们提供了一个命令commit。通过这个命令就可以实现上面的需求.
首先,先创建一个容器。
docker run -i -t --name cakin24 docker/whalesay /bin/bash
然后在/usr/local目录下创建一个test.txt的文件。
接着使用commit命令来提交容器
通过对比可以看到,本机的镜像中多了一个REPOSITORY为cakin24,TAG为v2的镜像.
下面使用这个镜像来创建一个容器,看看之前/usr/local目录下创建的test.txt的文件是否存在。
docker run -i -t --name cakin24_V2 cakin24:v2
这里要注意一下,在使用名为cakin24的镜像创建容器时后面加了一个v2,这个就是创建镜像指定的TAG,默认的TAG是latest,可以不指定,如果指定就要通过:来指定。
这里可以看到,之前创建的文件还在。
通过ps命令查看容器也会发现,我使用了不同的镜像来创建容器,但创建完成的容器内容是一样的。
通过上面的操作可以得知,commit命令可以将已存在容器和修改内容提交为一个新的镜像,通过这个方式同样能保存读写层内容。但是由于每次使用新的镜像创建容器时,之前的修改都在,所以commit命令虽然能实现保存读写层数据,但不适于做数据持久化。
整个实践过程如下:
