Часто задаваемые вопросы по Linux

В чем разница между Docker Desktop для Linux и Docker Engine

Docker Desktop для Linux и Docker Engine можно установить рядом на одном компьютере. Docker Desktop для Linux хранит контейнеры и образы в изолированном хранилище внутри виртуальной машины и предлагает элементы управления для ограничения его ресурсы. Использование выделенного хранилища для Docker Desktop предотвращает его вмешательство в установку Docker Engine на том же компьютере.

Хотя можно одновременно запускать и Docker Desktop, и Docker Engine, могут возникнуть ситуации, когда одновременный запуск обоих может вызвать проблемы. Например, при сопоставлении сетевых портов (-p/--publish) для контейнеров и Docker Desktop, и Docker Engine могут попытаться зарезервировать один и тот же порт на вашем компьютере, что может привести к конфликтам («порт уже используется»).

Как правило, мы рекомендуем останавливать Docker Engine во время использования Docker Desktop, чтобы Docker Engine не потреблял ресурсы и предотвращал конфликты, как приведено выше.

Используйте следующую команду, чтобы останавливает службу Docker Engine:

$ sudo systemctl stop docker docker.socket containerd

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

$ sudo systemctl disable docker docker.socket containerd

Как переключаться между Docker Desktop и Docker Engine

Docker CLI можно использовать для взаимодействия с несколькими Docker Engine. Например, вы можете использовать один и тот же интерфейс командной строки Docker для управления локальным Docker Engine и для управления удаленным экземпляром Docker Engine, работающим в облаке. Контексты Docker позволяет переключаться между экземплярами Docker Engines.

При установке Docker Desktop создаётся выделенный контекст «desktop-linux» для взаимодействия с Docker Desktop. При запуске Docker Desktop автоматически устанавливает свой собственный контекст (desktop-linux) в качестве текущего контекста. Это означает, что последующие команды Docker CLI нацелены на Docker Desktop. При завершении работы Docker Desktop сбрасывает текущий контекст на контекст default.

Используйте команду docker context ls, чтобы просмотреть, какие контексты доступны на вашем компьютере. Текущий контекст отмечен звездочкой (*);

$ docker context ls
NAME            DESCRIPTION                               DOCKER ENDPOINT                                  ...
default *       Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                      ...
desktop-linux                                             unix:///home/<user>/.docker/desktop/docker.sock  ...

Если на одном компьютере установлены и Docker Desktop, и Docker Engine, вы можете выполнить команду docker context use для переключения между контекстами Docker Desktop и Docker Engine. Например, используйте контекст «по умолчанию» для взаимодействия с Docker Engine;

$ docker context use default
default
Current context is now "default"

И используйте контекст desktop-linux для взаимодействия с Docker Desktop:

$ docker context use desktop-linux
desktop-linux
Current context is now "desktop-linux"

Обратитесь к Документация по контексту Docker для более подробной информации.

Почему Docker Desktop для Linux запускает виртуальную машину?

Docker Desktop для Linux запускает виртуальную машину (ВМ) по следующим причинам:

  1. Чтобы обеспечить единообразие работы Docker Desktop на разных платформах.

    Во время исследования наиболее часто упоминаемой причиной, по которой пользователи хотели использовать Docker Desktop для Linux (DD4L), было обеспечение согласованности работы с Docker Desktop с паритетом функций во всех основных операционных системах. Использование виртуальной машины гарантирует, что работа с Docker Desktop для пользователей Linux будет максимально близка к работе с Windows и macOS.

  2. Чтобы использовать новые функции ядра

    Иногда мы хотим использовать новые функции операционной системы. Поскольку мы контролируем ядро и ОС внутри виртуальной машины, мы можем немедленно развернуть их для всех пользователей, даже для пользователей, которые намеренно используют LTS-версию своей операционной системы.

  3. Для повышения безопасности

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

    Почему бы не запустить безрутовый Docker? Хотя это имеет преимущество в виде поверхностного ограничения доступа для пользователя root, поэтому все выглядит безопаснее в «сверху», это позволяет непривилегированным пользователям получить CAP_SYS_ADMIN в своём пользовательском пространстве имён и получить доступ к API-интерфейсам ядра, которые не ожидают использования непривилегированными пользователями, результы на сайте vulnerabilities.

  4. ** Чтобы обеспечить преимущества паритета функций и повышенной безопасности с минимальным влиянием на производительность **

    Виртуальная машина, используемая DD4L, использует добродетели, общую файловую систему, которая позволяет виртуальным машинам получать доступ к дереву каталогов, расположенному на хосте. Наш внутренний бенчмаркинг показывает, что при правильном распределении ресурсов для виртуальной машины производительность файловой системы, близкая к исходной, может быть достигнута с помощью virtiofs.

    Таким образом, мы скорректировали память по умолчанию, доступную для виртуальной машины в DD4L. Вы можете настроить данный параметр в соответствии со своими потребностями, используя ползунок Память на вкладке Настройки > Ресурсы в Docker Desktop.

Как включить общий доступ к файлам?

