Страницы

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

вторник, 13 ноября 2018 г.

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

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


Ответ

В приведённой вами инструкции видно, что контейнер запускается с опцией
--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.

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

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