【问题标题】:Docker Compose - How to store database data?Docker Compose - 如何存储数据库数据?
【发布时间】:2016-08-05 16:23:16
【问题描述】:

我是 docker 新手,正在使用 docker compose 开发项目。从文档中我了解到我应该使用仅数据容器来保持数据的持久性,但我无法使用 docker-compose 这样做。 每当我执行docker-compose down 时,它都会从数据库中删除数据,但通过执行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 存储数据库数据并正确使用它们的容器的最佳方法是什么?

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

【问题讨论】:

  • 您是否有不想为数据使用命名卷的原因,例如 volumes: - /data/mydata:/var/lib/postgresql/data/pgdata,这是优于数据容器卷的首选方法。
  • 我尝试过这样做,但它抛出了错误:ERROR: Named volume "dataVolume:/data:rw" is used in service "data_container" but no declaration was found in the volumes section. 我也对使用这种方法的数据可移植性感到好奇。

标签: docker docker-compose data-containers


【解决方案1】:

docker-compose down

执行以下操作

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

所以您遇到的行为是预期的。

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

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

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

【讨论】:

  • 如何使用这种方法备份数据或使其可移植?
  • 它已经在一个卷中的 docker 主机上。您需要使用可以转储数据的工具访问该卷。例如docker-compose exec POSTGRES_CONTAINER pg_dump | bzip2 &gt; path/on/host/mydb-dump-`date "+%Y%m%d%H%M%S"`.sql.bz2
  • 这很有帮助。我尝试备份数据时出现错误:pg_dump: [archiver (db)] connection to database "root" failed: FATAL: role "root" does not exist 你能帮我解决这个问题吗?
  • @SalmanGhauri 可能会偏离主题 - 如果您仍有问题,请尝试发布新问题
  • 此问题已通过使用命名卷得到解决。如果你使用命名卷,docker-compose down 不会破坏数据。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    要存储数据库数据,请确保您的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 2018-04-06
      相关资源
      最近更新 更多