Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker Compose-如何存储数据库数据?_Docker_Docker Compose_Data Containers - Fatal编程技术网

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

Docker Compose-如何存储数据库数据?,docker,docker-compose,data-containers,Docker,Docker Compose,Data Containers,我是docker的新手,正在使用docker compose开发一个项目。从文档中我了解到,我应该使用仅数据容器来保持数据的持久性,但我无法使用docker compose。 每当我执行docker compose down时,它都会从数据库中删除数据,但通过执行docker compose stop则不会删除数据。这可能是因为我没有创建命名数据卷,docker compose down几乎没有删除所有容器。因此,我尝试命名容器,但它抛出了我的错误。 请查看我的yml文件: version: '

我是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
数据容器的Docker文件为:

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

# Create data directory
RUN mkdir /data

# Create /data volume
VOLUME /data
所以现在我要做的是创建一个独立的只包含数据的命名容器,并将其从数据库的值放入
volumes\u中。它工作正常,即使在执行了
docker compose down
之后也没有删除任何数据

我的查询:

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

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


码头工人写下

是否执行以下操作

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

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

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

其次,您不需要docker compose版本2中的
数据容器
模式。所以把它去掉,然后用它

  db:
    ...
    volumes:
       - /var/lib/postgresql/data
docker compose会停止容器,但也会删除它们(包括所有内容:网络等)

使用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: {}
在这里,它将创建一个名为“wpdb”的命名卷(如果不存在),并将其装入/var/lib/mysql(默认为读写模式)。这是数据库存储数据的地方(对于mysql映像)

如果命名卷已存在,则将在不创建它的情况下使用它

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

您可以在此处获得docker compose文件参考的更多信息:

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

然后使用这个命令

docker-compose up -d
docker-compose down
docker volume ls

DRIVER              VOLUME NAME
local               35c819179d883cf8a4355ae2ce391844fcaa534cb71dc9a3fd5c6a4ed862b0d4
local               133db2cc48919575fc35457d104cb126b1e7eb3792b8e69249c1cfd20826aac4
local               483d7b8fe09d9e96b483295c6e7e4a9d58443b2321e0862818159ba8cf0e1d39
local               725aa19ad0e864688788576c5f46e1f62dfc8cdf154f243d68fa186da04bc5ec
local               de265ce8fc271fc0ae49850650f9d3bf0492b6f58162698c26fce35694e6231c
local               phphelloworld_mysql-data
现在,您的数据将保持不变,即使在使用此命令后也不会被删除

docker-compose up -d
docker-compose down
docker volume ls

DRIVER              VOLUME NAME
local               35c819179d883cf8a4355ae2ce391844fcaa534cb71dc9a3fd5c6a4ed862b0d4
local               133db2cc48919575fc35457d104cb126b1e7eb3792b8e69249c1cfd20826aac4
local               483d7b8fe09d9e96b483295c6e7e4a9d58443b2321e0862818159ba8cf0e1d39
local               725aa19ad0e864688788576c5f46e1f62dfc8cdf154f243d68fa186da04bc5ec
local               de265ce8fc271fc0ae49850650f9d3bf0492b6f58162698c26fce35694e6231c
local               phphelloworld_mysql-data
额外:-但如果要删除所有数据,则将使用

docker-compose down -v
使用此命令验证或检查数据库数据列表

docker-compose up -d
docker-compose down
docker volume ls

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

您不想为数据使用命名卷,例如
卷:-/data/mydata:/var/lib/postgresql/data/pgdata
,这是优于数据容器卷的首选方法。我尝试过这样做,但它引发了错误:
错误:命名卷“dataVolume:/data:rw”用于服务“data\u container”但是在卷部分没有找到声明。
我也对使用这种方法的数据可移植性感到好奇。如何使用这种方法备份数据或使其可移植?它已经在卷中的docker主机上。您需要使用能够转储数据的工具访问该卷。e、 g.
docker compose exec POSTGRES_CONTAINER pg|bzip2>path/on/host/mydb dump-`date+%Y%m%d%H%m%S`.sql.bz2
这帮了大忙。尝试备份数据时出错:
pg_dump:[archiver(db)]与数据库“root”的连接失败:致命:角色“root”不存在
您能帮我吗?@SalmanGhauri可能会偏离主题-如果您仍然存在问题,请尝试发布新问题此问题已通过使用命名卷解决。如果使用命名卷,docker compose down将不会销毁数据。