Volumes
推荐官网:Volumes | Docker Docs,在读官网的时候最好是结合着英语有自己的理解,这样可以更为贴切和深刻。下面是本人的一些理解。
数据卷优势
数据卷通过容器可以对保存维持数据具有更好的机制。bind mounts依赖于主机的目录和操作系统,对比之下,数据卷值依赖于docker,这里相比之下就体现出数据卷的优势:
更高的表现能力也就是在性能和执行力方面更强。
预填充类似于数据的拷贝,可以在原有基础上进行执行。
In addition, volumes are often a better choice than persisting data in a container's writable layer, because a volume doesn't increase the size of the containers using it, and the volume's contents exist outside the lifecycle of a given container.
卷比将数据保留在容器的可写层次更有优势,因为卷不会增加容器的使用大小,并且卷的内容存在容器的生命周期之外。
这意味着数据卷的内容将不会受到容器的影响。而容器的概念我将会在另一篇文章进行说明。容器的消失,不会影响数据卷的内容。
数据卷挂载
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。
完成数据卷挂载之后对容器的一切操作都会作用在数据卷对应的宿主机目录了。
为什么要进行数据卷挂载
因为docker容器的隔离属性,docker容器内部的数据,外部是无法直接访问的,如果我们想操作容器内的某一个内容,还需要进入到容器,找到对应的文件,执行相应的命令才能改变,而且可视化效果很低,而且容器之间的数据还不能直接访问,所以我们可以通过数据卷挂载,类似于一种数据映射,这里的概念类似于但补完全等于主从数据库,你对主库进行操作,从库也会跟着改变,你操作数据卷,相应的修改也会发生在docker容器内部对应的挂载文件上。
如何进行数据卷挂载
1.创建数据卷
数据卷操作的基本语法如下:
$ docker service create \ --mount 'type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=local,volume-opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-address>,vers=4,soft,timeo=180,bg,tcp,rw"' --name myservice \ <IMAGE>(镜像名)
例子:
数据卷和服务一起使用的时候只支持mount!
指定数据卷driver选项必须用mount
docker run -d \
--name devtest \
--mount source=myvol2,target=/app \
nginx:latest
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
- create 创建一个volume
- inspect 显示一个或多个volume的信息
$ docker volume inspect my-vol [ { "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/my-vol/_data", "Name": "my-vol", "Options": {}, "Scope": "local" } ]
""/var/lib/docker/volumes/my-vol/_data",为数据卷的路径
- ls 列出所有的volume
$ docker volume ls local my-vol
- prune 删除未使用的volume
- rm 删除一个或多个指定的volume (eg:docker volume rm my-vol)
停止容器并删除数据卷,注意,这是互相独立的步骤:
docker container stop (容器名)
docker container rm (容器名)
docker volume rm (数据卷名)
2.容器运行时挂载(推荐)
以nginx为例
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx
容器内的文件路径的观察和获取详细的可以看我对容器理解那片文章。
这里粗略写一下命令:docker exec -it mn bash 之后执行ls可以查看。
执行完数据卷的挂载之后,对指定数据卷的修改就是对容器内文件的修改,非常方便。
# 查看html数据卷的位置
docker volume inspect html
# 进入该目录
cd /var/lib/docker/volumes/html/_data
# 修改文件
vi index.html
目录挂载
目录挂载与数据卷挂载的语法是类似的:
- -v [宿主机目录]:[容器内目录]
- -v [宿主机文件]:[容器内文件]
例如创建的目录/usr/local/mysql/data 挂载mysql容器内的指定目录
docker run --name cmysql -v /usr/local/mysql/data :(mysql容器内指定目录的绝对路径)-p 3307:3306 -d mysql:(版本号) (镜像名字)
具体的docker 内部mysql的启动和密码设置可以去dockerhub上看,这篇文章便不再赘述。
数据卷挂载和自己目录挂载的区别:
- 数据卷挂载耦合度低,由docker来管理目录,但是目录较深,不好找
- 目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看