为什么容器需要持久化存储
容器按照业务类型可以分为两类:
- 无状态容器(数据不需要持久化)
- 有状态容器(数据需要持久化)
Docker 默认更适用于运行无状态应用,因为容器文件系统的读写层会随容器销毁而丢失数据。因此,为了解决有状态应用的数据存储需求,Docker 引入了 数据卷(Volume)。
什么是数据卷?
数据卷本质上是文件或目录,它绕过 Docker 默认的联合文件系统,支持数据持久化和容器间数据共享。
Docker 数据卷操作
1. 创建数据卷
可以使用 docker volume create 命令创建一个数据卷:
# 创建名为 myvolume 的数据卷
docker volume create myvolume
默认情况下,Docker 创建的数据卷仅限于本主机访问。如需远程访问,则需使用网络存储。
此外,也可以在启动容器时使用 -v 参数让 Docker 自动创建数据卷:
# 运行 nginx 容器,并在 /usr/share/nginx/html 目录创建数据卷
docker run -d --name nginx-volume -v /usr/share/nginx/html nginx
2. 查看数据卷
使用 docker volume ls 命令查看已创建的数据卷:
# 列出所有数据卷
docker volume ls
查看某个数据卷的详细信息:
# 查看 myvolume 详情
docker volume inspect myvolume
3. 使用数据卷
在启动容器时,使用 --mount 参数指定数据卷名称即可使用:
# 使用 myvolume 数据卷挂载到容器的 /app 目录
docker run -d --name mycontainer --mount source=myvolume,target=/app busybox
4. 删除数据卷
容器删除时不会自动删除数据卷,需要手动删除不再使用的数据卷:
# 删除 myvolume 数据卷
docker volume rm myvolume
注意:
- 正在使用中的数据卷无法删除,如需删除,必须先停止并删除所有使用该数据卷的容器。
容器间数据共享
- 创建一个共享数据卷: docker volume create log
- 启动生产日志的容器(写入数据): docker run -d --mount source=log,target=/tmp/log --name log-producer busybox
- 启动一个消费者容器(读取数据): docker run -it --name consumer --volumes-from log-producer busybox
- 在 log-producer 容器中创建日志文件: echo "Hello, My log." > /tmp/log/mylog.log
- 切换到 consumer 容器,查看日志内容: cat /tmp/log/mylog.log
总结:
- log-producer 容器向 log 数据卷写入日志。
- consumer 容器从 log 数据卷读取日志,实现了容器间数据共享。
宿主机与容器间数据共享
要实现宿主机与容器之间的数据共享,可以在启动容器时使用 -v 参数指定宿主机目录挂载点:
# 挂载宿主机的 /data 目录到容器内的 /usr/local/data 目录
docker run -v /data:/usr/local/data -it busybox
容器启动后,/usr/local/data 目录即可访问宿主机的 /data 目录,并且容器重启后数据不会丢失。
非常感谢您的阅读!要是您觉得不错,就点个赞、留个评论、关注一下。