持久化容器数据
解释
当容器启动时,它使用镜像提供的文件和配置。每个容器都能够创建、修改和删除文件,并且不会影响任何其他容器。删除容器时,这些文件更改也会被删除。
虽然容器的这种短暂性很好,但当您想要持久保存数据时,它会带来挑战。例如,如果重新启动数据库容器,则可能不希望从空数据库开始。那么,如何持久化文件呢?
容器卷
卷是一种存储机制,它能够在单个容器的生命周期之外保留数据。可以将其视为提供从容器内部到容器外部的快捷方式或符号链接。
例如,假设您创建了一个名为 .log-data
$ docker volume create log-data
使用以下命令启动容器时,卷将在以下位置挂载(或附加)到容器中:/logs
$ docker run -d -p 80:80 -v log-data:/logs docker/welcome-to-docker
如果卷不存在,Docker 将自动为您创建该卷。log-data
当容器运行时,它写入该文件夹的所有文件都将保存在容器外部的此卷中。如果您删除容器并使用相同的卷启动新容器,则文件仍将存在。/logs
使用卷共享文件
您可以将同一卷附加到多个容器,以便在容器之间共享文件。这在日志聚合、数据管道或其他事件驱动型应用程序等场景中可能会有所帮助。
管理卷
卷的生命周期比容器的生命周期不同,并且可能会变得相当大,具体取决于您使用的数据和应用程序的类型。以下命令将有助于管理卷:
docker volume ls
- 列出所有卷docker volume rm <volume-name-or-id>
- 删除卷(仅当卷未附加到任何容器时有效)docker volume prune
- 删除所有未使用(未附加)的卷
试用
在本指南中,您将练习创建和使用卷来保存由 Postgres 容器创建的数据。当数据库运行时,它会将文件存储到目录中。通过在此处附加卷,您将能够在保留数据的同时多次重新启动容器。/var/lib/postgresql/data
使用卷
下载并安装Docker 桌面。
通过以下命令使用 Postgres 镜像启动容器:
$ docker run --name=db -e POSTGRES_PASSWORD=secret -d -v postgres_data:/var/lib/postgresql/data postgres
这将在后台启动数据库,使用密码对其进行配置,并将卷附加到 PostgreSQL 将保留数据库文件的目录。
使用以下命令连接到数据库:
$ docker exec -ti db psql -U postgres
在 PostgreSQL 命令行中,运行以下命令以创建数据库表并插入两条记录:
CREATE TABLE tasks ( id SERIAL PRIMARY KEY, description VARCHAR(100) ); INSERT INTO tasks (description) VALUES ('Finish work'), ('Have fun');
通过在 PostgreSQL 命令行中运行以下命令来验证数据是否在数据库中:
SELECT * FROM tasks;
您应该获得如下所示的输出:
id | description ----+------------- 1 | Finish work 2 | Have fun (2 rows)
通过运行以下命令退出 PostgreSQL shell:
\q
停止并删除数据库容器。请记住,即使容器已被删除,数据也会保留在卷中。
postgres_data
$ docker stop db $ docker rm db
通过运行以下命令来启动新容器,将同一卷与持久化数据附加在一起:
$ docker run --name=new-db -d -v postgres_data:/var/lib/postgresql/data postgres
您可能已经注意到,环境变量已被省略。这是因为该变量仅在引导新数据库时使用。
POSTGRES_PASSWORD
通过运行以下命令验证数据库是否仍包含记录:
$ docker exec -ti new-db psql -U postgres -c "SELECT * FROM tasks"
查看卷内容
Docker Desktop Dashboard 提供了查看任何卷内容的能力,以及导出、导入和克隆卷的能力。
打开 Docker Desktop 控制面板并导航到 Volumes 视图。在此视图中,您应该会看到 postgres_data 卷。
选择postgres_data卷的名称。
Data 选项卡显示卷的内容,并提供导航文件的功能。双击文件将让您查看内容并进行更改。
右键单击任何文件以保存或删除它。
删除卷
在删除卷之前,不得将其附加到任何容器。如果您尚未删除以前的容器,请使用以下命令执行此操作(将首先停止容器,然后再删除它):-f
$ docker rm -f new-db
有几种方法可以删除卷,包括:
在 Docker Desktop Dashboard 的卷上选择 Delete Volume 选项。
使用命令:
docker volume rm
$ docker volume rm postgres_data
使用以下命令删除所有未使用的卷:
docker volume prune
$ docker volume prune
其他资源
以下资源将帮助您了解有关卷的更多信息:
后续步骤
现在,您已经了解了如何持久保存容器数据,是时候了解如何与容器共享本地文件了。