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