Skip to content

Контейнеры и тома Docker

Файловую систему контейнера Docker можно просматривать в панели, как любую папку, и то же верно для тома Docker. Выберите Подключиться к Docker… в меню Сеть или щёлкните фишку Docker на панели дисков — движок появится в активной панели.

Это плагин, и он поставляется выключенным. Включите его в Настройки ▸ Плагины…. Он начинает выключенным, потому что подключение к демону Docker имеет на вашем Mac те же права, что и вы сами, — см. К чему он имеет доступ ниже.

Что вы видите

Верхний уровень — три папки:

  • Compose Projects — все контейнеры, запущенные Docker Compose, сгруппированные по проекту, а затем по сервису. Сервис с одним контейнером и есть этот контейнер: my-stack/backend/etc — это /etc бэкенда. Сервис с несколькими сохраняет для них уровень, по папке на контейнер.
  • Standalone Containers — всё остальное, работающее или нет.
  • Volumes — каждый том Docker как самостоятельный диск.

Ниже вы уже в настоящей файловой системе: F3 просматривает файл, F4 правит его, F5 копирует во вторую панель, F7 создаёт папку. Вторая панель может быть чем угодно — локальной папкой, архивом, корзиной S3.

Группировка читается из меток, которые Compose ставит на свои контейнеры и тома, поэтому она верна даже для стека, чей docker-compose.yml давно исчез с этой машины.

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

Столбцы

Щёлкните правой кнопкой по заголовку столбца панели, чтобы добавить собственные столбцы провайдера:

  • Состояние — ● running, ○ stopped, ◌ paused, ! restarting.
  • Доступ — RW, RO для корневой ФС или монтирования только для чтения, VOL для тома Docker, BIND для вашей папки, смонтированной в контейнер, TMP для tmpfs.
  • Образ, ID.
  • Монтирование — у каталога, который на самом деле является монтированием, что это: Volume: my-stack_db-data либо путь на хосте за bind-монтированием. Так вы находите, какой том в Volumes содержит данные контейнера.

Остановленные контейнеры

Остановленные контейнеры перечисляются, а их файловые системы можно читать и записывать. Файловый API Docker отвечает и для контейнера, который не запускался месяц, — именно поэтому это ощущается как диск, а не как список процессов.

Двум вещам нужен действительно работающий контейнер: удалению и переименованию. В API движка Docker нет операции ни для того, ни для другого — единственный способ удалить или переместить файл внутри контейнера — это что-то в нём выполнить, — поэтому у остановленного контейнера обе отклоняются, а не имитируются.

Чего ожидать

Запись попадает внутрь от имени root, удаление выполняется от собственного пользователя контейнера. Это устройство Docker, а не решение, принятое здесь: копирование файла внутрь использует архивный API движка, который пишет как root; удаление или переименование выполняет команду внутри контейнера, а она работает под пользователем, заданным образом. Поэтому удаление может быть отклонено с отказано в доступе для файла, который вы только что смогли скопировать внутрь. Peach Commander не обходит это, выступая как root, — он сообщает вам, что ответил контейнер.

Контейнер или монтирование только для чтения отклоняет запись и сообщает об этом как об ошибке прав, а не как о сбое.

Чтение символической ссылки читает то, на что она указывает. Панель по-прежнему показывает её как ссылку в столбце Attr; F3 показывает содержимое цели, а не пустой файл.

Корень большого остановленного контейнера может не поддаваться перечислению. У Docker нет вызова, который перечисляет каталог. Прочитать каталог — значит запросить его как архив, а тот содержит всё, что под ним: у остановленного контейнера на полноразмерном образе это могут быть десятки гигабайт, и тогда перечисление отклоняется вместо того, чтобы читать всё. Каталоги глубже не затронуты, как и работающий контейнер: каталог, слишком большой для чтения как архив, перечисляет сам контейнер. Если вам нужен только архивный путь, см. настройку ниже.

