Docker的镜像是只读的,但是容器是可写的,我们可以将数据写入到容器,不过一旦容器删除数据将会丢失,所以需要将容器数据进行持久化存储。
将宿主机中的目录(文件)挂载到容器上。其上的数据可以被宿主机读写,也可以被mount它的所有容器读写。
对挂载陌生的跳这里–>mount
//创建测试用的挂载目录/data/mount
mkdir /data/mount
echo 'bind mount' > /data/mount/mount.txt
//创建容器,-v指定主机目录和容器目录的挂载关系
docker run -itd --name c1 -v /data/mount:/docker busybox
//查看容器中文件mount的内容
docker exec c1 cat /docker/mount.txt
//容器中更改mount.txt文件的内容
docker exec c1 echo "bind mount test" >> /docker/mount.txt
//在宿主机查看mount.txt文件的内容,看到已被更改
cat /data/mount/mount.txt
以上,即bind mount的数据可以被mount它的所有容器读写。
//在host中编辑mount.txt文件,写入it is host's writing
//在容器中查看mount.txt文件
docker exec c1 cat /docker/mount.txt
以上,即bind mount的数据可以被宿主机读写。
volume由Docker来管理,如创建卷、删除卷。volume的存储空间来自于宿主机文件系统中的某个目录,如/var/lib/docker/volumes/,docker系统之外的程序不应该修改其中的数据。volume是官方推荐的持久化方案。
指定挂载目录:
//-v指定挂载目录,宿主机目录/docker/volumes/volume_name/_data
docker run -itd --name c3 -v volume01:/dir/c3 busybox
将容器c3的/dir/c3数据卷挂载到宿主机/docker/volumes/volume_name/_data目录下
//不指定挂载目录,宿主机中创建/docker/volumes/id号/_data
docker run -itd --name c4 -v volume01 busybox
容器c4的/volume01数据卷挂载到宿主机的Source后的目录下:
修改容器中的数据,查看宿主机:
总结就是注意Source后的目录(对应宿主机)和Destination后的目录(对应容器数据卷)。
#创建volume
docker volume create volume_test
#查看卷的参数信息
docker inspect volume_test(和docker volume inspect xxx一样)
#查看docker数据卷
docker volume ls
#删除不用的数据卷
docker volume prune
#删除一个或多个数据卷
docker volume rm xxx
#使用卷-v指定
docker run -itd --name c1 -v volume_test busybox
#查看容器卷信息
docker inspect 容器名 |grep -i volume
或docker inspect -f {{.Mount}} 容器名
TIP: Docker指令中使用{ }
eg1:
docker inspect 容器名 | grep -i xx -A5
等价于docker inspect 容器名 -f {{.xx}}
eg2:
删除多个容器名相似的容器,如容器c1、c2、c3、c4
docker rm -f c{1,2,3,4}
tmpfs是将文件写到内存中,所以这样做不到数据持久化,但可以避免写数据到容器层增加容器大小。但tmpfs有缺点:只能在Linux Host上使用且不能在多个容器间共享。
docker run -dit --name c5 --tmpfs /test busybox
//创建容器c6
//--volumes-from 使用其它容器的volume
docker run -itd --name c6 --volumes-from c5 busybox
查看c6容器的数据卷信息,可以看到和c3一样。文件c3.txt已共享
–volumes-from可以有多个,即共享多个容器的数据
docker run -itd --name c7 --volumes-from c1 busybox --volumes-from c2 busy
docker run --rm --name test_container --volumes-from c3 -v $(pwd):/backup busybox tar cvf /backup/backup.tar /dir/c3
NFS看这里here
//NFS服务端,配置nfs共享
yum install nfs-utils rpcbind -y
mkdir -p /data/nfs/docker
echo "/data/nfs *(rw,no_root_squash,sync)">>/etc/exports
exportfs -r
systemctl start rpcbind nfs-server
systemctl enable rpcbind nfs-server
showmount -e localhost
//安装nfs客户端
yum install -y nfs-utils rpcbind
//创建volume 连接 xx.xx.xx.xx:/data/nfs
docker volume create --driver local \
--opt type=nfs \
--opt o=addr=xx.xx.xx.xx,rw \
--opt device=:/data/nfs \
volume-nfs
//查看
docker volume ls
docker volume inspect volume-nfs
//容器使用volume-nfs
docker run -dit --name test_container -v volume-nfs:/nfs busybox
//查看容器挂载信息
docker inspect -f {{.Mounts}} test_container
df -h |grep /data/nfs
//volume目录/var/lib/docker/volumes/volume-nfs/_data自动挂载到了nfs服务上