首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于Docker卷与绑定、共享和定位OS X的一般问题

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

Stack Overflow用户
提问于 2021-07-06 21:45:17
回答 1查看 419关注 0票数 0

我还在学习一些码头组成和码头集装箱的一般特点。我不清楚使用bind将主机文件夹映射到容器文件夹与使用卷的类似映射之间的区别。也不清楚这与宣布一卷书有什么关系。例如,我在我的docker-compose.yml文件中定义了相当多的容器,但是我开始使用这2来解决我的问题:

代码语言:javascript
复制
#  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)上使用Desktop,在LINUX上只使用CLI,但这与OS有关。如果我在两个容器中进入bash shell并检查/etc/python/tls中的内容,我会在./tls中看到主机上的内容,这就是我希望看到的(例如)。

代码语言:javascript
复制
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脚本,也有一个日志文件。

代码语言:javascript
复制
# cd /scripts
# ls
mpps.log  mpps.py
# 

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

然后,如果我查看容器中的/MWL文件夹,就会看到我希望看到的:

代码语言:javascript
复制
# cd /MWL
# ls
test.wl
# 

但我不知道在OS X上我的主机系统在哪里。我可以这样做:

代码语言:javascript
复制
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"
    }
]

可能就在这里某个地方:

代码语言:javascript
复制
/Users/xxxx/Library/Containers/com.docker.docker/Data/vms

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

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

代码语言:javascript
复制
orthanc_docker_ris_MWL
In use by 4 containers
CREATED
38 minutes ago

这是我实际上想要的,但我必须看看是否可以从多个容器中写入卷,然后理想地将它放在我的坞-复合文件的根部,而不是以我不知道的格式在我的系统中某个不知名的位置。

还可以提到,在OS X上安装程序很少有其他问题,因为一些容器(即使用php的nginx使用监督器)需要很长时间才能启动(可能需要几分钟,不过在此之后可以正常工作),还有这样的问题:

global.stat permission issue在其他地方提到过。这也发生在LINUX上,看起来有很多人都有这个问题。

我认为用于OS的Desktop并不是太糟糕,但是使用LINUX主机要好得多。我在LINUX上的NGINX容器立即启动,因此它必须与主机文件系统管理器有关。

注:

如果我从一个卷更改为一个绑定,并删除该卷,它就像我想要的那样设置好了,但是我必须测试一个以上的容器是否可以写入它。我怀疑可能是PACS以某种方式锁定了文件夹。

代码语言:javascript
复制
  - type: bind
    source: ./MWL
    target: /MWL
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-07 07:04:06

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

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

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

代码语言:javascript
复制
$ 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

在Desktop中的“绑定”安装是一个特殊情况。常规绑定挂载接受一个现有目录并将其映射到容器中。

Desktop使用一些魔法来“绑定”本地mac目录> Linux虚拟机>容器。神奇的是一个用户空间grpc插件,它让VM/Container看到mac目录。这总是比卷或普通Linux主机绑定挂载慢,特别是当这种性能是基于Linux文件缓存时,当从mac端进行更改时,这种缓存不能被大量使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68277663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档