docker学习笔记(四)docker数据持久化volume

docker数据持久化

官网:https://docs.docker.com/storage/volumes/

docker中的容器是可以随时销毁的,容器中的数据会随着容器的消亡而消亡。然而很多容器都有持久化数据的需求(比方说redis,mysql),为了能够保存数据以及共享容器间的数据,Docker提出了几种方式。

Volumes are the preferred mechanism for persisting data generated by and used by Docker containers. 

While bind mounts are dependent on the directory structure of the host machine, volumes are completely managed by Docker.

In addition, volumes are often a better choice than persisting data in a container’s writable layer, because a volume does not increase the size of the containers using it, and the volume’s contents exist outside the lifecycle of a given container.

简单来说,bind mount和volume其实都是利用的宿主机的文件系统来解决数据的持久化问题,区别在于volume是受docker管理,故而就不需要担心权限引发的挂载问题,并且目录路径是docker自身管理(dockerfile里定义)的,在不同的服务器上会保持目录的一致性,更方便做迁移等,这也是volume由于bind mount的地方。

volume

-v命令:

-v < unique volume name >:<container directory>: [rw|ro]

第一个参数表示volume name,宿主机上唯一;第二个是container保存数据的目录,第三个是可选参数

In the case of named volumes, the first field is the name of the volume, and is unique on a given host machine. For anonymous volumes, the first field is omitted.
The second field is the path where the file or directory are mounted in the container.
The third field is optional, and is a comma-separated list of options, such as ro. These options are discussed below.

mysql的数据是挂载在容器内部的/var/lib/mysql目录下

(1)创建mysql数据库的container
  docker run -d --name mysql01 -e MYSQL_ROOT_PASSWORD=123456  mysql

(2)查看容器的volume
  docker volume ls

(3)创建一个mysql并为挂载的目录取一个别名(方便记忆)
docker run -d --name mysql02 -v mysql02_volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql

(4)查看容器的volume和mysql02的volume docker volume inspect  volume_name

从这里我们可以看到docker的目录和容器内的数据存储目录的对应关系

在MySQL中创建数据库,删除容器后以volume创建一个同样数据的新容器

删除容器后,原来的volume仍旧存在(如果想将volume一起删除,可以使用 docker rm -v container)

通过旧容器的volume创建一个新的容器,也会有和之前的容器一样的数据

 docker run -d --name mysql03  -v mysql02_volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql 

bind mounts

Bind mounts have limited functionality compared to volumes. When you use a bind mount, a file or directory on the host machine is mounted into a container. The file or directory is referenced by its full or relative path on the host machine. 

-v <host directory>: <container directory> :[rw|wo]

bind mounts就是将容器内的某个自定义目录挂载到宿主机下的某个目录里,使得用户可以在宿主机里修改文件,而容器下的文件内容也会随之发生变化

docker run -d --name mysql04 -v /tmp/test:/usr/local/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql

在宿主机的目录下新增文件aa.txt,可以在容器内发现挂载的目录里也多了对应的文件

发布了47 篇原创文章 · 获赞 12 · 访问量 5095

猜你喜欢

转载自blog.csdn.net/qq_35448165/article/details/103263614