Страницы

Поиск по вопросам

суббота, 7 декабря 2019 г.

Где docker хранит контейнеры?

#ubuntu #docker


У меня redmine установлен на сервере в двух контейнерах:


postgresql-redmine
redmine


Хочу перенести их, запустить в другом месте, и сделать резервную копию. В документации
ясно написано, что контейнеры создаются в том числе для переноса, однако инструкций
как это делается я не нашёл. Нашёл, что docker хранит свои файлы в директории /var/lib/docker
однако там у меня много тысяч файлов на 4 GB, а мои контейнеры - намного меньше, не
хотелось бы таскать всё что есть в этой директории
    


Ответы

Ответ 1



В приведённой вами инструкции видно, что контейнер запускается с опцией --volume=/srv/docker/redmine/postgresql:/var/lib/postgresql ,где <путь до директории с данными на хосте>:<путь до директории с данными в контейнере> В момент монтирования происходит затирание данных в контейнере, если те присутствовали по этому пути. Если опция --volume не была указана, то docker автоматически создаёт volumes исходя из параметров указанных в конфигурационном файле Dockerfile. Если обратиться к исходникам образа для PostgreSQL, то можно заметить, что это два volumes: /var/lib/postgresql и /run/postgresql. По первому пути расположены данные postgres. Собственно, они нас и интересуют. Узнать всю информацию про volumes отдельно взятого контейнера можно командой docker inspect --format '{{ .Volumes }}' <имя контейнера> Данные возвращаются в json-формате, а потому предусмотрена возможность фильтрации/поиска через опцию --format Все volumes для которых не указан путь расположения на хосте (левая часть /host/path/to/data:/container/to/data) хранятся в директории /var/lib/docker/volumes/<хэш volume>/_data/. Таким образом, можно просто исследовав все директории в /var/lib/docker/volumes/ и найти необходимый. Если левая часть указана, а правая совпадает с volumes, которые указаны в Dockerfile (volumes by default), то происходит переопределение директории на хосте. Зачем нам два волиума с одинковыми данными на хосте (/var/lib/docker/volumes/<хэш volume>/_data/ и /host/path/to/data), правда? Как уже было отмечено @dmitrz, пока не существует возможности управлять volumes уже на поднятых контейнерах, также как и линковать. Первая проблема должна уже очень скоро решиться. Команда commit Volume является отдельной сущностью и потому не попадает в commit. Вот что говорит официальная документация. The commit operation will not include any data contained in volumes mounted inside the container. И ещё. Вообще смущает наличие двух методов создания образов: файлами конфигурации и коммитами. Файл конфигурации задаёт изначальную конфигурацию контейнера в момент запуска, а коммит сохраняет состояние на момент коммита. Если, к примеру, волиумы не задавать (не в конфиге и не при запуске), то состояние контейнера будет меняться (писаться данные будут именно в него). Возможно, у вас может возникнуть ситуация, когда нужно подправить конфиг postgres или ещё что-то сделать внутри контейнера, то с помощью команды docker exec -it postgresql bash вы можете зайти внутрь. Далее, все сделанные изменения вы можете закоммитить в образ, чтобы запуская контейнер где-нибудь ещё из этого образа не повторять все эти действия. Но такой подход сомнительный. Лучше сделать правки в основном конфиге Dockerfile. Ошибка в версии Ruby В docker существует такое понятие, как entrypoint. Обычно это shell-скрипт, который дёргается при запуске docker run или docker start. Если посмотреть листинг entrypoint.sh для redmine, то можно заметить установку плагинов (bundles) для redmine. Далее, если файла ${REDMINE_DATA_DIR}/tmp/plugins.sha1 не существует, то происходит установка плагинов. Обратите внимание на переменную ${REDMINE_DATA_DIR} и посмотрите в Dockerfile для redmine, т.е. REDMINE_DATA_DIR входит в волиум. Вспоминаем, что при коммите данные волиума не заносятся в образ. Когда закоммиченый контейнер запускается на новой машине видимо возникает конфликт старой версии redmine и устанавливаемых вновь плагинов. Если данные redmine критичны (/srv/docker/redmine/redmine:/home/redmine/data), то их обязательно нужно перенести на новую машину. Далее, поднять либо закоммиченый образ, либо загрузить контейнер с уже новой версией redmine по той инструкции. Можете ознакомится со всеми доступными версиями redmine образов от sameersbn. Что касается PostgreSQL контейнера, то его данные (/srv/docker/redmine/postgresql:/var/lib/postgresql) обязательно необходимо перенести. Список доступных версий postgres образов от sameersbn. Загрузка образов Загрузка образов из registry (https://hub.docker.com/, https://quay.io/, можно даже поднять локальный) осуществляется с помощь команды docker pull <имя образа>:<тег образа> , где тег - это, как правило, версия софта, который находится в этом образе. Запуск контейнера происходит командой docker run --name <имя контейнера> -d <имя образа>:<тег образа> Если образа с таким именем и тегом на локальной машине нет, то прозрачно срабатывает команда docker pull, т.е. образ ищется на удалённых registry.

Ответ 2



Разделы (volumes) в докере существуют отдельно от контейнеров и в данный момент нету у него управления разделами (management volumes). Так же нет средств миграции разделов между другими машинами, разделы существуют локально, в отличии от контейнеров из которых можно сделать образ и переместить его. Для решение это задачи необходимо найти папку которая монтируется как раздел в контейнер docker inspect <ИМЯ_КОНТЕЙНЕРА> # И найти секцию Volumes зайти в эту папку и скопировать вручную эти файлы на другую машину, например в папку /data/ Затем на другой машине запустить из образа контейнер и примонтировать пересенные данные: docker run -d -v /data/:<РАЗДЕЛ_КОНТЕЙНЕРА> <ОБРАЗ>

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

Отправить комментарий