Docker Desktop для Linux использует virtiofs в качестве механизма по умолчанию (и в настоящее время единственного) для включения общего доступа к файлам между хостом и виртуальной машиной Docker Desktop. Чтобы не требовать повышенных привилегий, без ненужного ограничения операций с общими файлами, Docker Desktop запускает службу общего доступа к файлам (virtiofsd) внутри пользовательского пространства имён (см. user_namespaces(7)) с настроенным сопоставлением UID и GID. В результате Docker Desktop полагается на то, что хост настроен так, чтобы текущий пользователь мог использовать делегирование идентификатора подчиненного. Для этого должны присутствовать /etc/subuid (см. subuid(5)) и /etc/subgid (см. subgid(5)). Docker Desktop поддерживает только делегирование идентификатора подчиненного, настроенное с помощью файлов. Docker Desktop сопоставляет текущий идентификатор пользователя и GID с 0 в контейнерах. Он использует первую запись, соответствующую текущему пользователю в /etc/subuid и /etc/subgid, чтобы настроить сопоставления для идентификаторов выше 0 в контейнерах.

ID в контейнере

ID на хосте

0 (root)

ID пользователя, запускающего DD (например, 1000)

1

0 + начало диапазона идентификаторов, указанного в /etc/subuid//etc/subgid (например, 100000)

2

1 + начало диапазона идентификаторов, указанного в /etc/subuid//etc/subgid (например, 100001)

3

2 + начало диапазона идентификаторов, указанного в /etc/subuid//etc/subgid (например, 100002)

Если /etc/subuid и /etc/subgid отсутствуют, их необходимо создать. Оба должны содержать записи в виде — <username>:<start of id range>:<id range size>. Например, чтобы разрешить текущему пользователю использовать идентификаторы от 100000 до 165535:

$ grep "$USER" /etc/subuid >> /dev/null 2&>1 || (echo "$USER:100000:65536" | sudo tee -a /etc/subuid)
$ grep "$USER" /etc/subgid >> /dev/null 2&>1 || (echo "$USER:100000:65536" | sudo tee -a /etc/subgid)

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

$ echo $USER
exampleuser
$ cat /etc/subuid
exampleuser:100000:65536
$ cat /etc/subgid
exampleuser:100000:65536

В этом сценарии, если общий файл chowned внутри контейнера Docker Desktop, принадлежащего пользователю с UID 1000, он отображается на хосте как принадлежащий пользователю с UID 100999. Это имеет неприятный побочный эффект: предотвращая легкий доступ к такому файлу на хосте. Проблема решается созданием группы с новым GID и добавлением в нее нашего пользователя, либо установкой рекурсивного ACL (см. setfacl(1)) для папок, к которым открыт общий доступ с виртуальной машиной Docker Desktop.

Где Docker Desktop хранит контейнеры Linux?

Docker Desktop хранит контейнеры и образы Linux в одном большом файле «образа диска» в файловой системе Linux. Это отличается от Docker в Linux, который обычно хранит контейнеры и образы в каталоге /var/lib/docker в файловой системе хоста.

Где находится файл образа диска?

Чтобы найти файл образа диска, выбрать Настройки на панели инструментов Docker, а затем Дополнительно на вкладке Ресурсы.

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

Что делать, если файл слишком большой?

Если файл образа диска слишком велик, вы можете:

  • Перемещает его на больший диск

  • Удаляет ненужные контейнеры и образы

  • Уменьшает максимально допустимый размер файла

Как переместить файл на диск большего размера?

Чтобы переместить файл образа диска в другое место:

  1. Выбрать Настройки, затем Дополнительно на вкладке Ресурсы.

  2. В разделе Расположение образа диска нажмите Обзор и выбрать новое место для образа диска.

  3. Нажмите Применить и перезапустить, чтобы изменения вступили в силу.

Не перемещайте файл непосредственно в Finder, т. к. это может привести к тому, что Docker Desktop потеряет связь с файлом.

Как удаляет ненужные контейнеры и образы?

Проверяет, нет ли у вас ненужных контейнеров и образов. Если ваш API-интерфейс клиента и демона работает под управлением версии 1.25 или более поздней (используйте команду docker version на клиенте, чтобы проверяет версии API-интерфейса клиента и демона), вы можете просмотреть подробную информацию об использовании пространства, выполнив:

$ docker system df -v

В качестве альтернативы, чтобы получить список образов, выполните:

$ docker image ls

а затем, чтобы получает список контейнеров, выполните:

$ docker container ls -a

Если есть много лишних объектов, выполняет команду:

$ docker system prune

Эта команда удаляет все остановленные контейнеры, неиспользуемые сети, оборванные образы и кеш сборки.

Освобождение места на хосте может занять несколько минут в зависимости от формата файла образа диска:

  • Если файл называется Docker.raw: место на хосте должно быть освобождено в течение нескольких секунд.

  • Если файл называется Docker.qcow2: пространство будет освобождено фоновым процессом через несколько минут.

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

$ docker run --privileged --pid=host docker/desktop-reclaim-space

Обратите внимание, что многие инструменты сообщают максимальный размер файла, а не фактический размер файла. Чтобы запросить фактический размер файла на хосте с терминала, выполните:

$ cd ~/.docker/desktop/vms/0/data
$ ls -klsh Docker.raw
2333548 -rw-r--r--@ 1 username  staff    64G Dec 13 17:42 Docker.raw

В этом примере фактический размер диска составляет 2333548 КБ, тогда как максимальный размер диска составляет 64 ГБ.

Как уменьшить максимальный размер файла?

Чтобы уменьшить максимальный размер файла образа диска:

  1. На панели управления Docker выбрать Настройки, затем Дополнительно на вкладке Ресурсы.

  2. Раздел Размер образа диска содержит ползунок, позволяющий изменяет максимальный размер образа диска. Отрегулировать ползунок, чтобы установить нижний предел.

  3. Нажмите Применить и перезапустить.

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