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

时间:2016-08-05 16:23:17

标签: docker docker-compose data-containers

我是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 <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.

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

我的查询:

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

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

3 个答案:

答案 0 :(得分:19)

docker-compose down

执行以下操作

  

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

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

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

其次,您不需要docker compose版本2中的data-container模式。所以删除它,然后使用

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

答案 1 :(得分:7)

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

改为使用 docker-compose stop

我认为制作能够使用docker-compose存储数据库数据的容器的最佳方法是使用命名卷:

startEdit

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

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

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

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

答案 2 :(得分:0)

要存储数据库数据,请确保您的docker-compose.yml看起来像 如果要使用Dockerfile

version: '3.1'

services:
  php:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 80:80
    volumes:
      - ./src:/var/www/html/
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - mysql-data:/var/lib/mysql

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080
volumes:
  mysql-data:

您的docker-compose.yml看起来像 如果要使用映像而不是Dockerfile

version: '3.1'   

services:
  php:
    image: php:7.4-apache
    ports:
      - 80:80
    volumes:
      - ./src:/var/www/html/
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - mysql-data:/var/lib/mysql

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080
volumes:

如果要存储或保存mysql的数据,则 必须记住在docker-compose.yml中添加两行

volumes:
  - mysql-data:/var/lib/mysql

volumes:
  mysql-data:

之后使用此命令

docker-compose up -d

现在,您的数据将保持不变,即使使用此命令也不会被删除

docker-compose down

额外:-但如果要删除所有数据,则将使用

docker-compose down -v

使用此命令验证或检查数据库数据列表

docker volume ls

DRIVER              VOLUME NAME
local               35c819179d883cf8a4355ae2ce391844fcaa534cb71dc9a3fd5c6a4ed862b0d4
local               133db2cc48919575fc35457d104cb126b1e7eb3792b8e69249c1cfd20826aac4
local               483d7b8fe09d9e96b483295c6e7e4a9d58443b2321e0862818159ba8cf0e1d39
local               725aa19ad0e864688788576c5f46e1f62dfc8cdf154f243d68fa186da04bc5ec
local               de265ce8fc271fc0ae49850650f9d3bf0492b6f58162698c26fce35694e6231c
local               phphelloworld_mysql-data