Docker Compose - Как хранить данные базы данных?
Я новичок в докеров и разрабатываю проект с использованием докеров. Из документации я узнал, что для хранения данных я должен использовать только контейнеры данных, но я не могу это сделать, используя docker-compose.
Всякий раз, когда я делаю docker-compose down
, он удаляет данные из db, но, выполняя docker-compose stop
, данные не удаляются. Может быть, это потому, что я не создаю именованный объем данных, а docker-compose down
вряд ли удаляет все контейнеры. Поэтому я попробовал назвать контейнер, но он бросил мне ошибки.
Пожалуйста, посмотрите мой файл yml
:
version: '2'
services:
data_container:
build: ./data
#volumes:
# - dataVolume:/data
db:
build: ./db
ports:
- "5445:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_DB=postgres
# - PGDATA=/var/lib/postgresql/data/pgdata
volumes_from:
# - container:db_bus
- data_container
geoserver:
build: ./geoserver
depends_on:
- db
ports:
- "8004:8080"
volumes:
- ./geoserver/data:/opt/geoserverdata_dir
web:
build: ./web
volumes:
- ./web:/code
ports:
- "8000:8000"
depends_on:
- db
command: python manage.py runserver 0.0.0.0:8000
nginx:
build: ./nginx
ports:
- "83:80"
depends_on:
- web
Файл Docker для data_container:
FROM stackbrew/busybox:latest
MAINTAINER Tom Offermann <[email protected]>
# Create data directory
RUN mkdir /data
# Create /data volume
VOLUME /data
Я пробовал это, но, выполняя компоновку докеров, данные теряются. Я попробовал присвоить имя data_container, поскольку вы можете видеть прокомментированную строку, это заставило мне эту ошибку:
ERROR: Named volume "dataVolume:/data:rw" is used in service "data_container" but no declaration was found in the volumes section.
Итак, теперь я делаю самостоятельные данные только с именем container и помещаю это в значение volumes_from
для db. Он работал нормально и не удалял никаких данных даже после выполнения docker-compose down
.
Мои запросы:
-
Каков наилучший подход к созданию контейнеров, которые могут хранить данные базы данных с помощью docker-compose
и использовать их правильно?
-
Мое сознание не соглашается со мной в отношении подхода, который я выбрал, который создал отдельный контейнер данных. Любые мысли?
Ответы
Ответ 1
docker-compose down
делает следующее
Остановка контейнеров и удаление контейнеров, сетей, томов и изображений создано вверх
Итак, ожидаемое поведение, которое вы испытываете.
Использовать docker-compose stop
для выключения контейнеров, созданных с помощью файла docker-compose, но не удалять их тома.
Во-вторых, вам не нужен шаблон data-container
в версии 2 для докеры. Поэтому удалите это и просто используйте
db:
...
volumes:
- /var/lib/postgresql/data
Ответ 2
docker-compose down останавливает контейнеры, но также удаляет их (со всем: сети,...).
Вместо этого используйте стоп-стоп.
Я думаю, что лучший способ сделать контейнеры, которые могут хранить данные базы данных с помощью docker-compose, - использовать именованные тома:
version: '2'
services:
db: #https://hub.docker.com/_/mysql/
image: mysql
volumes:
- "wp-db:/var/lib/mysql:rw"
env_file:
- "./conf/db/mysql.env"
volumes:
wp-db: {}
Здесь он создаст именованный том "wp-db" (если он не существует) и смонтирует его в /var/lib/mysql (в режиме чтения-записи по умолчанию). Здесь база данных хранит свои данные (для образа mysql).
Если именованный том уже существует, он будет использоваться без его создания.
При запуске изображение mysql выглядит, если в нем есть базы данных в /var/lib/mysql (ваш том).
У вас может быть больше информации с ссылкой на файл docker-compose здесь:
https://docs.docker.com/compose/compose-file/#/volumes-volume-driver