标签:docker docker数据管理 docker数据卷
接上篇 [上篇文件](http://blog.51cto.com/xiong51/2093556)
8、数据管理
docker数据持久化,数据共享,容器数据管理操作
数据卷(Volumes):容器内数据直接映射到本地主机环境
数据卷容器 (Bind mounts):使用特定容器维护数据卷
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
数据卷 可以在容器之间共享和重用
对 数据卷 的修改会立马生效
对 数据卷 的更新,不会影响镜像
数据卷 默认会一直存在,即使容器被删除
8.1、容器内创建一个数据卷
docker run -v 或者 --mount 可以使用一个或多个-v创建多个数据卷,推荐使用 --mount
?? 注意: 数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的 数据卷
创建一个web容器,并创建一个数据卷挂载到容器的/app目录下
docker run -d -p 80:80 --name nginx -v /app nginx
# 挂载一个目录到nginx的index目录中,映射端口为80,并将主机的/tmp/html做为容器/usr/share/nginx/html/的数据卷
docker run -d -p 80:80 --name nginx -v /tmp/html:/usr/share/nginx/html nginx
5649d6fd05465f9a4839e3c95fb239fb58f8c82f7b8c28133d1e02da26228cee
本地目录必须是绝对路径,如果目录不存在,docker会自动创建
# 附加到容器中测试数据卷
$ cker exec -it nginx /bin/bash
root@b16b8b455d69:/usr/share/nginx/html# touch b
root@b16b8b455d69:/usr/share/nginx/html# exit
# 这样容器被删除之后,数据也能持久保存了
$ ls /tmp/html/
aa index.html
docker 挂载数据卷默认权限是rw,可以通过ro指定为只读
$ docker run -d -p 81:80 --name nginx2 -v /tmp/html/:/usr/share/nginx/html/:ro nginx
0817c41c79db18bac66f646e464af2186cbdc2e2261233985b4c2009a8b07ced
# 附加至容器中 该容器数据卷为ro就没法修改了
$ docker exec -it nginx2 /bin/bash
root@0817c41c79db:/# cd /usr/share/nginx/html/
root@0817c41c79db:/usr/share/nginx/html# touch b
touch: cannot touch ‘b‘: Read-only file system
?? 注意:如果挂载的是一个文件,使用文本编辑过之后会造成inode更改,这将会导致报错误信息,所以推荐的方式是直接使用挂载文件所在的目录。
创建一个数据卷
docker volume create my-volume
my-volume
查看数据卷
docker volume ls
DRIVER VOLUME NAME
local my-volume
查看数据卷的详细信息
docker volume inspect my-volume
[
{
"CreatedAt": "2018-04-04T00:56:58+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-volume/_data",
"Name": "my-volume",
"Options": {},
"Scope": "local"
}
]
挂载容器
docker run -d -p 80:80 --name web # --v my-volume:/webapp
--mount source=my-volume,target=/webapp nginx
8d0782dffc01b00c05861c3691d4d7bdde848c79965589e6a8ab0c01a07a37c5
测试挂载
[root@dockers html]#docker exec -it web /bin/bash
root@8d0782dffc01:/webapp# touch a
root@8d0782dffc01:/webapp# exit
[root@dockers html]# ls /var/lib/docker/volumes/my-volume/_data/
a
使用 docker inspect web 可查看容器的详细信息
查看挂载信息
docker inspect -f "{{".Mounts"}}" web
[{volume my-volume /var/lib/docker/volumes/my-volume/_data /webapp local z true }]
先检查数据卷目录下的文件
ls /var/lib/docker/volumes/
795747aac04e250aa24ff4ef48d5ef8f4d30bead6267d2dd39de1efed8eb093e metadata.db my-volume
删除数据卷
docker volume rm my-volume
再次查看数据卷的确是被删除了
ls /var/lib/docker/volumes/
795747aac04e250aa24ff4ef48d5ef8f4d30bead6267d2dd39de1efed8eb093e metadata.db
?? 数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除 数据卷 ,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷 。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。无主的数据卷可能会占据很多空间,要清理请使用以下命令
$ docker volume prune
8.2、数据卷容器
使用--volumes-from 挂载另一个容器的数据卷
  如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式就是使用数据卷容器
创建一个数据卷 这里同时使用-v --mount配置
docker volume create my-vol
挂载数据卷容器
docker run -dit --mount source=my-vol,target=/tmp/test --name web1 centos
或 # docker run -dit -a my-vol:/tmp/test --name web1 centos
查看挂载容器的目录
docker exec -it web1 ls -d /tmp/test
/tmp/test
新建两个容器,用于测试文档的创建
docker run -dit --volumes-from web1 --name db1 centos
docker run -dit --volumes-from web1 --name db2 centos
查看db2号容器的挂载信息,它的确已经挂载了本地的这个目录
docker inspect -f "{{".Mounts"}}" db2
[{volume my-vol /var/lib/docker/volumes/my-vol/_data /tmp/test local true }]
新建两个目录用于测试
docker exec -it web1 touch /tmp/test/web1.txt
docker exec -it db1 touch /tmp/test/db1.txt
查看容器是否已经成功创建了二个文件
docker exec -it db2 ls /tmp/test/
db1.txt web1.txt
查看本地容器是否也同时创建了文件
ls /var/lib/docker/volumes/my-vol/_data/
db1.txt web1.txt
使用db2做为db_3l_1的容器数据卷
docker run -dit --volumes-from db2 --name db_3l_1 centos
查看/tmp/test/文件跟先前一样
停止 web1 容器
docker stop web1
查看 db2 以及db2下关连的容器挂载也是正常的。
8.3、利用数据卷容器迁移数据
利用数据卷容器对其中的数据卷进行备份、恢复以实现数据的迁移
标签:docker docker数据管理 docker数据卷
原文地址:http://blog.51cto.com/xiong51/2094359