Docker撰写 – 如何存储数据库数据?

我是新来的docker和开发项目使用docker撰写。 从文档中我了解到,我应该使用数据只容器来保持数据持久性,但我无法使用docker-compose来做到这一点。 每当我做docker-compose down它从数据库中删除数据,但通过做docker-compose stop数据不会被删除。 可能是因为我没有创build命名的数据卷,而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 <tom@offermann.us> # 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. 

所以现在我正在做的是我创build了一个独立的数据只有命名容器,并把它放在db的volumes_from值。 它工作得很好,甚至在做了docker-compose down之后也没有删除任何数据。

我的查询:

  • 使容器能够使用docker-compose存储数据库数据并使用它们的容器的最佳方法是什么?

  • 我的意识不同意我采用的方法,即通过创build一个独立的数据容器。 有什么想法吗?

docker-compose down

做以下事情

停止容器并移除由up创build的容器,networking,卷和图像

所以你正在经历的行为是预期的。

使用docker-compose stopclosures使用docker-compose文件创build的容器,但不移除它们的卷。

其次,你不需要Docker组合版本2中的data-container模式。 所以删除,只是使用

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

docker – 组成下来停止容器,但也删除它们(与一切:networking,…)。

改用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: {} 

在这里,它将创build一个名为“wp-db”的命名卷(如果它不存在)并将其挂载到/ var / lib / mysql(以读写模式默认)。 这是数据库存储数据的地方(对于mysql映像)。

如果指定的卷已经存在,它将被使用而不创build它。

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

您可以在这里使用docker-compose文件引用获取更多信息: https : //docs.docker.com/compose/compose-file/#/volumes-volume-driver