若有疑问参考前面几篇
Docker
文章,循序渐进
不懂算我输,话不多说,实战为主!
作者:变优秀的小白
Github:关注YX-XiaoBai
爱好:Americano More Ice !
QQ学习交流群(new): 811792998
目录
持久化Docker的数据库
你可能没有注意到,每一次我们连接容器我们之前的数据及操作都会被删除。为什么会这样呢?让我们更加深入容器(Container
)是怎么运作的!
容器的文件系统
当一个容器运行时,为它的文件系统filesystem
从镜像中使用多变的图层。针对每一个容器都会获得完全属于自己的scratch space
(暂存空间)以便于创建、更新、移除文件。各个容器之间是互不影响的,即使它们使用同一个镜像
让练习加深我们的理解
我们准备启动两个容器并为每个容器创建一个文件,你会发现一个容器创建的文件另一个容器的看不到、获取不到的
- 启动一个
ubuntu
容器会创建一个名称为/data.txt
(文件带一个1-10000的随机数)
docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
-
docker Dashboard
中运行它
-
随后我们会看到一个终端,我们输入
cat /data.txt
即可获取我们当时放入的随机数
-
现在我们启动另一个
ubuntu
容器,可以看到是没有一样的文件的
docker run -it ubuntu ls /
- 最后我们移除第一个容器(
docker rm -f <container-id>
)
容器Volumes
通过上面的实验我们发现当容器被移除后所有改动都会清除,所有操作都是与容器相关联的。通过使用volumes
我们可以改变这个现状
Volumnes
提供了连接容器的特定文件系统路径和主机能力。如果一个目录装入了容器container
中,目录的改变可以在本地主机看到。如果在容器重启时我们装入一样的目录,我们会看到相同的文件
Volumes
总共有两种主要类型,我们会同时使用两者,我们会从named volunmes
开始
持久化我们的数据
我们应用的数据是存储在SQLiteDB
中的。由于数据库是单个文件,因此如果我们可以将该文件持久保存在主机上并使其可用于下一个容器,则它应该能够从上一个停止的地方开始。
通过创建一个卷并将其附加(通常称为“安装”)到存储数据的目录中,我们可以保留数据。当我们的容器写入todo.db
文件时,它将被持久保存到卷中的主机上
如前所述,我们将使用named volume
,可以认为它是简单的数据桶。Docker
维护磁盘上的物理位置,您只需要记住volume
的名称即可。每次使用该卷时,Docker将确保提供正确的数据
- 通过
docker volume create
创建一个volume
docker volume create todo-db
- 停止运行的容器,因为它还是以没有使用持久化
volumen
在运行
docker rm -f <container-id>
可以通过docker ps
查询是否删除成功
- 启动
todo app
容器,注意使用-v
参数装入一个特定的volume
。我们将使用这个named volumne
并且装它进/etc/todos
,它将捕获所有创建文件的路径
docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
$ docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
2f097bda1285fee852ce6a2c38f2bb55c4bf7a689f3934139f68dc7b77417f0a
- 一旦容器启动,打开我们
app
和添加一些todo
(即添加数据)
这里需要参考前面两篇文章
-
接着移除
app
的容器。用Dashboard
或者docker rm -f <id>
都可以 -
使用之前的命令启动一个新的容器
docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
-
再次打开
app
,你发现你的数据依然存在! -
搞定完我们继续删除掉我们的容器~
深入了解我们的Volume
你可能会有大大的疑问当我使用volume时Docker将我的数据存储在了哪里?
。下面就来介绍docker
自带的inspect
命令
$ docker volume inspect todo-db
[
{
"CreatedAt": "2021-01-29T03:06:28Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
"Name": "todo-db",
"Options": {},
"Scope": "local"
}
]
Mountpoint
就是咋们数据存储的地方。
Tips:
Docker
命令通常在我们机器的小VM
内运行。如果你你先看mountpoint
的实际内容,你得先进入VM
总结
现在我们可以使用named volume
去存储我们的数据,以便于重启容器时数据不会丢失。
但是我们还可以有更好的方法,就是bind mounts
结束语:不懂算我输,当然~如果遇到什么疑问或者建议的,可直接留言评论!作者看到会马上一一回复!