Skip to content

Docker之数据的可持续化

Info

作者:Tina,发布于2021-11-25,阅读时间:约4分钟,微信公众号文章链接:

1 前言

Docker初体验一文中我们介绍了Docker的基本概念,之后我们又分享了如何教你成功在Win10系统中运行docker使用GitHub Action自动构建和推送Docker镜像,尝试过的朋友应该可以在Docker中为自己的程序代码创建镜像,运行容器,或是在Github Action中使用Docker等基本操作。今天,我们将说说如何Docker中持续化管理数据--数据卷(Volumes)的使用。

2 管理数据的必要性

初次体验Docker的人可能会发现,每当我们重启容器时,之前的数据都会丢失,又或是感觉数据很难转移。这些都是因为Docker的默认设置会将所有的文件都创建在一个容器中的某些可读容器层。换句话说,一个容器的数据是独立不能共享的,为了实现数据共享和数据迁移,就需要我们使用一些方法可持续化地管理数据。

3 关于Volumes

3.1 优势

Volumes是一种由Docker创建并维护的数据管理机制。如下图所示,它最大的特点是将文件存放在Docker主机内,是不允许其他程序的访问,在不同容器间共享数据时具有较高的安全性;且可直接用Docker命令进行数据备份和数据迁移。除此之外,Volumes在Docker Desktop的表现性能比其他方式更加出色,这也是官方最推荐的方式。

来自:Docker官方文档

3.2 Volumes常见操作

这里参考官方文档,我们介绍几种不同情况下对Volumes的使用。

1.我们可通过以下基本命令创建及管理Volumes:

# 创建volumes并命名 my-vol
docker volume create my-vol

# Volumes列表
docker volume ls

# 查看Volumes特性
docker volume inspect my-vol

# 移除Volumes
docker volume rm my-vol

# 移除所有Volumes
docker volume prune

2.可在启动容器时指定Volumes:

## 运行devtest容器
## 并将容器myvol2挂在/app目录中
 docker run -d \
  --name devtest \
  -v myvol2:/app \
  nginx:latest

3.当建立多容器服务的时候,开发者往往会选择docker compose这一多容器管理的工具,并编写好docker-compose.yml文件。一方面,此文件可以帮助我们将所有容器的配置参数融合在一个file里面统一管理,另外一方面它可以帮助多容器的服务快速启动或终止,这里我们不详细介绍yml文件的每个参数,而着重说一下如何在此文件中定义Volumes。

version: "3.9"
services:
  frontend:
    image: node:lts
    volumes:
      - myapp:/home/node/app
volumes:
  myapp:
    external: true
这里的两个volumes设定,第一个是设置services的volumes,名为myapp,路径是储存在/home/node/app下,第二个顶级volumes中的设置是为了实现多个容器的共享,比如这里就是设置myapp可以被所有容器共享。

4.使用已存在的容器数据为新的容器创建Volumes。这里新容器名为nginxtest,新Volumes命名为nignx-vol,其数据来源的路径是/usr/share/nginx/html

 docker run -d \
  --name=nginxtest \
  -v nginx-vol:/usr/share/nginx/html \
  nginx:latest

在此基础上,你也可以通过添加ro来设置只读权限,这样可以防止其他人在共享容器数据时的误删或其他失误。

 docker run -d \
  --name=nginxtest \
  -v nginx-vol:/usr/share/nginx/html:ro \
  nginx:latest

5.Volumes还可以运用在数据备份,数据迁移的场景中。

首先,我们创建一个名dbstore的容器且带有Volumesdbdata

docker run -v /dbdata --name dbstore ubuntu /bin/bash

第二步,为这个容器的Volumes进行备份,利用--volumes-from指定容器的来源,指定将dbdata备份到路径/backup下的backup.tar文件中:

docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

接下来,迁移上一步已经备份好的容器数据, 需要创建一个新的容器dbstore2

docker run -v /dbdata --name dbstore2 ubuntu /bin/bash

最后,再从backup.tar文件中迁移到新的容器中:

 docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"

4 总结

当部署服务时,功能的开发是一方面,数据的可持续化管理也是必不可少的一个部分。希望这篇文章可以帮助你在使用Docker Volume时选择合适的命令来管理容器中的数据。

欢迎各位小伙伴留言讨论!


Viewed times

Comments