持久化容器数据
解释
当容器启动时,它使用镜像提供的文件和配置。每个容器都能够创建、修改和删除文件,并且这样做不会影响任何其他容器。当容器被删除时,这些文件更改也会被删除。
虽然容器的这种临时性很好,但当您想持久化数据时,它会带来挑战。例如,如果您重启一个数据库容器,您可能不希望从一个空的数据库开始。那么,您如何持久化文件呢?
容器卷
卷是一种存储机制,它提供了在单个容器的生命周期之外持久化数据的能力。可以把它想象成在容器内部提供一个指向容器外部的快捷方式或符号链接。
举个例子,假设你创建了一个名为 log-data 的卷。
$ docker volume create log-data
当使用以下命令启动容器时,该卷将被挂载(或附加)到容器的 /logs 目录。
$ docker run -d -p 80:80 -v log-data:/logs docker/welcome-to-docker
如果卷 log-data 不存在,Docker 会自动为您创建它。
当容器运行时,它写入 /logs 文件夹的所有文件都将保存在此卷中,即容器外部。如果您删除该容器并使用相同的卷启动一个新容器,这些文件仍然会存在。
使用卷共享文件
您可以将同一个卷附加到多个容器,以在容器之间共享文件。这在日志聚合、数据管道或其他事件驱动型应用等场景中可能很有帮助。
管理卷
卷有其自己的生命周期,独立于容器,并且根据您使用的数据和应用程序的类型,它们可能会变得非常大。以下命令将有助于管理卷。
docker volume ls- 列出所有卷docker volume rm <volume-name-or-id>- 移除一个卷(仅当该卷未附加到任何容器时才有效)docker volume prune- 移除所有未使用的(未附加的)卷
试一试
在本指南中,您将练习创建和使用卷来持久化 Postgres 容器创建的数据。当数据库运行时,它将文件存储到 /var/lib/postgresql/data 目录中。通过在此处附加卷,您将能够在多次重启容器的同时保留数据。
使用卷
下载并安装 Docker Desktop。
使用 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 仪表盘提供了查看任何卷内容的能力,以及导出、导入和克隆卷的功能。
打开 Docker Desktop 仪表盘并导航到**卷**视图。在此视图中,您应该能看到 **postgres_data** 卷。
选择 **postgres_data** 卷的名称。
**数据**选项卡显示卷的内容,并提供了浏览文件的功能。双击文件可以查看其内容并进行更改。
右键单击任何文件可保存或删除它。
移除卷
在移除卷之前,它必须没有附加到任何容器。如果您还没有移除之前的容器,请使用以下命令进行操作(-f 标志会先停止容器然后再移除它)。
$ docker rm -f new-db
有几种方法可以移除卷,包括以下几种:
在 Docker Desktop 仪表盘中选择卷上的**删除卷**选项。
使用
docker volume rm命令。$ docker volume rm postgres_data使用
docker volume prune命令移除所有未使用的卷。$ docker volume prune
其他资源
以下资源将帮助您了解更多关于卷的信息。
后续步骤
现在您已经了解了如何持久化容器数据,是时候学习如何与容器共享本地文件了。
与容器共享本地文件