Docker Compose - 如何存储数据库数据?
Docker Compose - How to store database data?
我是 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
存储数据库数据的容器并正确使用它们的最佳方法是什么?
我的意识不同意我选择的方法,即创建独立数据容器的方法。有什么想法吗?
docker-compose down
执行以下操作
Stops containers and removes containers, networks, volumes, and images
created by up
所以您遇到的行为是正常的。
使用 docker-compose stop
关闭使用 docker-compose 文件创建的容器,但不删除它们的卷。
其次,您不需要 docker compose 版本 2 中的 data-container
模式。所以删除它并使用
db:
...
volumes:
- /var/lib/postgresql/data
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
要存储数据库数据,请确保您的 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
我是 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
存储数据库数据的容器并正确使用它们的最佳方法是什么?我的意识不同意我选择的方法,即创建独立数据容器的方法。有什么想法吗?
docker-compose down
执行以下操作
Stops containers and removes containers, networks, volumes, and images created by up
所以您遇到的行为是正常的。
使用 docker-compose stop
关闭使用 docker-compose 文件创建的容器,但不删除它们的卷。
其次,您不需要 docker compose 版本 2 中的 data-container
模式。所以删除它并使用
db:
...
volumes:
- /var/lib/postgresql/data
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
要存储数据库数据,请确保您的 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