Встановіть вміст контейнера Docker у файловій системі хосту


24

Я хочу мати можливість перевірити вміст контейнера Docker (лише для читання). Елегантним способом цього буде монтування вмісту контейнера в каталозі. Я говорю про встановлення вмісту контейнера на хості, а не про встановлення папки на хості всередині контейнера.

Я можу бачити, що зараз у Docker є два драйвери зберігання: aufs та btrfs. Моя власна установка Docker використовує btrfs, а перегляд / var / lib / docker / btrfs / subvolumes показує мені одну директорію на контейнер Docker в системі. Це, однак, детальна інформація про реалізацію Докера, і він вважає неправильним монтувати - зв'язувати ці каталоги десь в іншому місці.

Чи є правильний спосіб зробити це, чи мені потрібно виправити Docker, щоб підтримувати подібні кріплення?


Чому було б неправильно пов’язувати кріплення десь деінде?
Майкл Хемптон

1
Оскільки місце зберігання - це деталь реалізації. Щоденний докер додає ще один драйвер пам’яті, місце переміститься. Мені потрібно зробити це напівавтоматично, і було б непогано використовувати для цього публічні API.
dflemstr

2
Можливо, варто подумати про роботу над nsenter (або докер-введенням) для досягнення своїх цілей; Звичайно, існує обмеження у тому, щоб увімкнути інспекційний код / ​​інструменти всередині контейнера.
VladFr

Чи немає способу доручити Linux встановлювати через кордон контейнера?
dflemstr

@dflemstr так, є, - volumes - від свого роду це робить, схоже, монтується об'єднання каталогу з базового зображення іншого контейнера та обсягу, але така поведінка не задокументована afaik
Тарнай Калман

Відповіді:


10

Погляньте 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
# e.g. 
docker export consul|tar x --to-stdout etc/profile

Docker 1.8 підтримує cp :

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

Usage:  docker cp [options] CONTAINER:PATH LOCALPATH|-
        docker cp [options] LOCALPATH|- CONTAINER:PATH

оновлення: під час запуску цього ви повинні запустити ssh на свою докерну машину.


2
Мої зображення досить великі (багато сотень Мігабайт), тому робити це для отримання окремих файлів занадто багато. Він буде створювати файл багатосот мегабайт кожного разу.
dflemstr

@dflemstr використовуйте рядок з tar x PATH-IN-CONTAINER, він витягне лише потрібні файли.
laktak

... але весь tarархів все ще створений у
демоні Докера

@dflemstr не впевнений, що таке налаштування, але, наприклад, docker export ubuntu|tar -t|grep etc/networkдля мене потрібно 3 секунди.
laktak

Ви, ймовірно, працюєте на тій же машині, що і демон Докера, тому вам не потрібно робити мережеву передачу, а ubuntuзображення дійсно невелике ...
dflemstr

3

Ви можете скористатись докер-фіксом для збереження поточного стану вашого контейнера в новому зображенні та запустити інтерактивний контейнер із цього зображення для огляду вмісту.

З документації:

Це може бути корисно ввести зміни або налаштування файлу контейнера в нове зображення. Це дозволяє налагоджувати контейнер за допомогою інтерактивної оболонки або експортувати робочий набір даних на інший сервер.

Сподіваюся, це допомагає.


2

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

Є й інші підходи. docker diff покаже, які файли змінилися в цьому контейнері, якщо ви хочете побачити, що змінилося замість того, що було у вихідному зображенні.

А для даних, які повинні бути стійкими та перевірятими, мабуть, кращою схемою було б розміщення її в об'ємі в контейнері та встановлення їх у реальній файловій системі, або в чистому контейнері даних, або в тому ж контейнері, але що ви можете запустити інший контейнер за допомогою програми перевірки, монтуючи ці томи з нього.


1

EDIT: Я спробував рішення нижче, і, на жаль, він не спрацював добре для мене. Вмонтована файлова система не точно відображала файлову систему контейнера (навіть з cache=no). Я не впевнений, чи це фундаментальна проблема, чи я роблю щось не так.

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

Потім docker cpскопіюйте свій відкритий ключ ssh до /root/.ssh/authorized_keysкаталогу контейнера docker.

Нарешті, використовуйте docker inspectдля пошуку IP-адреси контейнера та монтуйте файлову систему контейнера за допомогою

sudo sshfs -o allow_other,default_permissions,IdentityFile=/path/to/identityfile  root@xxx.xx.x.x:/ /mnt/my_container

Вам потрібно буде написати сценарій, щоб зробити цю роботу зручною на практиці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.