Смонтировать содержимое контейнера Docker в файловую систему хоста

Вопрос или проблема

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

Я вижу, что в Docker сейчас есть два драйвера хранения: aufs и btrfs. У меня в Docker используется btrfs, и когда я просматриваю /var/lib/docker/btrfs/subvolumes, я вижу одну директорию на каждый Docker-контейнер в системе. Однако это деталь реализации Docker, и кажется неверным использовать mount –bind для этих директорий где-то в другом месте.

Существует ли правильный способ сделать это, или мне нужно изменить Docker, чтобы поддерживать такие монтирования?

Обратите внимание на docker export.

Чтобы быстро перечислить файлы в вашем контейнере:

docker export CONTAINER|tar -t

Для экспорта:

docker export CONTAINER>snapshot.tar
docker export CONTAINER|tar x PATH-IN-CONTAINER

Или чтобы просмотреть файл:

docker export CONTAINER|tar x --to-stdout PATH-IN-CONTAINER
# например 
docker export consul|tar x --to-stdout etc/profile

Docker 1.8 поддерживает cp:

https://docs.docker.com/engine/reference/commandline/cp/

Использование: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
        docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

обновление: вы должны подключиться по ssh к вашей Docker-машине, когда выполняете эту операцию.

Вы можете использовать docker commit, чтобы зафиксировать текущее состояние вашего контейнера в новом образе и запустить интерактивный контейнер из этого образа для инспектирования содержимого.

Из документации:

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

Надеюсь, это поможет.

Вы можете использовать nsenter, чтобы запустить вашу программу инспекции (которая вероятно уже должна быть включена в контейнер) внутри контейнера/пространства имен. Но чтобы смонтировать файловую систему контейнера так, как она видна внутри, вы должны смонтировать оригинальный образ и все слои, если используется aufs, или эквивалентное действие для device mapper, btrfs и других (в будущем) используемых движков хранения, различающихся в каждом случае. Вероятно, было бы более эффективно позволить Docker делать эту работу за вас, так как это и предполагалось, и использовать nsenter для инспекции внутри контейнера.

Есть другой подход. docker diff покажет, какие файлы изменились в этом контейнере, если вы хотите увидеть, что изменилось, а не что было в оригинальном образе.

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

ИЗМЕНИТЬ: Я попробовал решение ниже и, к сожалению, оно не сработало для меня на практике. Смонтированная файловая система не точно отражала файловую систему контейнера (даже с cache=no). Я не уверен, является ли это фундаментальной проблемой или я делаю что-то неправильно.

Вы можете установить sshd в образ Docker и использовать docker exec для запуска ssh-сервиса (/usr/sbin/sshd -D) в контейнере Docker (учтите, что порт SSH 22 контейнера Docker должен быть открыт).

Затем используйте docker cp, чтобы скопировать ваш публичный ssh-ключ в директорию /root/.ssh/authorized_keys контейнера Docker.

Наконец, используйте docker inspect, чтобы найти IP-адрес контейнера и смонтировать файловую систему контейнера с использованием

sudo sshfs -o allow_other,default_permissions,IdentityFile=/path/to/identityfile  [email protected]:/ /mnt/my_container

Вам нужно будет написать скрипт, чтобы это работало удобно на практике.

Podman может запускать и работать с Docker-образами. Вы могли бы использовать его, чтобы смонтировать работающий или остановленный контейнер:

prompt:~ # mnt=`podman mount 26e8b85f7a5c`
prompt:~ # ls $mnt
bin  boot  dev  etc  home  lib  ...  tmp  usr  var

где 26e8b85f7a5c — это ID контейнера, который нужно смонтировать.

Это устаревший вопрос, но если кто-то все еще ищет способ смонтировать (и исследовать) файловую систему Docker с произвольного хоста, существуют 2 проекта, которые позволяют сделать именно это:

Недавно я пытался добиться того же самого и в итоге написал небольшую утилиту под названием docker-mounter для этого: https://github.com/JosephRedfern/docker-mounter.

Она работает, инспектируя метаданные образа и генерирует команду монтирования overlay2, так что вы можете получить доступ к образу как к файловой системе, не требуя создания контейнера, например:

mkdir /tmp/mountpoint-for-image    
sudo docker-mount --mount --pull --mount-point /tmp/mountpoint-for-image ubuntu:latest

чтобы смонтировать ubuntu:latest в /tmp/mountpoint-for-image.

.

Ответ или решение

Чтобы смонтировать содержимое Docker-контейнера в файловую систему хоста, важно выбрать нестандартные методы, поскольку контейнеры изначально не предназначены для прямого доступа их файловой системы с хоста. Тем не менее, существует несколько подходов, которые можно использовать для достижения этой цели, придерживаясь высоких профессиональных стандартов и оптимизации для SEO:

Подходы к монтированию содержимого Docker-контейнера:

  1. Использование команды docker export:

    • Описание: Команда docker export позволяет извлечь файловую систему контейнера в архив. Это может быть полезно для изучения содержимого контейнера без его запуска.
    • Пример использования:
      docker export CONTAINER_ID | tar -t
      docker export CONTAINER_ID > snapshot.tar
      docker export CONTAINER_ID | tar x PATH-IN-CONTAINER
    • Преимущества: Простой способ для чтения всех файлов без необходимости выполнения контейнера.
    • Недостатки: Создание архива может занять время, и подавляющая часть информации будет в одном месте.
  2. Использование команды docker cp:

    • Описание: С docker cp можно копировать файлы или папки из контейнера на хостовую машину и наоборот.
    • Преимущество: Позволяет копировать только необходимые файлы.
    • Недостаток: Не позволяет монтировать полный файл системы контейнера.
  3. Использование nsenter:

    • Описание: nsenter позволяет запустить процессы внутри контейнера или доступа к его куче, но для монтирования всех слоев, вам нужно знать, какие файловые системы использует Docker, будь то aufs, device mapper или btrfs.
    • Применение: Требует понимания внутренней структуры Docker и может быть трудоемким.
  4. Использование Podman:

    • Описание: podman может использоваться для монтирования контейнера, работая с Docker-образами.
    • Пример:
      mnt=$(podman mount YOUR_CONTAINER_ID)
      ls $mnt
    • Преимущество: Позволяет монтировать файловую систему запущенного или остановленного контейнера довольно просто.
  5. Инструменты как Dockerfuse и Docker-fs:

    • Описание: Инструменты такие как Dockerfuse и Docker-fs позволяют монтировать файловую систему контейнера для чтения.
    • Замечание: Эти проекты могут быть устаревшими, поэтому стоит проверить их актуальность и поддерживаемость.
  6. Использование утилиты docker-mounter:

    • Описание: Специализированная утилита, которая может генерировать команды монтирования для работы с файловой системой контейнера.
    • Пример:
      mkdir /tmp/mountpoint
      sudo docker-mount --mount --pull --mount-point /tmp/mountpoint ubuntu:latest
    • Преимущество: Упрощает доступ к содержимому контейнера без его развертывания.

Заключение

При выборе подхода важно учитывать ваши конкретные требования к безопасности и эффективности. Каждый из методов имеет свои плюсы и минусы, поэтому тоже стоит попробовать несколько из них, чтобы найти наилучшее решение для ваших нужд. Постоянный мониторинг и адаптация хостовых и контейнерных взаимоотношений помогут избежать рисков и оптимизировать процесс разработки и администрирования.

Таким образом, монтирование содержимого Docker-контейнера в систему хоста возможно через разные методы, которые следует выбирать с учетом специфики задачи и инфраструктуры.

Оцените материал
Добавить комментарий

Капча загружается...