如何在Docker for Windows(Windows 10)中挂载网络卷

hm2xizp9  于 2022-11-26  发布在  Windows
关注(0)|答案(5)|浏览(438)

我们正在Docker中创建一个标准的“数据科学”映像,以帮助我们的团队维护一个一致的环境。为了使这对我们有用,我们需要容器具有对公司网络的读/写访问权限。如何将网络驱动器安装到Docker容器?
以下是我使用Docker Hub中的rocker/rstudio映像所做的尝试:
这是可行的:
docker run -d -p 8787:8787 -v //c/users/{insert user}:/home/rstudio/foobar rocker/rstudio
这不起作用(其中P是网络驱动器的Map位置):docker run -d -p 8787:8787 -v //p:/home/rstudio/foobar rocker/rstudio
这也行不通:docker run -d -p 8787:8787 -v //10.1.11.###/projects:/home/rstudio/foobar rocker/rstudio
有什么建议吗?
我对Docker比较陌生,所以如果我不完全清楚,请让我知道。

a14dhokn

a14dhokn1#

我知道这是相对较老的-但为了其他人-这里是什么通常为我工作。使用-我们使用一个windows文件服务器,所以我们使用cifs-utils,以Map驱动器。我假设下面的指令可以适用于nfs或其他任何东西。
first -需要在特权模式下运行容器,以便可以在容器内挂载远程文件夹(可能不需要--dns标志)
docker run --dns <company dns ip> -p 8000:80 --privileged -it <container name and tag>
现在(假设Centos具有CIFS并且是容器中的根)-跳到容器中并且运行:

安装cifs-utils(如果尚未安装)

yum -y install cifs-utils

创建要Map的本地目录

mkdir /mnt/my-mounted-folder

准备一个包含用户名和凭据文件

echo "username=<username-with-access-to-shared-drive>" > ~/.smbcredentials
echo "password=<password>" > ~/.smbcredentials

Map远程文件夹

mount <remote-shared-folder> <my-local-mounted-folder> -t cifs -o iocharset=utf8,credentials=/root/.smbcredentials,file_mode=0777,dir_mode=0777,uid=1000,gid=1000,cache=strict
现在您应该可以访问
希望这对你有帮助..

wr98u20j

wr98u20j2#

我会写我的决定。我有一个Synology NAS。共享文件夹使用smb协议。我设法以以下方式连接它。最重要的是写版本1.0(vers=1.0)。没有它它它不工作!我试图解决这个问题2天。

version: "3"

services:
  redis:
    image: redis
    restart: always
    container_name: 'redis'
    command: redis-server
    ports:
      - '6379:6379'
    environment:
      TZ: "Europe/Moscow"

  celery:
    build:
      context: .
      dockerfile: celery.dockerfile
    container_name: 'celery'
    command: celery --broker redis://redis:6379 --result-backend redis://redis:6379 --app worker.celery_worker   worker --loglevel info
    privileged: true
    environment:
      TZ: "Europe/Moscow"
    volumes:
      - .:/code
      - nas:/mnt/nas
    links:
      - redis
    depends_on:
      - redis

volumes:
  nas:
    driver: local
    driver_opts:
      type: cifs
      o: username=user,password=pass,**vers=1.0**
      device: "//192.168.10.10/main"
fiei3ece

fiei3ece3#

我一直在寻找解决方案的最后几天,我只是得到一个工作。
我在一个ubuntu虚拟机上运行docker容器,我在同一个网络上运行windows 10的其他主机上Map一个文件夹,但我几乎可以肯定容器运行的操作系统没有问题,因为Map是从容器本身开始的,所以我认为这个解决方案应该在任何SO中工作。
我们来编码吧。
首先应创建卷

docker volume create 
--driver local 
--opt type=cifs 
--opt device=//<network-device-ip-folder>
--opt o=user=<your-user>,password=<your-pw>
<volume-name>

然后你必须从一个图像运行一个容器

docker run 
 --name <desired-container-name> 
 -v <volume-name>:/<path-inside-container>
 <image-name>

在此之后,一个容器将与分配给它的卷一起运行,并被Map到。您在其中任何一个文件夹中创建某个文件,该文件将自动复制到另一个文件夹。
如果有人想从docker-compose运行这个,我把它放在这里

services:
  <image-name>:
    build: 
      context: .
    container_name: <desired-container-name> 
    volumes:
       -  <volume-name>:/<path-inside-container>
    ...

volumes:
  <volume-name>:
    driver: local
    driver_opts: 
      type: cifs 
      device: //<network-device-ip-folder>
      o: "user=<your-user>,password=<your-pw>"

希望我能帮上忙

mzmfm0qo

mzmfm0qo4#

加上@Ал ександр Рубл ев的解决方案,我解决这个问题的诀窍是重新配置Synology NAS以接受docker使用的SMB版本。

yftpprvb

yftpprvb5#

我知道这是旧的,但我发现这是在寻找类似的东西,但看到它是接收其他人的评论,如我自己,谁找到它。我已经想出了如何让这个工作为一个类似的情况,我花了一段时间才想出。这里的答案是失踪的一些关键信息,我将包括在内,可能是因为他们当时没有可用
1.我认为CIFS存储仅适用于连接到Windows系统时,因为我认为Linux根本不会使用它,除非该系统模拟Windows环境。

  1. NFS也可以做到这一点,它的安全性较低,但几乎所有东西都支持它。
    您可以使用与CIFS卷类似的方式创建NFS卷,只是需要做一些更改。
    在*WSL 2*上使用NFS时,您首先需要将NFS服务安装到Linux主机操作系统中。我认为CIFS需要类似的服务,很可能是@LevHaikin提到的cifs-utils,但由于我不使用它,因此我不确定。在我的情况下,主机操作系统是Ubuntu,但是您应该能够通过查找系统的nfs-common(或cifs-utils,如果这是正确的话)安装的等效项来找到合适的安装
