繁体   English   中英

如何为 Windows (Windows 10) 挂载 Docker 中的网络卷

[英]How to mount network Volume in Docker for Windows (Windows 10)

我们正在努力在 Docker 中创建一个标准的“数据科学”图像,以帮助我们的团队保持一致的环境。 为了使这对我们有用,我们需要容器对我们公司的网络具有读/写访问权限。 如何将网络驱动器挂载到 docker 容器?

这是我使用来自 Docker Hub 的 rocker/rstudio 图像尝试过的:

这有效:

docker run -d -p 8787:8787 -v //c/users/{insert user}:/home/rstudio/foobar rocker/rstudio

这不起作用(其中 P 是 .network 驱动器的映射位置): 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 比较陌生,所以如果我不是很清楚,请告诉我。

我知道这相对较旧-但为了其他人-这通常对我有用。 使用 - 我们使用 Windows 文件服务器,因此我们使用 cifs-utils 来映射驱动器。 我假设以下说明也可以应用于 nfs 或其他任何东西。

首先 - 需要以特权模式运行容器,以便您可以在容器内挂载远程文件夹(可能不需要--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

创建要映射的本地目录
mkdir /mnt/my-mounted-folder

准备一个包含用户名和凭据的文件
echo "username=<username-with-access-to-shared-drive>" > ~/.smbcredentials
echo "password=<password>" > ~/.smbcredentials

映射远程文件夹
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

现在你应该可以访问了

希望这可以帮助..

最近几天我一直在寻找解决方案,我只是得到一个工作。

我在 ubuntu 虚拟机上运行 docker 容器,并且在运行 Windows 10 的同一网络上的其他主机上映射文件夹,但我几乎可以肯定运行容器的操作系统不是问题,因为映射来自容器本身,所以我认为这个解决方案应该适用于任何 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>

在此之后,容器正在运行并分配给它的卷,并映射到 . 您在其中任何一个文件夹中创建一些文件,它将自动复制到另一个。

如果有人想从 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>"

希望我能帮上忙

我会写下我的决定。 我有一台 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"

我有相同的场景,但对于 Windows docker 图像。 我已经在 Windows Server 2016 上安装了 docker EE。我已经将外部 SMB 共享安装为“Z:”上的网络驱动器,并尝试在执行 docker run 命令时使用它。 但是 docker 容器无法找到路径“Z:”。

尝试了以下选项,但没有一个起作用。 请指教:

选项 1: --volume "Z:\\repository:C:\\repository"

选项 2: --mount type=bind,source=Z:\\repository,target=C:\\repository

选项 3:--volume “\\\\IP-of-Remote-Server-SMB\\Shared-Storage\\repository:C:\\repository”

选项 4:--volume “\\\\FQDN-of-Remote-Server-SMB\\Shared-Storage\\repository:C:\\repository”

此外,特权模式似乎不适用于 Windows。

添加到@Александр Рублев 的解决方案中,为我解决此问题的技巧是重新配置 Synology NAS 以接受 docker 使用的 SMB 版本。 就我而言,我必须启用 SMBv3

我知道这是旧的,但我在寻找类似的东西时发现了这个,但看到它正在收到其他人的评论,比如我自己,找到它的人。 我已经想出如何让它在我花了一段时间才弄清楚的类似情况下工作 这里的答案缺少一些我将包含的关键信息,可能是因为当时没有这些信息

  1. 我相信 CIFS 存储仅在您连接到Windows 系统时使用,因为我认为它根本不会被 Linux 使用,除非该系统正在模拟 Windows 环境。
  2. 同样的事情可以用 NFS 完成,它不太安全,但几乎所有东西都支持。

您可以使用与 CIFS 卷类似的方式创建 NFS 卷,只需进行一些更改。 我会列出两者,以便可以并排查看

WSL2上使用 NFS 时,您首先需要将 NFS 服务安装到 Linux 主机操作系统中。 我相信 CIFS 需要一个类似的工具,很可能是@LevHaikin 提到的cifs-utils ,但由于我不使用它,所以我不确定。 在我的例子中,主机操作系统是 Ubuntu,但您应该能够通过找到您的系统的nfs-common (或cifs-utils ,如果正确的话)安装的等价物来找到合适的操作系统

sudo apt update
sudo apt install nfs-common

就是这样。 这将安装该服务,以便 NFS 在 Docker 上工作(我花了很长时间才意识到这是问题所在,因为它似乎没有在任何地方根据需要被提及)


如果使用 NFS,在 .network 设备上,您需要为 NFS 文件夹设置 NFS 权限,在我的例子中,这将在folder夹中完成,然后挂载到其中的文件夹。 没关系。 (在我的例子中,作为我服务器的 NAS 安装到#IP#/volume1/folder ,在 NAS 中我从未在目录结构中看到volume1 ,但是当我设置时共享文件夹的完整路径显示在设置页面中NFS 权限。我不包括volume1部分,因为您的系统可能会有所不同)并且您需要 IP 之后的完整路径(使用 IP 作为数字而不是主机名),根据您的 NFS 共享,无论它是什么是。

如果使用 CIFS 设备,则同样适用于 CIFS 权限。

  • 通常需要nolock选项,但您的系统上可能没有。 它只是禁用“锁定”文件的能力。
  • soft选项表示如果系统无法连接到挂载目录,它不会挂起。 如果您需要它仅在安装存在时工作,您可以将其更改为hard
  • rw (读/写)选项用于Read/Writero (只读)用于Read Only

由于我个人不使用 CIFS 卷,因此设置的选项只是我发现的示例中的选项,您需要研究它们是否必要。

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

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

来自 CLI 的NFS

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

来自 CLI 的CIFS (如果 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
  • 来自//10.11.12.14/folder/on/CIFS/devicemy-cifs-volume /cifs my-cifs-volume具有用户supercool的权限,密码为noboDyCanGue55
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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM