docker volumes深入理解和数据卷挂载相关指令

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来管理目录,但是目录较深,不好找
- 目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Docker挂载目录是指在容器内部与宿主机上的目录进行映射,使得容器内的操作能够对宿主机上的目录进行读写操作。通过挂载目录,可以实现数据的共享和持久化。 在引用中提到,/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301是一个Docker容器挂载目录,即使重启了Docker服务,该目录仍然存在。 Docker挂载目录的实现方式有多种,其中一种方式是使用Dockerfile来定义容器挂载目录。在引用中提到,可以在Dockerfile中使用VOLUME指令来定义挂载目录,例如VOLUME ["volume01","volume02"]。这样,在创建并启动Docker镜像时,会将容器内的指定目录与宿主机上的目录进行映射。 另外,在引用中提到,容器内的/soft目录挂载的是宿主机上的/var/lib/docker/volumes/test1/_data目录。这说明在容器内的/soft目录与宿主机上的/var/lib/docker/volumes/test1/_data目录实现了挂载。 综上所述,Docker挂载目录是通过在容器内与宿主机上的目录进行映射实现的,可以使用Dockerfile来定义挂载目录,并且容器内的操作可以对宿主机上的目录进行读写操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [关于Docker目录挂载的总结](https://blog.csdn.net/qq_36546699/article/details/108838488)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Docker数据目录挂载](https://blog.csdn.net/tfzz12/article/details/122974058)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值