【问题标题】:General Question about Docker Volumes vs. Bind, sharing and location an OS X关于 Docker 卷与绑定、共享和定位 OS X 的一般问题
【发布时间】:2021-09-17 12:08:09
【问题描述】:

总的来说,我仍然在学习 docker-compose 和 docker 容器的一些功能。我不清楚使用绑定将主机文件夹映射到容器文件夹与使用类似的映射作为卷之间的区别。不清楚这与声明卷有什么关系。例如,我在 docker-compose.yml 文件中定义了很多容器,但我开始使用这两个来解决我的问题:

#  MPPS testing server, DICOM

  python_mpps:
 
   build: python_mpps
   image: sdscotti/python_mpps
   depends_on: [mysql_db,pacs-1,pacs-2]
   ports: ["104:11112"]
   volumes:
      - type: bind
        source: ./python_mpps/scripts_log
        target: /scripts
      - type: bind
        source: ./tls
        target: /etc/python/tls
      - type: volume
        source: MWL
        target: /MWL
        volume:
          nocopy: true
   tty: true
   
#  MWL server, REST API

  python_mwl_api:
 
    build: python_mwl_api
    image: sdscotti/python_mwl_api
    depends_on: [mysql_db,pacs-1,pacs-2]
    ports: ["5000:5000"]
    environment:
      PORT: 5000
      FLASK_DEBUG: 1
      FLASK_ENV: development
    volumes:
      - type: bind
        source: ./python_mpps/scripts_log
        target: /scripts
      - type: bind
        source: ./tls
        target: /etc/python/tls
      - type: volume
        source: MWL
        target: /MWL
        volume:
          nocopy: true
    tty: true
    
volumes:
  MWL:

我在 Mac (Catalina) 上使用 Docker Desktop,在 LINUX 上只使用 CLI,但这与 OS X 相关。如果我进入两个容器中的 bash shell 并检查 /etc/python/tls 中的内容,我在 ./tls 中查看我的主机上还有什么,这是我希望看到的(例如)

docker exec -it 37fabd30c9afe6ca290a3e7f279a7a677061b0fbbc6277650d7055a285fb1ca4 /bin/sh
# cd /etc/python/tls
# ls
USAGE.md  copy-tls-to-docker-volumes.sh  nginx-crt.pem  nginx.cnf
ca.cnf    generate-tls.sh        nginx-key.pem

同样适用于每个容器中的 /scripts。按预期映射到主机,这就是启动时启动的 python 脚本和日志文件的位置。

# cd /scripts
# ls
mpps.log  mpps.py
# 

我应该说这些脚本文件夹仅由该特定容器使用并且不与其他容器共享,而主机上的 ./tls 由许多容器读取,但根本不写入。那就是将 ssl .crt 和 .key 文件复制到服务器,因为这是通配符证书。

如果我随后查看容器中的 /MWL 文件夹,我确实看到了我期望看到的内容:

# cd /MWL
# ls
test.wl
# 

但我不知道它在我的 OS X 主机系统上的什么位置。我可以这样做:

docker volume inspect orthanc_docker_ris_MWL
[
    {
        "CreatedAt": "2021-07-06T21:08:20Z",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "orthanc_docker_ris",
            "com.docker.compose.version": "1.29.2",
            "com.docker.compose.volume": "MWL"
        },
        "Mountpoint": "/var/lib/docker/volumes/orthanc_docker_ris_MWL/_data",
        "Name": "orthanc_docker_ris_MWL",
        "Options": null,
        "Scope": "local"
    }
]

实际上可能在某处:

/Users/xxxx/Library/Containers/com.docker.docker/Data/vms

我想要做的是将卷映射到主机上易于访问的位置,例如 docker-compose.yml 文件的根目录。使用 bind 实际上确实可以正常工作,但是我在写入由多个容器绑定的文件夹时遇到问题。不确定这是否是与 docker 本身相关的限制,或者我的一个容器是否实际上锁定了文件夹。目标确实是有一个可以从多个容器读取和写入的共享绑定或挂载,而不是可以具有相同功能的卷,但我希望将卷映射到所描述的文件夹。

