前面说到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-vol
、compose-cifs-vol
是docker-compose.yml
内部定义的卷名称,通过name
和extenal
属性表示它对应到外部创建的管理卷,如果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