一、存储
docker的镜像使用一层一层文件组成的,docker的一些存储引擎可以处理怎么样存储这些文件。使用docker inspect
这个命令可以查询镜像或者容器的详细信息,比如要查看centos这个镜像:
docker inspect centos
展示信息下方的Layers,就是centos的文件,这些东西都是只读的不能去修改,我们基于这个镜像去创建的镜像和容器也会共享这些文件层,而docker会在这些层上面去添加一个可读写的文件层。如果需要修改一些文件层里面的东西的话,docker会复制一份到这个可读写的文件层里面,如果删除容器的话,那么也会删除它对应的可读写的文件层的文件。
演示
先创建一个带交互的容器,管它名字叫test1。
docker run -i -t --name test1 centos /bin/bash
然后在里面新建一个文件,hello.txt。
接着退出容器,使用centos创建第二个容器叫test2,试着输出根目录下的hello.txt文件的内容。
发现没有找到此文件,虽然test1,test2都是基于centos镜像创建的,但他们都拥有各自的可读写的文件层,新创建的文件或者修改的已有的文件都会放到这个文件层,不会影响到镜像本身和使用这个镜像创建的容器。
删除容器的时候,这些容器层上面的文件也会被删除掉。
二、数据卷:Data Volumes
如果有些数据你想一直保存的话,比如:web服务器上面的日志,数据库管理系统里面的数据,那么我们可以把这些数据放到data volumes数据盘里面。它上面的数据,即使把容器删掉,也还是会永久保留。创建容器的时候,我们可以去指定数据盘。其实就是去指定一个特定的目录,剩下的docker会帮你做。
指定数据盘的命令
docker run --volume /mnt -i -t --name db centos /bin/bash
说明:--volume
简写形式 -v
,指定数据盘的目录,注意目录是要绝对路径。
创建容器,并在这容器的数据盘里创建一个文件。
查看容器信息:
Mounts下Source表示数据存在宿主机上的真实位置,Destination表示数据盘在docker中对应的位置。及时删除容器,Source下的数据也还会存在。
指定主机目录作为数据盘
我们还可以手工指定主机上的目录作为数据盘,比如,新建一个文件夹叫data,让它作为数据盘,然后使用centos镜像创建容器,命名为db,指定数据盘位置:
docker run -v /Users/beckjiang/Desktop/data:/mnt --name db -i -t centos /bin/bash
进入容器后,在/mnt/ 目录下创建文件data1,然后删除容器,查看主机上/Users/beckjiang/Desktop/data 里面,仍然会保留容器里面创建的数据。
三、数据容器
我们可以创建一个数据容器,也就是再创建容器是指定这个容器的数据盘,然后让其他容器可以使用这个容器作为他们的数据盘,有点像继承了这个数据容器指定的数据盘作为数据盘。
先来创建一个数据容器:
docker create -v /mnt -i -t --name dbcenter centos /bin/bash
接着使用这个数据容器,去创建一个容器 db1:
docker run --volumes-from dbcenter --name db1 -i -t centos bash
在/mnt/目录下创建data1文件:
完成以后退出容器,基于dbcenter这个数据容器去创建第二个容器 db2:
docker run --volumes-from dbcenter --name db2 -i -t centos bash
查看/mnt/目录下的文件,会看到在db1容器中创建的data1文件。同样的,你在db2中的/mnt/目录创建的数据文件,也会被其他使用了dbcenter作为数据容器的容器所看到。
四、管理数据盘
查看主机上面创建的数据盘
docker volume ls
在删除容器时,docker默认不会删除其数据盘。这里可以** 查看没有容器在使用的数据盘 **:
docker volume ls -f dangling=true
出现的就是没有容器在使用的数据盘,想要** 删除数据盘 **可以使用:
docker volume rm VOLUME NAME
把没有容器使用的数据盘都删除掉以后,还剩下1个正在被使用的数据盘,就是上面创建的数据容器。
如果想要删除容器时,同时删除掉其数据盘,那么可以使用-v
参数。(db1,db2使用dbcenter作为数据盘,先将其删掉)
docker rm -v dbcenter
因为删除容器也把数据盘给删了,所以执行docker volume ls
,数据盘为空。