Я заметил с докером, что мне нужно понять, что происходит внутри контейнера или какие файлы там существуют. Одним из примеров является загрузка изображений из индекса докера - вы не знаете, что содержит изображение, поэтому невозможно запустить приложение.
То, что было бы идеально, - это иметь возможность использовать ssh или что-то подобное. Есть ли инструмент для этого, или моя концепция докера неверна, когда я думаю, что я смогу это сделать.
linux
docker
filesystems
user2668128
источник
источник
docker exec <container> bash
. Итак, вы просто открываете оболочку внутри контейнера.docker exec <container> ls <dir path>
иdocker exec <container> cat <file path>
. Однако для bash добавьте-it
параметры.docker image save image_name > image.tar
как указано в ответе @ Gaurav24.Ответы:
ОБНОВЛЕНИЕ
Самый простой метод: использование docker exec
Docker версии 1.3 или новее поддерживает команду,
exec
которая ведет себя подобноnsenter
. Эта команда может запустить новый процесс в уже запущенном контейнере (в контейнере должен быть запущен процесс PID 1). Вы можете запустить,/bin/bash
чтобы изучить состояние контейнера:см. документацию командной строки Docker
Альтернативный метод 1
Снимок
Вы можете оценить файловую систему контейнера следующим образом:
Таким образом, вы можете оценить файловую систему работающего контейнера в точный момент времени. Контейнер все еще работает, никакие будущие изменения не включены.
Позже вы можете удалить снимок, используя (файловая система работающего контейнера не затронута!):
Альтернативный метод 2
SSH
Если вам нужен постоянный доступ, вы можете установить sshd в свой контейнер и запустить демон sshd:
Таким образом, вы можете запустить свое приложение, используя ssh (подключитесь и выполните то, что вы хотите).
ОБНОВЛЕНИЕ: Альтернативный метод 3
nsenter
Используйте
nsenter
, см. Https://web.archive.org/web/20160305150559/http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/источник
Option 1
.RUN apk update && apk add bash
(размер: ~ 4 МБ)docker exec -t -i mycontainer /bin/sh
ОБНОВЛЕНИЕ: ИЗУЧЕНИЕ!
Эта команда должна позволить вам исследовать работающий докер-контейнер :
Эквивалентом этого в docker-compose будет:
(web - это имя службы в этом случае, по умолчанию оно имеет tty.)
Как только вы внутри, сделайте:
или любая другая команда bash, такая как:
Эта команда должна позволить вам изучить образ докера :
однажды внутри сделайте:
или любая другая команда bash, такая как:
-it
Означает интерактивный ... и терминал.Эта команда должна позволить вам проверить работающий Docker-контейнер или изображение :
docker inspect name-of-container-or-image
Вы можете сделать это и выяснить, есть ли там
bash
илиsh
там. Ищите точку входа или cmd в возвращении json.смотрите документацию по Docker Exec
смотрите документацию по excker-compose exec
см докер проверять документацию
источник
docker exec -ti <name> powershell
( источник )docker exec -ti <name> cmd
работало. А для других новичков, таких как я, обязательно используйте имя экземпляра контейнера изdocker ps
(например, 070494393ca5), а не читаемое имя, которое вы ему присвоили.Если ваш контейнер остановлен или не имеет оболочки (например,
hello-world
упомянутой в руководстве по установке или нетalpine
traefik
), это, вероятно, единственный возможный метод исследования файловой системы.Вы можете заархивировать файловую систему вашего контейнера в файл tar:
Или перечислите файлы:
Обратите внимание, что в зависимости от образа, это может занять некоторое время и место на диске.
источник
export
примера выше попал в точку:docker export adoring_kowalevski | tar tf -
f -
в конце команды, tar читает из стандартного ввода по умолчанию. Простоdocker export adoring_kowalevski | tar t
работает.tar f
зависит от конфигурации. Одна часть - этоTAPE
переменная окружения. Другие контролируются как часть сборки. Чистый эффект заключается в том, что никогда не следует предполагать, что он читает stdin или пишет stdout, но всегда указывает это явно.Файловая система контейнера находится в папке данных docker, обычно в / var / lib / docker. Для запуска и проверки работающей файловой системы контейнеров выполните следующие действия:
И теперь текущий рабочий каталог является корнем контейнера.
источник
Перед созданием контейнера:
Если вы хотите изучить структуру образа, который монтируется внутри контейнера, вы можете сделать
Это даст вам видимость всех слоев изображения и его конфигурации, которая присутствует в файлах json.
После создания контейнера:
Для этого уже есть много ответов выше. мой предпочтительный способ сделать это будет -
источник
Ответ с наибольшим количеством голосов работает для меня, когда контейнер фактически запущен, но когда невозможно запустить и, например, вы хотите скопировать файлы из контейнера, это спасло меня раньше:
Благодаря Docker CP ( ссылка ) вы можете копировать непосредственно из контейнера, как это было в любой другой части вашей файловой системы. Например, восстановление всех файлов внутри контейнера:
Обратите внимание, что вам не нужно указывать, что вы хотите копировать рекурсивно.
источник
На Ubuntu 14.04 с Docker 1.3.1 я обнаружил корневую файловую систему контейнера на хост-компьютере в следующем каталоге:
Полная информация о версии Docker:
источник
devicemapper
каталога). Файл существует в/var/lib/docker/overlay/<a sha256 apparently/<upper or merged>/...
. Я не уверен, насколько портативно / безопасно для доступа к файлам тамdirect-lvm
например.Попробуйте использовать
Возможно, что bash не реализован. для этого вы можете использовать
источник
Я использую другой подвох, который не зависит от aufs / devicemapper.
Я смотрю на команду, что контейнер работает, например,
docker ps
и если это Apache илиjava
я просто делаю следующее:и вуаля ты внутри контейнера.
Как правило, вы можете войти как root в
/proc/<PID>/root/
папку, пока этот процесс выполняется контейнером. Остерегайтесь символических ссылок не будет иметь смысла, используя этот режим.источник
Ответ с наибольшим количеством голосов хорош, за исключением случаев, когда ваш контейнер не является реальной системой Linux.
Многие контейнеры (особенно основанные на Go) не имеют стандартного двоичного файла (нет
/bin/bash
или/bin/sh
). В этом случае вам необходимо получить непосредственный доступ к файлу фактических контейнеров:Работает как шарм:
Примечание: вам нужно запустить его как root.
источник
В моем случае никакая оболочка не поддерживалась в контейнере, кроме
sh
. Итак, это работает как шармисточник
Вы можете использовать погружение для интерактивного просмотра содержимого изображения с помощью TUI.
https://github.com/wagoodman/dive
источник
Это запустит сессию bash для изображения:
запуск докера --rm -it --entrypoint = / bin / bash
источник
Для меня это хорошо работает (спасибо последним комментариям за указание на каталог / var / lib / docker / ):
Здесь 2465790aa2c4 - это короткий идентификатор работающего контейнера (отображаемый докером ps ), за которым следует звездочка.
источник
В новых версиях Docker вы можете запустить,
docker exec [container_name]
которая запускает оболочку внутри вашего контейнераТаким образом, чтобы получить список всех файлов в контейнере, просто запустите
docker exec [container_name] ls
источник
Для драйвера docker aufs:
Скрипт найдет корневой каталог контейнера (тест на докере 1.7.1 и 1.10.3)
источник
Ни один из существующих ответов не относится к случаю контейнера, который вышел (и не может быть перезапущен) и / или не имеет установленной оболочки (например, бездисковых). Этот работает, пока у вас есть root-доступ к хосту Docker.
Для реальной ручной проверки сначала узнайте идентификаторы слоев:
На выходе вы должны увидеть что-то вроде
Перейдите в эту папку (как root), чтобы найти текущее видимое состояние файловой системы контейнера.
источник
Этот ответ поможет тем (как я), которые хотят изучить файловую систему тома Docker, даже если контейнер не запущен.
Список запущенных докер-контейнеров:
docker ps
=> КОНТЕЙНЕР ID "4c721f1985bd"
Посмотрите точки подключения тома докера на вашем локальном физическом компьютере ( https://docs.docker.com/engine/tutorials/dockervolumes/ ):
docker inspect -f {{.Mounts}} 4c721f1985bd
=> [{/ tmp / container-garren / tmp true rprivate}]
Это говорит мне о том, что каталог локальной физической машины / tmp / container-garren сопоставлен с местом назначения тома / tmp.
Знание каталога локальной физической машины (/ tmp / container-garren) означает, что я могу исследовать файловую систему независимо от того, работает ли контейнер Docker. Это было важно, чтобы помочь мне понять, что есть некоторые остаточные данные, которые не должны были сохраняться даже после того, как контейнер не работал.
источник
Другой трюк заключается в использовании атомарного инструмента, чтобы сделать что-то вроде:
Образ Docker будет смонтирован в / path / to / mnt, чтобы вы могли его проверить.
источник
Только для LINUX
Самым простым способом, который я использовал, было использование proc dir, который должен быть запущен для проверки файлов контейнера докера.
Узнайте идентификатор процесса (PID) контейнера и сохраните в некоторую переменную
Убедитесь, что процесс контейнера запущен, и используйте переменную name, чтобы попасть в папку контейнера
Если вы хотите пройти через каталог без определения номера PID, просто с помощью этой длинной команды
Советы:
После того, как вы попадете внутрь контейнера, все, что вы сделаете, повлияет на фактический процесс контейнера, такой как остановка службы или изменение номера порта.
Надеюсь, поможет
Замечания:
Этот метод работает, только если контейнер все еще работает, иначе каталог больше не будет существовать, если контейнер остановлен или удален
источник
Мой предпочтительный способ понять, что происходит внутри контейнера:
выставить -p 8000
Запустите сервер внутри него
источник
Для уже запущенного контейнера вы можете сделать:
Вы должны быть root, чтобы войти в этот каталог. Если вы не root, попробуйте sudo su перед выполнением команды.
Изменить: После v1.3 см. Ответ Jiri - это лучше.
источник
Если вы используете Docker v19.03, выполните следующие действия.
источник
Если вы используете драйвер хранилища AUFS, вы можете использовать мой сценарий уровня докера, чтобы найти корневой каталог файловой системы любого контейнера (mnt) и слой readwrite:
Изменить 2018-03-28:
docker-layer заменен на docker-backup
источник
Команда
docker exec
для запуска команды в работающем контейнере может помочь в нескольких случаях.Например :
1) Доступ в bash к работающей контейнерной файловой системе:
2) Доступ в bash к работающей контейнерной файловой системе от имени пользователя root для получения необходимых прав:
Это особенно полезно, чтобы иметь возможность выполнять некоторую обработку от имени root в контейнере.
3) Доступ в bash к работающей контейнерной файловой системе с определенным рабочим каталогом:
источник
Вы можете запустить bash внутри контейнера с помощью этого:
$ docker run -it ubuntu /bin/bash
источник