sudo apt update
sudo apt install nfs-common

就是这样。这将安装服务,使NFS在Docker上工作(我花了很长时间才意识到这是问题所在,因为它似乎没有被提到需要任何地方)
如果使用NFS,在网络设备上,你需要为NFS文件夹设置NFS权限,在我的例子中,这将在folder文件夹中完成,然后挂载到其中的一个文件夹。(在我的例子中,作为服务器的NAS安装到#IP#/volume1/folder,在NAS中,我从未在目录结构中看到volume1,但是当我设置NFS权限时,共享文件夹完整路径显示在设置页面中。我没有包括volume1部分,因为您的系统可能会有所不同)&您需要IP后的完整路径(使用IP作为编号***而不是***主机名),根据您的NFS共享,无论它是什么。
如果使用CIFS设备,则仅CIFS权限也是如此。

  • nolock选项经常需要,但可能不在您的系统上。它只是禁用“锁定”文件的功能。
  • soft选项意味着如果系统无法连接到挂载目录,它将不会挂起。如果您需要它只在挂载目录存在时才工作,您可以将其改为hard
  • rw(读/写)选项用于***读/写***,ro(只读)用于***只读***

由于我个人并不使用CIFS卷,因此设置的选项只是我找到的示例中的选项,您是否需要这些选项还需要进一步研究。

  • usernamepassword***是***必需的,并且***必须***包括在CIFS中
  • uidgid是Linux用户和组设置,我认为应该设置为您的容器所需要的,因为据我所知,Windows不使用它们
  • file_mode=0777dir_mode=0777是Linux读/写权限,本质上与chmod 0777类似,提供可以访问文件的任何内容的读/写/执行权限(详细信息链接#4)&这也适用于Docker容器,而不是CIFS主机
  • noexec与执行权限有关,但我不认为它在这里实际上起作用,但我发现它包含在大多数示例中,nosuid限制了它访问特定于特定用户ID的文件的能力,除非您知道您需要它,否则不应删除它,因为它是一种保护,我建议尽可能保留它,nosetuids意味着它不会为新创建的文件设置UID和GUID,nodev意味着无法访问/创建装载点上的设备,vers=1.0我认为是兼容性的一个备用选项,我个人不会包含它,除非有问题或没有它就无法工作

在这些示例中,我以读/写模式将//NET.WORK.DRIVE.IP/folder/on/addr/device装载到名为“my-docker-volume“的卷。CIFS卷使用用户supercool和密码noboDyCanGue55

NFS通过CLI

docker volume create --driver local --opt type=nfs --opt o=addr=NET.WORK.DRIVE.IP,nolock,rw,soft --opt device=:/folder/on/addr/device my-docker-volume

CIFS从CLI(如果Docker安装在Windows以外的系统上,则可能无法工作,只能连接到Windows系统上的IP)

docker volume create --driver local --opt type=cifs --opt o=user=supercool,password=noboDyCanGue55,rw --opt device=//NET.WORK.DRIVE.IP/folder/on/addr/device my-docker-volume

这也可以在Docker Compose或Portainer中完成。当您在那里完成时,您需要在合成文件的底部添加一个Volumes:,没有缩进,与services:处于同一级别
在此示例中,我将装载卷

  • 在读/写模式下将my-nfs-volume//10.11.12.13/folder/on/NFS/device装载到“my-nfs-volume“,并将容器中的/nfs装载到/nfs
  • my-cifs-volume//10.11.12.14/folder/on/CIFS/device(具有来自用户supercool(密码为noboDyCanGue55)的权限)以读/写模式访问“my-cifs-volume“,并将容器中的该文件装载到/cifs
version: '3'
services:
  great-container:
    image: imso/awesome/youknow:latest
    container_name: totally_awesome
    environment:
      - PUID=1000
      - PGID=1000
    ports:
      - 1234:5432
    volumes:
      - my-nfs-volume:/nfs
      - my-cifs-volume:/cifs

volumes:
  my-nfs-volume:
   name: my-nfs-volume
   driver_opts:
      type: "nfs"
      o: "addr=10.11.12.13,nolock,rw,soft"
      device: ":/folder/on/NFS/device"
  cifs-volume-test:
    driver_opts:
      type: "cifs"
      o: "username=supercool,password=noboDyCanGue55,uid=1000,gid=1000,file_mode=0777,dir_mode=0777,noexec,nosuid,nosetuids,nodev,vers=1.0"
      device: "//10.11.12.14/folder/on/CIFS/device/"

更多详细信息可在此处找到:

  1. https://docs.docker.com/engine/reference/commandline/volume_create/
  2. https://www.thegeekdiary.com/common-nfs-mount-options-in-linux/
  3. https://web.mit.edu/rhel-doc/5/RHEL-5-manual/Deployment_Guide-en-US/s1-nfs-client-config-options.html
  4. https://www.maketecheasier.com/file-permissions-what-does-chmod-777-means/

相关问题