Хотите узнать, где находятся образы, контейнеры и тома Docker?
В типичной среде Linux образы Docker и данные контейнеров можно найти в:
/var/lib/docker/
Если на вашем сервере не хватает места, вам обязательно следует заглянуть в этот каталог.
В основном, все связанные с Docker сущности находятся в /var/lib/docker.
Но давайте рассмотрим его более конкретно, на примере образа и контейнера Alpine.
Примечание: Пожалуйста, обратите внимание, что эта информация предназначена только для образовательных целей. Манипуляции с каталогами/файлами Docker хост-системы никогда не рекомендуются. Команды docker и docker-compose всегда должны быть предпочтительным методом. Доступ к физически расположенным каталогам/файлам Docker должен осуществляться только в крайнем случае в чрезвычайных ситуациях.
Расположение образов Docker
Всякий раз, когда вы используете команду docker pull или запускаете docker-compose up -d для подготовки запуска приложений, именно здесь хранятся образы на сервере Ubuntu:
/var/lib/docker/overlay2
Здесь Overlay2 является драйвером хранилища Docker по умолчанию в Ubuntu.
Вы можете подтвердить это, выполнив команду docker info и поискав Storage Driver:
...
Storage Driver: overlay2
...
Если оно отличается от вашего, значит, вы используете другой драйвер хранения для Docker.
Аналогично, расположение каталога будет названо в соответствии с тем же драйвером хранения.
Доступность драйвера хранилища зависит от поддержки ядра.
Определенные местоположения образов
Если вы ищете местоположение конкретных образов, вы можете использовать команду inspect в Docker для извлеченного образа.
Скажем, например, я извлек образ alpine с помощью команды docker pull alpine.
Выполните следующую команду для его проверки:
$ docker inspect alpine
После выполнения команды вы заметите три поля в подразделе Data в разделе GraphDriver:
...
"GraphDriver": {
"Data": {
"MergedDir": "/var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e/merged",
"UpperDir": "/var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e/diff",
"WorkDir": "/var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e/work"
},
...
Вышеуказанные каталоги – это физическое расположение данных вашего контейнера внутри хост-системы.
Помните большую директорию с хэш-именем: 64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a525ab9e365e из раздела Docker Images?
Каталог под ним называется diff, как вы можете видеть в разделе LowerDir после :, который теперь является точкой монтирования контейнера – полученной из базового образа UpperDir!
Эти каталоги будут оставаться доступными даже после остановки контейнера.
Итак, полный путь, который является общим между образом (MergedDir, UpperDir и WorkDir) и контейнером (точка монтирования LowerDir), следующий:
/var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e/
После присвоения контейнеру до уровня LowerDir цель образа является смежной, поэтому четыре поля выделяются и основываются на другом каталоге (с новым хэшем) из-за динамической природы последнего, который становится:
/var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3/
Примечание: Процесс монтирования каталога из base-image в контейнер очень похож на то, как вы монтируете тома в Docker!
Расположение томов Docker
В отличие от образов и контейнеров Docker, физическое расположение томов довольно простое.
Тома располагаются по адресу:
/var/lib/docker/volumes/
Конкретные места расположения томов
В этом случае существует два типа томов.
Первый – обычные тома Docker, а второй – bind mounts.
Тома Docker
Если вы ищете местоположение определенных томов, вы можете сначала использовать команду docker volume ls и проверить имя или ID тома.
Например, я запустил контейнер alpine с помощью следующей команды с томом:
$ docker run -ti -d --name alpine-container -v test-data:/var/lib/app/content alpine
Теперь автоматически будет создан том с именем test-data.
Теперь давайте создадим файл test.md в этом месте:
~$ docker exec alpine-container sh -c "touch /var/lib/app/content/test.md"
Убедитесь, что файл действительно был создан:
$ docker exec -ti alpine-container sh
/ # ls /var/lib/app/content/
test.md
/ # exit
Когда вы запустите docker volume ls, в списке появится том с именем test-data:
$ docker volume ls
DRIVER VOLUME NAME
local d502589845f7ae7775474bc01d8295d9492a6c26db2ee2c941c27f3cac4449d1
local e71ee3960cfef0a133d323d146a1382f3e25856480a727c037b5c81b5022cb1b
local test-data
Наконец, вы можете подтвердить фактическое расположение файла на вашей хост-системе:
$ sudo ls -l /var/lib/docker/volumes/test-data/_data
total 0
-rw-r--r-- 1 root root 0 Oct 6 23:20 test.md
Поэтому путь для смонтированного тома всегда находится в каталоге с именем _data внутри соответствующего каталога тома.
Вы также можете проверить такие пути используя команду docker volume inspect с последующим указанием имени или ID тома и просмотрев параметр Mountpoint в выводе:
$ docker volume inspect test-data
[
{
"CreatedAt": "2021-10-06T23:20:20+05:30",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/test-data/_data",
"Name": "test-data",
"Options": null,
"Scope": "local"
}
]
Монтирование на хосте
Расположение привязанных монтирований довольно очевидно и даже более просто, поскольку вы монтируете том непосредственно из расположения на стороне хоста:
$ mkdir /home/avimanyu/test-data
$ docker run -ti -d --name alpine-container -v /home/avimanyu/test-data:/var/lib/app/content alpine
В этом случае смонтированный том с именем test-data станет доступен на стороне контейнера как /var/lib/app/content.
Заключение
В этом кратком руководстве я использовал общий подход на базе Linux, чтобы показать физическое расположение образов Docker, контейнеров и томов, расположенных на вашем Linux-сервере (в данном случае Ubuntu 20.04) на уровне хоста.