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

  前面说到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 bash
    sudo 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=0777
    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

   在docker-compose.yml中可以使用

services:
  ubuntu:
    image: ubuntu:20.04
    tty: true
    command: /bin/bash
    volumes:
      - compose-nfs-vol:/test-nfs
      - compose-cifs-vol:/test-cifs

volumes:
  compose-nfs-vol:
    name: nfs-vol
    external: true
  compose-cifs-vol:
    name: cifs-vol
    external: true

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

services:
  ubuntu:
    image: ubuntu:20.04
    tty: true
    command: /bin/bash
    volumes:
      - nfs-vol:/test-nfs
      - cifs-vol:/test-cifs

volumes:
  nfs-vol:
    external: true
  cifs-vol:
    external: true

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

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

services:
  ubuntu:
    image: ubuntu:20.04
    tty: true
    command: /bin/bash
    volumes:
      - nfs-vol:/test-nfs
      - cifs-vol:/test-cifs

volumes:
  nfs-vol:
    name: ""
    driver: local
    driver_opts:
      type: nfs
      o: addr=10.255.0.146,noexec,nosuid,nodev,rw,tcp,bg,soft,intr,vers=3,retry=3,timeo=30,rsize=102400,wsize=102400
      device: 10.255.0.146:/nfs
  cifs-vol:
    name: ""
    driver: local
    driver_opts:
      type: cifs
      o: addr=10.255.0.146,username=smb_skyverse,password=smb_skyverse,file_mode=0777,dir_mode=0777
      device: //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

  

posted @ 2025-02-09 16:18  没有星星的夏季  阅读(502)  评论(0)    收藏  举报