Data Volume
当容器被销毁后, 容器里的数据也会被销毁. 如果想要持久化容器里的数据, 可以使用 Data Volume. Data Volume 是一种用于在Docker容器和宿主机之间持久化存储数据的机制.
比如我们让容器每隔一分钟向文件写入当前时间, 把这个文件通过Data Volume机制保存到宿主机.
const path = require('path')
const fs = require('fs')
const filename = path.resolve('./', 'output.txt')
function writeCurrentTime() {
const now = new Date()
const formattedTime = now.toLocaleString();
const content = `${formattedTime}\n`
fs.appendFile(filename, content, (err) => {
if (err) {
console.error('Error writing to file:', err)
return;
}
console.log('Successfully wrote to file:', formattedTime)
})
}
setInterval(writeCurrentTime, 10000)
运行容器后, 可以使用docker volume ls 查看创建的持久化数据
docker volume ls
DRIVER VOLUME NAME
local 6c6c5ecbef40aad7320bf6823c7f7f63ff42701af74df71fa80d0e2eb188ed59
哪怕容器删除了, volume的数据还是存在的.
如何让不同的容器使用相同的volume
可以运行容器的时候给volume指定一个名字, 如果下一个容器运行时也指定了相同的名字, 那么会使用同一个volume.
# 创建一个容器, 指定volume的名字为cron-data
docker container run -d -v cron-data:/usr/src/app/my-cron my-cron
# 把这个容器删掉, 再创建一个容器, 指定volume的名字也是cron-data. 这是这个容器拿到的volume和上一个容器的volume是同一个
docker container rm -f b3c0
docker container run -d -v cron-data:/usr/src/app/my-cron my-cron
Data Volume实战之 mysql
使用mysql镜像创建容器, 新建数据库, 把数据库存在data volume上. 再删除该数据库, 再创建一个新的数据库, 使用之间的data volume.
- 拉取mysql 镜像
docker image pull mysql:5.7
- 创建容器
docker container run --name my-sql -e MYSQL_ROOT_PASSWORD=123456 -d -v mysql-data:/var/lib/mysql mysql:5.7
其中, -e选项是用来指定容器内部的环境变量. 这里是指定mysql数据库的root密码为123456. -v选项用来指定data volume.
- 查看data volume
docker volume ls
docker volume inspect mysql-data
[
{
"CreatedAt": "2023-06-11T23:45:55Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/mysql-data/_data",
"Name": "mysql-data",
"Options": null,
"Scope": "local"
}
]
- 进入mysql 容器
docker container exec -it <容器id> sh
- 访问mysql
mysql -u root -p
# 查看所有的数据库
show databases;
-------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
# 创建一个新的数据库 my_demo
create database my_demo;
创建好新数据库后, 使用 show databases; 命令查看我们发现多了一个数据库叫 my_demo.
接下来退出mysql和容器
- 删除容器
docker container rm -f <容器id>
- 再创建一个新的容器, data volume指定为之前的
docker container run -v mysql-data:/var/lib/mysql mysql:5.7
容器创建完成之后, mysql将使用data volume里的数据, 我们再查看数据库, 会发现之前创建的my_sql数据库依然存在.
docker container exec -it <容器id> sh
mysql -u root -p
show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| my_demo |
| mysql |
| performance_schema |
| sys |
+--------------------+
至此, 我们使用了data volume来储存mysql 数据库的数据, 哪怕容器删除了, 创建新的容器, 我们依然使用data volume里的数据来恢复数据库数据.