如何开始docker - 数据管理
前言
在docker中,如果没有挂载数据卷,默认数据都是保存在容器里面的,如果容器被删除,数据就没了。
数据卷
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
数据卷可以在容器之间共享和重用
对数据卷的修改会立马生效
对数据卷的更新,不会影响镜像
数据卷默认会一直存在,即使容器被删除
创建一个数据卷
docker volume create dbdata
可以看到在data-root(默认是/var/lib/docker)下的volumes目录就可以看到有一个目录生成,这个就是数据卷。
查看数据卷
docker volume ls
查看数据卷详情
docker volume inspect dbdata
删除指定的数据卷
docker volume rm dbdata
清理所有无主的数据卷
docker volume prune
上面创建的数据卷,没有跟容器关联,需要在容器创建的时候,使用docker run指定数据卷
docker run -itd -v dbdata:/data alpine:latest /bin/sh
如果这个数据卷没有在,也会自动创建这个数据卷的
也可不指定名称:
docker run -itd -v /data alpine:latest /bin/sh
这时候生成的目录的名称就不是指定的名字,而是一长串ID
在Dockerfile创建的时候也可以使用VOLUME这个指令创建数据卷。
挂载主机目录作为数据卷
docker run的时候 -v参数指定的是本地的绝对路径,就是挂载本地的目录到容器里面使用。
docker run -itd -v /data/dbdata:/data alpine:latest /bin/sh
如果本地目录不存在,会自动创建。这个挂载的目录是不受docker volume管理的,因此就算是docker rm -v 也不会删除这个目录里面的数据,因此,在实际中一般是用这种方式,将我们的代码目录挂载到容器里面去运行。
默认容器里面对目录是有读写权限,如果只需要指定可以加上:ro的选项即可:
docker run -itd -v /data/dbdata:/data:ro alpine:latest /bin/sh
除了目录可以挂载,单个文件也是可以挂载的,挂载后,容器里面对应的文件是只读的,写操作之后在宿主机上操作
docker run -itd -v /data/dbdata:/data -v /etc/my.cnf:/etc/my.cnf alpine:latest /bin/sh
数据卷容器
如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
创建数据卷容器
docker run -itd -v /data/dbdata:/data -v /data/dbdata1:/data1 --name dbdata alpine:latest /bin/sh
使用数据卷容器
docker run -itd --volumes-from dbdata apline:latest /bin/sh