web-dev-qa-db-ja.com

Docker Compose-データベースデータの保存方法

私はdockerを初めて使用し、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

Data_containerのDockerファイルは次のとおりです。

FROM stackbrew/busybox:latest
MAINTAINER Tom Offermann <[email protected]>

# Create data directory
RUN mkdir /data

# Create /data volume
VOLUME /data

これを試しましたが、docker-compose downを実行すると、データが失われます。コメント行が見えるようにdata_containerに名前を付けてみましたが、このエラーがスローされました:

ERROR: Named volume "dataVolume:/data:rw" is used in service "data_container" but no declaration was found in the volumes section.

だから今私がやっていることは、コンテナという名前のスタンドアロンデータを作成し、それをdbのvolumes_from値に入れることです。正常に動作し、docker-compose downを実行した後でもデータを削除しませんでした。

私のクエリ:

  • docker-composeを使用してデータベースのデータを保存できるコンテナを作成し、それらを適切に使用するための最良の方法は何ですか?

  • 私の意識は、スタンドアロンのデータコンテナを作成することで選択したアプローチについては同意していません。何かご意見は?

19
Salman Ghauri

docker-compose down

次のことを行います

コンテナを停止し、upによって作成されたコンテナ、ネットワーク、ボリューム、およびイメージを削除します

したがって、あなたが経験している振る舞いが期待されます。

docker-compose stopを使用して、docker-composeファイルで作成されたコンテナをシャットダウンしますが、ボリュームは削除しません。

第二に、docker composeのバージョン2ではdata-containerパターンは必要ありません。それを削除して使用するだけです

  db:
    ...
    volumes:
       - /var/lib/postgresql/data
20
lukeaus

docker-compose downはコンテナを停止しますが、コンテナも削除します(すべて:ネットワークなど)。

代わりにdocker-compose stopを使用してください。

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

8
toussa