写在前面
主题是Persist the DB,这里是链接。本文主要学习如何持久化容器中的数据。
实践
-
使用docker运行一个随机生成1-10000的数的命令。下面是两个命令用
&&
合并在一起,第一个命令是生成随机数并输出到data.txt,后面的命令是保持容器运行以方便后面查看文件docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
-
执行下面的命令得到生成的数字。
exec
是交换容器的关键字,后面接上容器id即可访问该容器。执行后会打印出一个数字。docker exec <container-id> cat /data.txt
-
执行下面的命令直接将输入打印出来,并不会存入data.txt文件。其中
ls /
是相对容器的目录。docker run -it ubuntu ls /
-
执行下面的命令把操作1的容器停止
docker rm -f <container-id>
卷Volumes
启动容器后,在容器内的增删改操作都保留在容器里,当容器关闭后,数据与随之丢失。 Volumes让容器内的路径与主机关联起来,如果挂载了一个容器的目录,容器内的修改同样会对主机造成同样的影响。Volumes有两种方式,一种是mount,另一种是使用docker的volume
创建Volume并启动容器
有一点需要知道,todo app将数据存储在容器内的 /etc/todos/todo.db
内。
- 创建Volume
docker volume create todo-db
- 使用下面命令启动getting-started,src是Volume的名字,target是容器内的路径
docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started
- 访问
http://localhost:3000
,添加几个item
- 停止并移除当前容器,使用
docker ps
和docker rm -f <id>
实现 - 使用上面的命令重新生成一个容器
docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started
- 重新访问
http://localhost:3000
,会看见item还保留在那里
如何得到Volume存储的位置
执行下面命令得到Volume的元数据。其中Mountpoint就是实际的存储路径。
docker volume inspect todo-db
[{"CreatedAt": "2019-09-26T02:18:36Z","Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/todo-db/_data","Name": "todo-db","Options": {},"Scope": "local"}
]