Контейнеры
Контейнеры предназначены для изолированного экземпляра программы / службы. Они изолированы как от хозяина, так и от последующих появлений одного и того же изображения. Они начинаются на изолированном острове, на котором ничего нет (что он не принес сам). Любые данные, которые они генерируют, теряются при их смерти. Кроме того, они совершенно не обращают внимания на любые данные на хосте (на данный момент). Но иногда мы хотим, чтобы их данные были постоянными или «вводили» наши собственные данные при каждом запуске. Например, ваш случай с PostgreSQL
. Мы хотим, чтобы PostgreSQL
имела нашу схему доступной при каждом запуске. И было бы замечательно, если бы в нем были сохранены какие-либо сделанные нами изменения или загруженные данные.
Docker Тома
Введите docker тома . Это хороший способ управления постоянным хранилищем для контейнеров. Они предназначены для установки в контейнеры и позволяют им записывать свои данные (или читать из предыдущих экземпляров), которые не будут удалены, если будет удален экземпляр контейнера. Как только вы создадите том с помощью docker volume create myvolume1
, он создаст каталог в /var/lib/docker/volumes/
(на windows это будет другой вариант по умолчанию. Может быть изменен). Вам никогда не нужно знать о физическом каталоге на вашем хосте. Вам нужно знать только имя тома myvolume1
(или любое другое имя, которое вы выберете).
Контейнеры с постоянными данными (docker тома)
Как мы уже говорили, контейнеры по умолчанию полностью изолированы от хоста. В частности, его файловая система тоже. Это означает, что при запуске контейнера он не знает, что находится в файловой системе хоста. И когда экземпляр контейнера удаляется, данные, которые он генерировал в течение своей жизни, исчезают вместе с ним.
Но, если мы используем docker volumes
, все будет иначе. После запуска контейнера мы можем монтировать внутри него данные извне. Эти данные могут быть либо docker volume
, о котором мы говорили ранее, либо указанным c путем, который мы хотим (например, / home / me / что-то, что мы сами управляем). Последний не docker volume
, но работает точно так же.
Учебное пособие, которое вы связали, говорит о монтировании как пути, так и docker volume
( в отдельных примерах). Это делается с флагом -v
при выполнении docker run
. Поскольку при использовании docker
на windows существует проблема с разрешениями для каталога данных PostgreSQL
на хосте (который монтируется в контейнере), они рекомендуют использовать docker volumes
.
Это означает, что вы необходимо создать схему и загрузить все необходимые данные после того, как вы использовали docker volume
с вашим экземпляром PostgreSQL
. Последующие перезапуски контейнера должны использовать те же docker volume
.
docker volume create --name postgres-volume
docker run -p 5432:5432 --name postgres_db -e POSTGRES_PASSWORD=password -v postgres-volume:/var/lib/postgresql/data -d postgres
Из учебника
Это две важные строки. Первый создает создает docker volume
, а второй запускает экземпляр fre sh PostgreSQL
. Любые изменения, внесенные вами в данные этого экземпляра (DML DDL), будут сохранены в docker volume
postgres -объеме . Если вы ранее развернули контейнер (например, PostgreSQL
), который использует этот том, он найдет данные так же, как они были оставлены в прошлый раз. Другими словами, что делает вторую строку экземпляром fre sh, так это то, что docker volume
пуст (он был только что создан). Последующие экземпляры PostgreSQL
найдут схему + данные, которые вы загрузили ранее.