生产中使用Docker,通常需要数据持久化或容器间数据共享,所以需要对数据进行管理。
容器中的数据管理方式主要有两种:
- 数据卷(Data Volumes):容器内数据映射到本地主机环境
- 数据卷容器(Data Volumes Containers):使用特定容器维护数据——————————————————————————————
数据卷:
数据卷是一个可供容器使用的特殊目录,它将宿主机目录直接映射进容器,类似于linux中的mount操作。
数据卷特性:
- 可以再容器之间共享和重用,使数据传递变得高效与便捷
- 对数据卷中数据修改会即刻生效,无论在本地还是容器内操作
- 对数据卷的更新不会影响镜像
- 卷会一直存在,直到没有容器使用,可以安全的卸载掉
创建数据卷:
[root@docker01 ~]# docker volume create -d local test test [root@docker01 ~]# ls -l /var/lib/docker/volumes/ drwxr-xr-x 3 root root 19 5月 9 15:33 test
例:运行一个容器,将数据卷挂在到容器内
[root@docker01 ~]# docker run -d -p 80:80 --name web -v test:/usr/share/nginx/html nginx
创建的数据卷将存放在/var/lib/docker/volumes/目录下。
除create(创建)命令外,docker volume还支持以下常用命令:
- inspect :查看详细信息
- ls :列出已有数据卷
- prune :清空无用数据卷
- rm:删除数据卷
绑定数据卷:
将宿主机本地目录挂在到容器内作为数据卷,这种方式的数据卷称为绑定数据卷
在启动容器的时候可以使用-mount选项使用数据卷。
-mount选项支持三中类型数据卷:
- volume:普通数据卷,映射到主机/var/lib/docker/volumes/路径下
- bind:绑定数据卷,映射到主机指定路径
- tmpfs:临时数据卷,存在于内存中
- 例:创建一个web容器,并创建一个数据卷挂在到容器的/opt/webapp下
[root@docker01 ~]# docker run -d -P --name web02 -v /webapp:/opt/webapp training/webapp python app.py
本地目录的路径要求绝对路径,容器内路径没有要求。
如果目录不存在,Docker会自行创建。
Docker挂载数据卷默认权限是读写(rw),也可以更改为只读(ro):
[root@docker01 ~]# docker run -d -P --name web02 -v /webapp:/opt/webapp:ro training/webapp python app.py
数据卷容器:
数据卷容器也是一个容器,作用是专门为其他容器提供数据卷。
创建数据卷容器:
[root@docker01 ~]# docker run -d -v /data --name data ubuntu
其他容器可以使用- -volumes-from来挂载data容器下的数据卷:
[root@docker01 ~]# docker run -ti --volumes-from data --name db1 ubuntu root@7c45c23ecf2e:/# ls bin data etc lib lib64 media opt root sbin sys usr boot dev home lib32 libx32 mnt proc run srv tmp var root@7c45c23ecf2e:/# ls data/
[root@docker01 ~]# docker run -ti --volumes-from data --name db2 ubuntu root@bdbfc58dd172:/# ls bin data etc lib lib64 media opt root sbin sys usr boot dev home lib32 libx32 mnt proc run srv tmp var root@bdbfc58dd172:/# cd data/ root@bdbfc58dd172:/data# touch test.txt
经过在db2容器内/data目录创建test.txt文件后在db1中查看,可以看到数据共享:
root@7c45c23ecf2e:/# ls data/ test.txt
如果删除了挂载的容器,数据卷并不会自动删除,必须在删除最后一个还挂载这它的容器时显示docker rm -v命令来指定同时删除关联的容器。
数据卷容器迁移数据:
备份:
[root@docker01 backup]# docker run --volumes-from dbdata -v ${PWD}:/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata /dbdata/ /dbdata/test.txt tar: Removing leading `/' from member names [root@docker01 backup]# ls backup.tar
解释:
- –volumes-from dbdata:worker容器挂载dbdata容器的数据卷
- -v ${PWD}:/backup:将本地的当前目录挂载到容器的/backup下
- tar cvf /backup/backup.tar /dbdata:备份数据/dbdata目录为/backup目录下的backup.tar包
恢复:
创建一个带有数据卷的容器dbdata2:
[root@docker01 backup]# docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
创建另一个新容器,挂载dbdata2的容器,并使用untar解压备份文件到所挂的容器卷内:
[root@docker01 backup]# docker run -ti --rm --volumes-from dbdata2 -v ${PWD}:/backup ubuntu tar xvf /backup/backup.tar dbdata/ dbdata/test.txt
启动一个新容器,进入容器内部查看,数据已存在:
[root@docker01 ~]# docker run -ti --rm --volumes-from dbdata2 --name web ubuntu /bin/bash root@81baa2189c21:/# ls bin dbdata etc lib lib64 media opt root sbin sys usr boot dev home lib32 libx32 mnt proc run srv tmp var root@81baa2189c21:/# ls dbdata/ test.txt
此部分内容到此结束