持久化容器数据
目录
- 容器卷
- 管理卷
- 试一试
- 使用卷
- 查看卷内容
- 删除卷
当一个容器启动时,它会使用镜像提供的文件和配置。每个容器可以创建、修改和删除文件,并且不会影响其他容器。当容器被删除时,这些文件更改也会被删除。
虽然容器的这种短暂性质很好,但当你想要持久化数据时,这就有问题了。例如,如果你重启一个数据库容器,你可能不希望从空数据库开始。那么,如何持久化文件呢?
容器卷
卷是一种存储机制,能够在单个容器的生命周期之外持久化数据。可以将其视为从容器内部到容器外部的快捷方式或符号链接。
例如,假设你创建了一个名为 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 work2 | 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 Dashboard
提供了查看任何卷内容的功能,以及导出、导入和克隆卷的功能。
打开 Docker Dashboard
并导航到卷视图。在这个视图中,你应该能看到 postgres_data
卷。
选择 postgres_data
卷的名称。
数据选项卡显示了卷的内容,并提供了浏览文件的功能。双击文件可以查看其内容并进行更改。
右键点击任何文件可以保存或删除它。
删除卷
在删除卷之前,必须确保它未附加到任何容器。如果你还没有删除之前的容器,请使用以下命令删除(-f
选项将首先停止容器,然后再删除它):
docker rm -f new-db
有几种方法可以删除卷,包括以下几种:
在 Docker Dashboard
中选择卷上的 Delete Volume
选项。
使用 docker volume rm
命令:
docker volume rm postgres_data
使用 docker volume prune
命令删除所有未使用的卷:
docker volume prune