docker/docker-compose下存储卷的使用(CIFS和NFS)

news/2025/2/12 12:20:53/文章来源:https://www.cnblogs.com/shanfeng1000/p/18679777

  前面说到Linux下的挂载CIFS和NFS,这里就顺道简单记一下docker/docker-compose去挂载CIFS和NFS的方式,当个笔记记录一下。

  docker去挂载CIFS和NFS,需要使用存储卷,稍微懂一点docker,就知道这个是什么,所以这里我们长话短说。

  首先,docker存储卷分为管理卷、绑定卷、临时卷。

  管理卷:管理卷就是我们先使用docker volume命令去创建管理卷,然后在使用docker创建容器时,通过-v或者--mount参数来使用的一种方式

    # 创建卷,type=none表示本地的方式,device=/test表示本地绑定到这个卷的目录,o=bind表示通过绑定sudo docker volume create local-vol --driver local --opt type=none --opt device=/temp --opt o=bind# 使用创建好的管理卷,在容器内部访问/test就相当于访问本地的/temp目录sudo docker run --rm -i -t -v local-vol:/test ubuntu:20.04 bashsudo docker run --rm -i -t --mount source=local-vol,target=/test ubuntu:20.04 bash

  绑定卷:这种事使用比较多的,我们可以直接在docker创建容器的时候,通过通过-v或者--mount参数来将一个本地的目录与容器内的一个目录做映射,访问容器内存的目录就相当于访问本地对应的目录

    # 直接使用,在容器内部访问/test就相当于访问本地的/temp目录sudo docker run --rm -i -t -v /temp:/test ubuntu:20.04 bash# 或者使用--mound指定,type=bind表示通过绑定的方式sudo docker run --rm -i -t --mount type=bind,source=/temp,target=/test ubuntu:20.04 bash

  临时卷: 临时卷就是在内存中创建一个文件系统,然后把它挂载到容器内部指定的目录,这样在读写这些目录下的文件时可以不依赖与磁盘IO,而是直接对标内存,因此读写上可以达到很高的性能,但是容器停止运行,数据将会丢失。

    # 使用临时卷sudo docker run --rm -i -t --tmpfs /test ubuntu:20.04 bash# 还可以配置这个文件系统的大小和权限sudo docker run --rm -i -t --tmpfs /test:size=100M,mode=0777 ubuntu:20.04 bash

  Docker下挂载CIFS和NFS

  我们要在docker下挂载CIFS和NFS,有两种方式:管理卷、绑定卷。

  通过管理卷,我们使用下面的命令:

  CIFS

    # 创建管理卷,type=cifs表示采用CIFS,device是绑定的设备,file_mode和dir_mode是权限sudo docker volume create cifs-vol --driver local --opt type=cifs --opt device=//192.168.139.128/temp --opt o=addr=192.168.139.128,username=feng,password=123456,file_mode=0777,dir_mode=0777# 然后可以使用-v参数挂载sudo docker run --rm -i -t -v cifs-vol:/test ubuntu:20.04 bash# 或者使用--mount参数挂载sudo docker run --rm -i -t --mount type=volume,source=cifs-vol,target=/test ubuntu:20.04 bash

  NFS

    # 创建管理卷,type=nfs表示采用CIFS,device是绑定的设备,file_mode和dir_mode是权限sudo docker volume create nfs-vol --driver local --opt type=nfs --opt device=192.168.139.128:/temp --opt o=addr=192.168.139.128,noexec,nosuid,nodev,rw,tcp,bg,soft,intr,vers=3,retry=3,timeo=30,rsize=102400,wsize=102400# 然后可以使用-v参数挂载sudo docker run --rm -i -t -v nfs-vol:/test ubuntu:20.04 bash# 或者使用--mount参数挂载sudo docker run --rm -i -t --mount type=volume,source=nfs-vol,target=/test ubuntu:20.04 bash

  通过绑定卷,我们使用下面的命令:

  CIFS

    # 直接使用,这个时候我们就需要使用--mount参数,-v参数就不适用了sudo docker run --rm -i -t --mount 'type=volume,source=,target=/test,volume-driver=local,volume-opt=type=cifs,volume-opt=device=//192.168.139.128/temp,"volume-opt=o=addr=192.168.139.128,username=feng,password=123456,file_mode=0777,dir_mode=0777"' ubuntu:20.04 bash# 如果在上面命令的source指定卷名,那么还会创建一个管理卷,哪怕删除容器了也不会被删除,如sudo docker run --rm -i -t --mount 'type=volume,source=cifs-vol,target=/test,volume-driver=local,volume-opt=type=cifs,volume-opt=device=//192.168.139.128/temp,"volume-opt=o=addr=192.168.139.128,username=feng,password=123456,file_mode=0777,dir_mode=0777"' ubuntu:20.04 bash

  NFS

    # 直接使用,这个时候我们就需要使用--mount参数,-v参数就不适用了sudo docker run --rm -i -t --mount 'type=volume,source=,target=/test,volume-driver=local,volume-opt=type=nfs,volume-opt=device=192.168.139.128:/temp,"volume-opt=o=addr=192.168.139.128,noexec,nosuid,nodev,rw,tcp,bg,soft,intr,vers=3,retry=3,timeo=30,rsize=102400,wsize=102400"' ubuntu:20.04 bash# 如果在上面命令的source指定卷名,那么还会创建一个管理卷,哪怕删除容器了也不会被删除,如sudo docker run --rm -i -t --mount 'type=volume,source=nfs-vol,target=/test,volume-driver=local,volume-opt=type=nfs,volume-opt=device=192.168.139.128:/temp,"volume-opt=o=addr=192.168.139.128,noexec,nosuid,nodev,rw,tcp,bg,soft,intr,vers=3,retry=3,timeo=30,rsize=102400,wsize=102400"' ubuntu:20.04 bash

  Docker-Compose下挂载CIFS和NFS

  在docker-compose.yml文件中挂载CIFS和NFS,我们有几种方式,这里介绍两种就好了

  使用外部的管理卷

  我们可以先在外部采用docker volume命令优先创建外部卷,然后在docker-compose.yml文件中使用

    # 先创建管理卷sudo docker volume create cifs-vol --driver local --opt type=cifs --opt device=//192.168.139.128/temp --opt o=addr=192.168.139.128,username=feng,password=123456,file_mode=0777,dir_mode=0777sudo docker volume create nfs-vol --driver local --opt type=nfs --opt device=192.168.139.128:/temp --opt o=addr=192.168.139.128,noexec,nosuid,nodev,rw,tcp,bg,soft,intr,vers=3,retry=3,timeo=30,rsize=102400,wsize=102400

   在docker-compose.yml中可以使用

