Как работает сопоставление томов и устройств в Docker

Я создал два тома Docker:

docker volume create volume1
docker volume create volume2

затем я создал контейнер Docker с помощью команды:

docker create -it ... some options ... -v volume1:/var/vcap/store -v volume2:/var/vcap/store2 --privileged myimage /bin/bash

Контейнер Docker имеет правильно настроенный ssh, поэтому, когда я в нем ssh, я правильно вижу том, смонтированный в /var/vcap/store. В частности, я вижу это:

/dev/sda1 on /var/vcap/store type ext4 (rw,relatime,data=ordered)
/dev/sda1 on /var/vcap/store2 type ext4 (rw,relatime,data=ordered)

Кроме того, я вижу и другие файловые системы на устройстве /dev/sda1:

/dev/sda1 on /etc/resolv.conf type ext4 (rw,relatime,data=ordered)
/dev/sda1 on /etc/hostname type ext4 (rw,relatime,data=ordered)
/dev/sda1 on /etc/hosts type ext4 (rw,relatime,data=ordered)

это меня сильно смущает, потому что мне непонятно, как можно смонтировать одно и то же устройство в разных папках и иметь разные файловые системы. На самом деле я убедился, что если я создам файл в /var/vcap/store на виртуальной машине Linux, на которой размещен контейнер на Mac, я увижу в папке:

/var/lib/docker/volumes/volume1/_data 

созданный файл. Если я создам его в /var/vcap/store2 на виртуальной машине Linux, я увижу, что он создан в

/var/lib/docker/volumes/volume2/_data

Все идет нормально. Моя проблема в том, что я создал контейнер как привилегированный, потому что хочу монтировать и размонтировать эти файловые системы. Размонтировать работает нормально, но если я попытаюсь смонтировать том снова, я не знаю, какое устройство использовать. Если я использую команду:

mount /dev/sda1 /var/vcap/store

Я вижу в этой папке следующее содержимое:

cni  containerd  docker  kubeadm  kubelet-plugins  log  lost+found  nfs  swap

что я не знаю, откуда это.

Вопросы:

  1. Когда я монтирую том в Docker, как он отображается на устройстве /dev/sda1?
  2. Как возможно одно и то же устройство для разных файловых систем?
  3. Предположим, я использую Docker в привилегированном режиме, какую команду монтирования следует использовать для повторного монтирования ранее размонтированных файловых систем?

person Salvatore D'angelo    schedule 18.05.2018    source источник


Ответы (1)


Отвечая на ваши вопросы:

  1. Когда я монтирую том в Docker, как он отображается на устройстве /dev/sda1?

Когда вы создаете том docker, docker создает внутреннюю символическую ссылку на /var/lib/docker/volumes/volume_name. Если /var/lib/docker/volumes смонтирован в /dev/sda1, каждый том и смонтированный файл или каталог, принадлежащий /dev/sda1, будут отображаться в одной и той же точке, потому что на самом деле они являются символическими ссылками.

  1. Как возможно одно и то же устройство для разных файловых систем?

На него также дан ответ № 1: это та же файловая система, но разные внутренние символические ссылки. Docker выполняет «виртуальное» монтирование, поэтому у вас есть только один реальный /dev/sda1, хотя их может быть несколько. Вот почему вы не можете размонтировать /dev/sda1 из контейнера. Всего один «виртуальный» докер размонтирован.

  1. Предположим, я использую Docker в привилегированном режиме, какую команду монтирования следует использовать для повторного монтирования ранее размонтированных файловых систем?

Виртуальное монтирование, которое выполняется docker run или docker-compose up, невозможно выполнить внутри контейнера, потому что тома будут ссылаться на точку монтирования хоста (/dev/sda1). Определенно, я рекомендую контролировать монтирование и размонтирование с хоста, который запускает контейнеры. Если вам нужно смонтировать и размонтировать контейнер, пожалуйста, монтируйте и размонтируйте другие точки монтирования (например, каталог samba, хранилище nfs и т. д.), чем текущий /dev/sda1, чтобы избежать недоразумений.

person Alejandro Galera    schedule 21.05.2018
comment
Можно еще пункт 3. Я хочу использовать Docker для создания среды разработки для тестирования кластера PostgreSQL, и по какой-то причине я не могу объяснить здесь мою проблему с монтированием/размонтированием нескольких файловых систем. Моя проблема заключается в том, чтобы каким-то образом имитировать эти монтирования/размонтирования в Docker. Возможно ли это даже с обходным путем? - person Salvatore D'angelo; 21.05.2018