簡體   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