services:ubuntu:image: ubuntu:20.04tty: truecommand: /bin/bashvolumes:- compose-nfs-vol:/test-nfs- compose-cifs-vol:/test-cifsvolumes:compose-nfs-vol:name: nfs-volexternal: truecompose-cifs-vol:name: cifs-volexternal: true

   其中compose-nfs-volcompose-cifs-voldocker-compose.yml内部定义的卷名称,通过nameextenal属性表示它对应到外部创建的管理卷,如果docker-compose.yml定义的卷名和外部定义的卷名是一样的,我们可以简化成这样:

services:ubuntu:image: ubuntu:20.04tty: truecommand: /bin/bashvolumes:- nfs-vol:/test-nfs- cifs-vol:/test-cifsvolumes:nfs-vol:external: truecifs-vol:external: true

   在docker-compose.yml文件中定义卷

   除了使用外部卷,我们还可以再docker-compose.yml中定义卷,这样我们不用事先在外部创建管理卷了

services:ubuntu:image: ubuntu:20.04tty: truecommand: /bin/bashvolumes:- nfs-vol:/test-nfs- cifs-vol:/test-cifsvolumes:nfs-vol:name: ""driver: localdriver_opts:type: nfso: addr=10.255.0.146,noexec,nosuid,nodev,rw,tcp,bg,soft,intr,vers=3,retry=3,timeo=30,rsize=102400,wsize=102400device: 10.255.0.146:/nfscifs-vol:name: ""driver: localdriver_opts:type: cifso: addr=10.255.0.146,username=smb_skyverse,password=smb_skyverse,file_mode=0777,dir_mode=0777device: //10.255.0.146/ivy/FileProvider

  上面的例子中,将name设置为空字符串,这样就不会在外部传进管理卷了,否则默认会创建管理卷,如果确实需要创建管理卷,我们也可以通过这个name属性来定义卷的名称

  总结

  就介绍这么多吧,还有些细节没说,应该不算是常用的吧,比如docker挂载的时候,我们可以声明卷的读写权限:  

    # 如果采用-v参数绑定,/temp:/test:ro中的ro即是只读权限,默认是rw,表示读写权限sudo docker run --rm -i -t -v /temp:/test:ro ubuntu:20.04 bash# 如果采用--mount参数挂载,type=bind,source=/temp,target=/test,readonly中readonly表示只读权限,默认rm,表示读写权限sudo docker run --rm -i -t --mount type=bind,source=/temp,target=/test,readonly ubuntu:20.04 bash

   对于只读权限,如果尝试写入操作时就会失败,比如:echo a > /test/a.log

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/881269.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Deep深度算命App

