Общий вопрос о томах Docker и привязке, совместном использовании и расположении 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:

Я использую Docker Desktop на Mac (Catalina) и только CLI на LINUX, но это относится к OS X. Если я зайду в оболочку bash в обоих контейнерах и проверю, что находится в /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. Использование привязки на самом деле работает нормально, но у меня возникают проблемы с записью в папку, которая связана более чем с одним контейнером. Не уверен, является ли это ограничением, связанным с самим докером, или один из моих контейнеров фактически блокирует папку. На самом деле цель состоит в том, чтобы иметь общую привязку или монтирование, которые могут читать и записывать из нескольких контейнеров, а не том, который может иметь ту же функциональность, но я бы хотел, чтобы том был сопоставлен с папкой, как описано.

У меня также есть 2 экземпляра Orthanc PACS, и я попытался заставить их использовать этот том, и похоже, что это так, потому что Docker Desktop показывает в общей сложности 4 связанных контейнера, 2 выше или 2 других.

orthanc_docker_ris_MWL
In use by 4 containers
CREATED
38 minutes ago

На самом деле это то, что я хочу, но мне нужно посмотреть, смогу ли я писать на том из нескольких контейнеров, а затем в идеале иметь его в корне моего файла для создания докеров, а не в каком-то неясном месте в моей системе в какой-то неизвестный мне формат.

Можно также упомянуть, что есть несколько других проблем с настройкой в ​​​​OS X, поскольку некоторые контейнеры (например, nginx с php с использованием супервизора) требуют много времени для запуска (возможно, пару минут, хотя после этого работает нормально), и есть также эта проблема:

проблема с разрешением global.stat упоминается в другом месте. Это также происходит в LINUX, и похоже, что есть много людей с этой проблемой.

Я считаю, что Docker Desktop для OS X не так уж плох, но гораздо лучше использовать хост LINUX. Мой контейнер NGINX — PHP в LINUX запускается сразу, поэтому он должен иметь какое-то отношение к диспетчеру файловой системы хоста.

ПРИМЕЧАНИЕ:

Если я перейду с тома на привязку и удалю том, он будет настроен почти так, как я этого хочу, но мне придется проверить, могут ли в него записывать более одного контейнера. Я подозреваю, что, возможно, PACS каким-то образом блокирует папку.

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

person SScotti    schedule 06.07.2021    source источник


Ответы (1)


Docker Desktop для Mac запускает dockerd на виртуальной машине Linux.

Том создается и сохраняется dockerd на виртуальной машине Linux. Том не доступен напрямую из macos.

Доступ к пути /var/lib/docker/volumes/orthanc_docker_ris_MWL/_data можно получить, запустив контейнер в пространстве имен виртуальной машины:

$ 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 пространства пользователя, который позволяет виртуальной машине/контейнеру видеть каталог Mac. Это всегда будет медленнее, чем том или простое монтирование хоста Linux, особенно когда эта производительность основана на кэше файлов Linux, который нельзя использовать так интенсивно, когда изменения могут поступать со стороны Mac.

person Matt    schedule 07.07.2021
comment
Я полагаю, что запуск той же конфигурации на хосте LINUX в ​​качестве привязки почти такой же или такой же быстрой, как использование тома с точки зрения производительности, и снижение производительности, которое я вижу на Mac, связано с магией, проделанной за кулисами с Рабочий стол Docker на Mac? Я могу смириться с этим, так как я обычно разрабатываю на Mac, но развертываю в системе LINUX. - person SScotti; 16.07.2021
comment
Это то, что я вижу. Запуск контейнеров на хостах UBUNTU занимает несколько секунд, а не минут на Mac, но после этого оба работают примерно с одинаковой скоростью. - person SScotti; 16.07.2021
comment
Кстати, вы смотрели на этот вопрос? Кажется, это популярный вопрос без ответа: stackoverflow.com/questions/66325175/ - person SScotti; 16.07.2021
comment
re perf в Linux, используя драйвер тома local в той же файловой системе, том будет почти таким же, как при монтировании. - person Matt; 19.07.2021
comment
и да, производительность на Mac связана с дополнительным прыжком, чтобы добраться до Mac - person Matt; 19.07.2021
comment
На самом деле, просто проверьте docker volume inspect some-mac-dir. Может быть, они реализовали его как драйвер громкости? Я перестал использовать Docker для Mac примерно в то время, когда они представили grpc-fuse, поэтому не видел, как он работает внутри. - person Matt; 19.07.2021