Docker 的 Data Volmue存储

60 阅读3分钟

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.

  1. 拉取mysql 镜像
docker image pull mysql:5.7
  1. 创建容器
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.

  1. 查看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"
    }
]
  1. 进入mysql 容器
docker container exec -it <容器id> sh
  1. 访问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和容器

  1. 删除容器
docker container rm -f <容器id>
  1. 再创建一个新的容器, 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里的数据来恢复数据库数据.