数据管理的两种方法
- Data volumes
- Data volume containers
Data volumes
data volumes 对数据的持久化和分享提供一些很有用的特性。
- volumes 在容器创建的时候被初始化。
- 如果容器依赖的镜像包含指定点的数据,
- 则在新容器建立时将已经存在的数据复制到volumes在初始化volumes的时候
- Data volumes 可以被分享,也可以在多个容器中重复 使用
- 更改数据直接
- 当你更新image时 data volumes 的更改将不会包含其中
- data volumes 持久化在硬盘的,哪怕使用的 容器删除之后。
增加数据卷
-v
- docker create 和 docker run 命令一起使用
- 可以多次使用,来挂载多个数据卷。
挂载单个数据卷
zane@zane-V:~$ docker run -d -P --name web -v /webapp training/webapp python app.py
8a1626618e6ad963e18021a42847034196686745b202395d0412e35beb85976d
这会在容器里创建一个新数据卷 /webapp
当然也可以在Dockerfile中添加一个或多个新的数据卷。
定位数据卷
使用docker inspect 命令在本机中定位数据卷
$ docker inspect web ..... "Mounts": [ { "Name": "c72823cb4542875fdb1103362dc3b743c87057bfdfe29a7cf66af65f73d16d07", "Source": "/var/lib/docker/volumes/c72823cb4542875fdb1103362dc3b743c87057bfdfe29a7cf66af65f73d16d07/_data", "Destination": "/webapp", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ], .....
source:指定了在本机中的位置
destination:指定了在容器中的位置
RW:数据卷是否具有读写权限
挂载本地目录作为数据卷
zane@zane-V:~$ docker run -d -P --name webb -v /src/webapp:/webapp training/webapp python app.py
3b34d9907b5bae0e5e038b11b6e1f62e6579df5d11aeb850df7907f309f0c060
挂载本地目录/src/webapp 到容器中的 /webapp,如果容器中的/webapp已经存在,则覆盖,但是不会删除/webapp中原有的数据。这个与Linux mount 命令的行为一致。
注意: 本地目录以及容器内的目录 都要求是 绝对路径。
默认权限是可以读写的
当然也可以指定read-only 权限
$ docker run -d -P --name web -v /src/webapp:/webapp:ro training/webapp python app.py
挂一个共享存储卷作为一个数据卷
一些Docker volume 插件允许,挂载共享存储例如 iscsi ,NFS, FC。
使用共享存储的一个好处就是,他们与主机无关。也就是说,
只要有访问共享存储且已经安装插件,就可以在容器启动的任何主机上使用该共享卷。
通过docker run 命名使用 卷驱动。卷驱动 通过名称 创建 卷,而不是像其他例子一样使用目录。
下面的例子使用 flocker(是一个多主机便携式卷) 卷驱动,创建一个叫 my-named-volume 卷。
并使用在 容器的 /webapp 目录中。在使用命令之前需要先安装flocker ,如果不想安装则可以使用
local 替代 flocker 。从而使用本地的 local 驱动。
zane@zane-V:~$ docker run -d -P --volume-driver=local -v my-named-volume:/webapp --name weeb training/webapp python app.py
99736975af3d8c2f6224b957ac24ef6ff4a833cb6bd56b64678858c01ba2463a
当然也可以使用docker volume create 命令创建一个 volume 在它被容器使用之前。
$ docker volume create -d flocker --opt o=size=20GB my-named-volume
$ docker run -d -P -v my-named-volume:/webapp --name web training/webapp python app.py
挂载一个主机文件作为数据卷
$ docker run --rm -it -v ~/.bash_history:/root/.bash_history ubuntu /bin/bash
Create Data Volume Container
如果你想和其他的容器分享已经持久化的数据或者想从其他非持久化的容器中使用。
最好的方式就是创建一个命名的数据卷容器,然后从这里挂载数据。
创建一个共享数据卷的命名的容器
zane@zane-V:~$ docker create -v /dbdata --name dbstore training/postgres /bin/true 603ccc61bb00ef29943a76ce3bc8da7694482f49f0a62a282743a39aa81e592a
然后可以使用 --volumes-from 这个参数去挂载 /dbdata 数据卷 在其他的容器中使用。
注意: 使用的名称是 上面创建的容器的名称,实际使用的数据卷 是 /dbdata
zane@zane-V:~$ docker run -d --volumes-from dbstore --name db1 training/postgres 1532719b9bc2bb0a2b0570077e7e8d03cdd6feddb84d406901548163fe15a953 zane@zane-V:~$ docker run -d --volumes-from dbstore --name db2 training/postgres 1ca6bbde65d12f7bbb40ad0854bff346bfad56e374775d08f8583c9913c9240e
这case 就像 dbstore 是主,db1,db2是从。但是都是可写的。
当然也支持联级,就是继续把db1 为主 往下发展从。
zane@zane-V:~$ docker run -d --name db3 --volumes-from db1 training/postgres
5a1bebcc03c4c945197eb717f4e7575cd0ad4fefdb33df1c4d033dacf8517d56
当你删除了容器如上面的 dbstore,db1 ,db2 是不会删除数据卷的。
要删除数据卷使用明确的命令 docker rm -v
备份恢复迁移数据卷
备份
$ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu && tar cvf /backup/backup.tar /dbdata
--rm :如果容器已经存在则删除
--volumes-from :指定使用哪个数据源
-v : 数据卷源具体挂载 这个容器的 /backup 目录
Ubuntu:image
tar:将这个刚刚挂载的目录 备份。
恢复
$ docker run -v /dbdata --name dbstore2 ubuntu /bin/bash Then un-tar the backup file in the new container`s data volume. $ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1" You can use the techniques above to automate backup, migration and restore testing using your preferred tools.
删除 数据卷
使用:
docker run --rm
总结
-
- Data volumes
- 特性
- volumes 在容器创建的时候被初始化
- Data volumes 可以被分享
- data volumes 持久化在硬盘的,哪怕使用的 容器删除之后
- 操作
- 增加数据卷
- -v
- docker run -d -P --name web -v /webapp training/webapp python app.py
- -v
- 定位数据卷
- docker inspect
- 挂载一个共享存储卷作为数据卷
- 增加数据卷
- 特性
- Create Data volume container
- 主从库,从库以主库数据卷为基础,创建自己的数据卷
- docker create -v /dbdata --name dbstore training/postgres /bin/true
- docker run -d --volumes-from dbstore --name db1 training/postgres
- 主从库,从库以主库数据卷为基础,创建自己的数据卷
- 备份恢复迁移数据卷
- $ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu && tar cvf /backup/backup.tar /dbdata
- --rm :如果容器已经存在则删除
- --volumes-from :指定使用哪个数据源
- -v : 数据卷源具体挂载 这个容器的 /backup 目录
- Ubuntu:image
- tar:将这个刚刚挂载的目录 备份。
- $ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu && tar cvf /backup/backup.tar /dbdata
- Data volumes