докер без запущенного тома, где хранится системный файл контейнера?

#docker #volume

#докер #объем

Вопрос:

Если я запускаю контейнер без указанного тома, где хранится системный файл контейнера?

  • docker run -it c_name i_name:tag

когда я запускаю контейнер без тома, создается только папка контейнера /var/lib/docker/container , но если я создаю большой файл в файловой системе контейнера, где он хранится на хосте? Потому что я хочу знать, не вызовет ли это проблему с размером занимаемого диска.

Комментарии:

1. Docker по умолчанию хранит содержимое в подкаталогах /var/lib/docker . На компьютере Mac или Windows эта файловая система находится внутри виртуальной машины Linux.

2. dock info а потом искать Docker Root Dir . Или docker inspect CONTAINER_NAME

3. @larsks когда я запускаю контейнер без тома, создается только папка контейнера /var/lib/docker/container , но если я создаю большой файл в файловой системе контейнера, где он хранится на хосте? Потому что я хочу знать, не вызовет ли это проблему с занятием диска.

Ответ №1:

Хранилище контейнера состоит из разных слоев, разные слои в конечном итоге образуют объединенный слой.

Давайте проведем небольшой эксперимент дальше:

1. Запустите контейнер и настройте новый файл:

 # docker run -idt --name trial debian /bin/bash
# docker exec -it trial /bin/bash
root@e6c2b6336753:/# echo "helloworld" > test.txt
root@e6c2b6336753:/# cat test.txt
helloworld
 

2. Найдите идентификатор объединенного уровня хранилища:

 # docker inspect --format=" {{ .GraphDriver.Data.MergedDir }} " trial
/var/lib/docker/overlay2/8f2e14d33448cb83e581b2950a69faa827a012904051c845abf550273196f90f/merged
 

Здесь 8f2e14d33448cb83e581b2950a69faa827a012904051c845abf550273196f90f указан идентификатор слоя.

3. Проверьте слой:

 # cd /var/lib/docker/overlay2/8f2e14d33448cb83e581b2950a69faa827a012904051c845abf550273196f90f/merged
root@shlava:/var/lib/docker/overlay2/8f2e14d33448cb83e581b2950a69faa827a012904051c845abf550273196f90f/merged# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test.txt  tmp  usr  var
root@shlava:/var/lib/docker/overlay2/8f2e14d33448cb83e581b2950a69faa827a012904051c845abf550273196f90f/merged# cat test.txt
helloworld
 

Итак, в качестве вывода, как вы могли видеть выше, содержимое файловой системы можно найти в /var/lib/docker/overlay2/ с идентификатором слоя в качестве папки, вы можете проверить диск там.

Комментарии:

1. У меня новый вопрос: как элегантно очистить этот merged слой?

2. В docker более сложное поведение для overlay fs, поэтому, если вы уже нашли большой файл с помощью вышеуказанного метода, просто exec войдите в контейнер, чтобы удалить этот большой файл. Рекомендуется не удалять файловую систему напрямую /var/lib/docker/overlay2/ . Если вы этого не хотите, я не знаю ни одного элегантного способа сбросить изменения в контейнере, вы можете задать новый вопрос ребятам на удачу.

3. Я обнаружил merged , что каталог неправильно монтируется при использовании docker-compose (с другим сервисом), я не могу его найти test.txt .