关于 Docker 卷与绑定、共享和位置的一般问题 OS X

General Question about Docker Volumes vs. Bind, sharing and location an OS X

我仍在学习 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 桌面,在 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 上的设置几乎没有其他问题,因为某些容器(即使用主管的 php 的 nginx)需要很长时间才能启动(几个也许几分钟,尽管之后工作正常),还有这个问题:

别处提到。这也发生在 LINUX 上,看起来有很多人遇到了这个问题。

我把它 Docker Desktop for OS X 也不错,但是用 LINUX host 好多了。我的 NGINX - LINUX 上的 PHP 容器立即启动,所以它一定与主机文件系统管理器有关。

注意:

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

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

Docker Mac 的桌面在 Linux 虚拟 machine 中运行 dockerd。

“卷”由 dockerd 在 Linux 虚拟 machine 上创建和存储。无法从 macos.

直接访问该卷

/var/lib/docker/volumes/orthanc_docker_ris_MWL/_data 路径可以通过 运行 VM 名称中的容器访问space:

$ 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 桌面中的“绑定”挂载有点特殊。常规绑定挂载采用现有目录并将其映射到容器中。

Docker Desktop 做了一些魔法来“绑定”本地 mac 目录 > Linux 虚拟 machine > 容器。神奇的是一个用户 space grpc-fuse 插件,它让 VM/Container 看到 mac 目录。这总是比卷或普通 Linux host 绑定挂载慢,特别是当性能基于 Linux 文件缓存时变化可以来自 mac 方面。