我确实有 2 个“Orthanc PACS”实例也在运行,我尝试让它们也使用该卷,看起来就是这种情况,因为 Docker Desktop 显示总共绑定了 4 个容器,上面的 2 个或其他 2 人。

orthanc_docker_ris_MWL
In use by 4 containers
CREATED
38 minutes ago

这实际上是我想要的,但我必须看看我是否可以从多个容器写入卷,然后最好将它放在我的 docker-compose 文件的根目录中,而不是放在我的某个不起眼的地方我不知道的某种格式的系统。

还可能提到,在 OS X 上设置很少有其他问题,因为某些容器(即 nginx 和 php 使用主管)需要很长时间才能启动(可能需要几分钟,尽管在那之后工作正常),还有这个问题:

global.stat permission issue 在别处提到。这也发生在 LINUX 上,看起来有很多人有这个问题。

我认为 Docker Desktop for OS X 还不错,但使用 LINUX 主机要好得多。我的 NGINX - LINUX 上的 PHP 容器立即启动,所以它必须与主机文件系统管理器有关。

注意:

如果我从一个卷更改为一个绑定并删除该卷,它的设置与我想要的非常相似,但我必须测试是否有多个容器可以写入它。我怀疑 PACS 可能以某种方式锁定了该文件夹。

  - type: bind
    source: ./MWL
    target: /MWL

【问题讨论】:

    标签: docker docker-compose docker-volume docker-desktop


    【解决方案1】:

    Docker Desktop for Mac 在 Linux 虚拟机中运行 dockerd。

    “卷”由dockerd 创建并存储在 Linux 虚拟机上。无法从 macOS 直接访问该卷。

    /var/lib/docker/volumes/orthanc_docker_ris_MWL/_data 路径可以通过在 VM 的命名空间中运行容器来访问:

    $ docker run -it --rm --privileged --pid=host debian nsenter -t1 -m -u -i -n bash
    container$ ls -1 /var/lib/docker/volumes/
    01143a5cc5474d5052e2bf2ad187e42c419dc8082c8fb6d8bdf705ea94ea4fe1
    5754aad4021c67741b589b90bcc3d532a87b619aabb130c1b61dca0f3cf8f0a0
    e1372a62523b8667b59fbae31aeda3837e4036c8ea92a6dd7205a22a755e27ab
    metadata.db
    mongo-data
    srv.sqlite
    

    Docker Desktop 中的“绑定”挂载有点特殊。常规绑定挂载采用现有目录并将其映射到容器中。

    Docker Desktop 可以“绑定”本地 mac 目录 > Linux 虚拟机 > 容器。神奇的是用户空间 grpc-fuse 插件,它可以让 VM/Container 看到 mac 目录。这总是比卷或普通 Linux 主机绑定挂载要慢,尤其是当该性能基于 Linux 文件缓存时,当来自 mac 端的更改可能无法大量使用时。

    【讨论】:

    • 我认为在 LINUX 主机上运行相同的配置作为绑定在性能方面几乎与使用卷相同或一样快,并且我在 Mac 上看到的性能命中是由于在 Mac 上使用 Docker Desktop 在幕后完成的“魔法”?我可以忍受,因为我通常在 Mac 上开发,但部署在 LINUX 系统上。
    • 这就是我所看到的。在 UBUNTU 主机上启动容器需要几秒钟而不是在 Mac 上几分钟,但之后两者的运行速度大致相同。
    • 顺便说一句,你看过这个问题吗?似乎是一个没有答案的热门问题:stackoverflow.com/questions/66325175/…
    • re perf on linux,在同一文件系统上使用local卷驱动,卷与绑定挂载几乎相同。
    • 是的,mac 上的性能是由于到达 mac 的额外“跳跃”
    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    相关资源
    最近更新 更多