Deep深度算命App应用背景与开发动机 最近,DeepSeek R1模型在AI领域引起了广泛的关注。尽管它不是当前最强大的模型之一,但在中文处理方面表现出色。春节期间,我原本计划开发一个基于AI的图像识别程序,但被周围人对DeepSeek R1用于算命应用的高度评价所吸引,尤其是我的小舅…

javaj进阶(中)

java进阶(中) 集合集合的特点可以动态保存任意多个对象,使用比较方便 提供了一系列方便的操作对象的方法:add、remove、set、getjava集合类很多,主要分为两大类,如图LInk(接口) ArrayList(Link实现类)ArrayList 是 Java 中最常用的集合类之一,它实现了 List 接口,基于…

java中awit和sleep的区别和线程安全性问题

awit和sleep的区别 从名称上来讲: awit:等待。 sleep:休眠。 从属关系上来讲: awit:awit这个方法是在对象上,只要是对象,就有这个方法 sleep:sleep是在Thread上,它是在线程上,是一个静态方法使用方式上来讲: awit只能够在同步代码中去使用 sleep可以在任意的地方中去使用从…

[PyTorch] DDP源码阅读

[PyTorch] DDP源码阅读PyTorch的DistributedDataParallel (DDP) 允许多台机器,多台GPU之间的数据并行。本文简单讲解DDP的流程,并从代码层面理解DDP如何访问底层的通信框架。DDP使用单机多进程来控制多个GPU。模型需要能放入单个GPU中。参考了PyTorch 源码解读之 DP & DD…

SQL注入之时间盲注

SQL注入之时间盲注 一、时间盲注原理 时间盲注技术的核心在于巧妙地运用数据库中的时间延迟函数(例如 MySQL 的 SLEEP() 函数或 PostgreSQL 的 PG_SLEEP() 函数)来验证注入条件的有效性。当注入条件成立时,数据库会执行这些延迟函数,从而导致页面响应时间显著增加;反之,若…

P2024 [NOI2001] 食物链(带权并查集)

这道题要用带权并查集,感觉没听懂只能先把自己能懂得写了; 数组b[i]表示i与根节点的关系,//0 : 同类 1:吃 2:被吃#include r1 == r2 && b[x] != b[y]说明x和y在同一集合,但他们与根节点的关系不是一样的,说明他们不是同类,是假话 #include<set> #includ…

2025苹果春季发布会前瞻:新品迭出,Apple Intelligence国行版即将上线!

随着2025年的到来,苹果公司的春季发布会也渐行渐近。作为科技行业的领军企业,苹果每一次的新品发布都备受瞩目。本次春季发布会,苹果预计会带来一系列令人期待的新品,同时,国行Mac用户也将迎来一个重大更新——Apple Intelligence功能的上线。随着2025年的到来,苹果公司的…

Python3测试框架unittest搭配自动化测试报告工具HTMLTestRunner

最近接触到Python的测试框架unittest, 浅浅的学习了一下。 unittest和HTMLTestRunner搭配,可以完成自动化测试的功能并生成自动化测试报告。 一. 简介Python内置的unittest模块,用于编写和执行单元测试。 HTMLTestRunner 是一个用于生成自动化测试报告的工具,扩展了 unittes…

毕业设计目前进度

毕业设计进度:基于VoIP的音频音协算法设计与实现 1、学习了MATLAB的使用并动手实践界面认识 变量命名 运算和程序结构 矩阵操作 绘制二维三维图形等 绘制波形图(或数据曲线图)通过学习matlab的使用,为编写代码和运行并检测音频质量打下基础,同时也学会了建立坐标轴并绘制图…

使用LM Studio部署DeepSeek 1.5B模型

下载LM Studio: https://installers.lmstudio.ai/win32/x64/0.3.9-6/LM-Studio-0.3.9-6-x64.exe 安装LM Studio: 略 打开LM Studio 设置语言启用内置代理,用于下载模型,否则大概率在Model Search中看不到模型信息,无法下载模型模型下载,两种方式: 第一种,通过LM Studio…

React—05—脚手架

使用npm全局下载create-react-app, 建议node>16。npm install create-react-app -g; 然后创建项目即可。create-react-app 项目名称 但是现在create-react-app有问题,有些库依赖的react18但是这个脚手架创建的默认是react19,而官方还没解决这个问题,建议用vite创建一…