Docker Compose - 如何存储数据库数据?

Sal*_*uri 19 data-containers docker 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
Run Code Online (Sandbox Code Playgroud)

data_container的Docker文件是:

FROM stackbrew/busybox:latest
MAINTAINER Tom Offermann <tom@offermann.us>

# Create data directory
RUN mkdir /data

# Create /data volume
VOLUME /data
Run Code Online (Sandbox Code Playgroud)

我试过这个但是通过做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.
Run Code Online (Sandbox Code Playgroud)

所以我现在正在做的是创建一个仅限于数据的独立数据容器并将其放在volumes_from数据库的值中.它工作正常,即使在完成后也没有删除任何数据docker-compose down.

我的疑问:

  • 制作docker-compose能够使用并正确使用数据库的数据的容器的最佳方法是什么?

  • 我有意识地不同意我选择的方法,即通过创建一个独立的数据容器.有什么想法吗?

luk*_*aus 20

docker-compose down

做以下事情

停止容器并删除由up创建的容器,网络,卷和图像

因此,您正在经历的行为是预期的.

docker-compose stop用于关闭使用docker-compose文件创建但不删除其卷的容器.

其次,你不需要data-containerdocker compose版本2中的模式.所以删除它,然后使用

  db:
    ...
    volumes:
       - /var/lib/postgresql/data
Run Code Online (Sandbox Code Playgroud)

  • 它已经在一个卷中的docker主机上.您需要使用可以转储数据的工具来访问该卷.例如```docker-compose exec POSTGRES_CONTAINER pg_dump | bzip2> path/on/host/mydb-dump -`date"+%Y%m%d%H%M%S"`.sql.bz2``` (2认同)

tou*_*ssa 9

docker-compose down停止容器但也删除它们(包括所有内容:networks,...).

请改用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: {}
Run Code Online (Sandbox Code Playgroud)

在这里,它将创建一个名为"wp-db"的命名卷(如果它不存在)并将其挂载在/ var/lib/mysql中(在读写模式下,默认值).这是数据库存储其数据的位置(对于mysql映像).

如果指定的卷已存在,则将在不创建它的情况下使用它.

启动时,mysql图像会查看/ var/lib/mysql(您的卷)中是否有数据库以便使用它们.

您可以在此处获取有关docker-compose文件参考的更多信息:https: //docs.docker.com/compose/compose-file/#/volumes-volume-driver