Скопировать наружу весь контейнер — значит скопировать всю его файловую систему, включая /proc и /dev. Копируйте нужный каталог, а не /.

К чему он имеет доступ

Плагин говорит с тем же движком, до которого вы добрались бы из терминала: DOCKER_HOST, если вы его задали, иначе ваш текущий docker context, иначе обычные сокеты Docker Desktop, Colima, Rancher Desktop, Lima и Podman. Podman работает потому, что предоставляет тот же API.

Доступ к демону Docker, как правило, означает весьма широкий доступ к машине, на которой он работает. У плагина ровно ваши права, и большего он не просит: он не хранит учётных данных, никогда не трогает собственные каталоги Docker на вашем диске и не выполняет привилегированных действий от вашего имени.

Единственное, что он создаёт, — одноразовый контейнер, и только чтобы добраться до тома, который не смонтирован ни одним существующим контейнером, поскольку том виден лишь изнутри того, что его монтирует. Он никогда не запускается, помечен как принадлежащий Peach Commander и удаляется, когда вы покидаете диск.

Действия над контейнером или томом

Щелчок правой кнопкой по контейнеру или тому предлагает в подменю Docker то, чего диск сам по себе сказать не может:

  • Inspect — всё, что движок о нём знает, в виде отформатированного JSON, в окне, которое можно прокручивать и из которого можно копировать.
  • Show Logs — последние 500 строк, которые контейнер записал.
  • Show Mounts — каждое монтирование, которое он несёт, что это и можно ли в него писать.
  • Copy ID — полный идентификатор контейнера или имя тома в буфер обмена. Полный идентификатор, а не двенадцать символов из столбца ID: он нужен для вставки в команду docker, а короткий идентификатор — это префикс, который может перестать быть однозначным.
  • Jump to Volume — на каталоге, который на самом деле является томом, перейти к этому тому в Volumes. Это вторая половина столбца «Монтирование»: столбец называет том, а это ведёт к нему.
  • Open Compose Project — перейти к проекту, которому принадлежит контейнер.
  • Start, Stop, Restart, Pause, Unpause — они меняют контейнер, а не читают его, поэтому сначала спрашивают. Start — заодно и выход из двух отказов выше: удаление и переименование требуют работающего контейнера.

Пункты появляются только внутри диска Docker; над своей собственной папкой их нет вовсе.

Журнал — ещё и файл. В корне каждого контейнера лежит docker-logs.txt — который не является файлом контейнера: его чтение запрашивает журнал у движка. F3 открывает его в просмотрщике, так что применимы и поиск, и переход к строке, и выбор кодировки — чего отдельное окно дать не может. Контейнер, который действительно несёт файл с таким именем, показывает свой, а в виртуальный ничего записать нельзя.

Настройки

Настройки ▸ Настройки ▸ Docker содержат всё это. Те же значения лежат в небольшом файле в ~/Library/Application Support/PeachCommander/Docker/docker.ini — его и правят, когда машину готовят сценарием:

  • Endpoint — адрес, используемый вместо найденного.
  • ExecFallback — 0 заставляет плагин использовать только архивный API Docker: тогда он никогда ничего не выполняет внутри контейнера — ценой невозможности перечислить очень большой каталог, удалить и переименовать.
  • ProbeBudgetMB, MaxBudgetMB, MaxBudgetSeconds — сколько архива каталога стоит прочитать, прежде чем перейти к запасному пути или сдаться.
  • HelperImage — образ, из которого делается упомянутый одноразовый контейнер (по умолчанию любой образ, уже имеющийся на машине).
  • ShowAnonymousVolumes — 0 скрывает тома, которым Docker дал в качестве имени длинный хеш, потому что никто другой их не назвал.

Нет в этой версии

Удалённых движков по SSH или TLS, интерактивной оболочки и образов как файловых систем только для чтения.