1、前言
在生产环境中使用 Docker,一方面,需要对数据进行保存或者在多个容器之间进行数据共享;另一方面,在 Docker 的容器被删除后,并不会保留容器的状态信息。那么如何实现信息的持久化呢?这必然涉及容器的数据管理。
2、Docker实现数据管理的方式
在 Docker 容器中实现数据管理(或者说实现数据的持久化)主要有以下两种方式:
2.1、数据卷(Data Volumes)
数据卷本质上是一个挂载目录,类似使用 Linux的 mount 命令挂载的目录。数据卷可以供容器使用,并且可以在不同的容器之间共享和重用数据卷。对数据卷的修改会立即生效。数据卷与容器彼此独立,对数据卷的更新不会影响镜像。
即使容器被删除,数据卷默认也会一直存在,直到数据卷被删除为止。
在Docker 中可以使用-mount和-v 两种方式给容器挂载数据卷。
2.2、数据卷容器(Data Volume Containers)
数据卷容器是一种特殊的容器,用来维护数据卷。它可以在多个容器之间共享数据信息。利用数据卷容器可以很方便地完成数据迁移。
3、简单示例
3.1、数据卷示例
可以使用-mount或-v两种方式给容器挂在数据卷。
-mount和-v的区别在于,-mount如果宿主机目录不存在会直接报错,而-v会自动创建。
1)创建一个数据卷“myvolume”。
代码语言:bash复制docker volume create myvolume
创建后,查看所有数据卷。
代码语言:bash复制docker volume ls
也可以通过inspect命令查看数据卷详细信息。
代码语言:bash复制docker inspect myvolume
2)启动一个容器,并使用数据卷。
这里使用Nginx镜像创建一个容器,名称为mynginx,端口映射为1234:80。
代码语言:bash复制docker run -d -p 1234:80 --name=mynginx --mount type=volume,source=myvolume,target=/usr/share/nginx/html/ nginx
然而我这里却提示无法识别--mount,通过docker run --help并没有发现--mount命令。猜测跟docker版本有关系,我这里使用的是docker 1.13.0版本。网上找了一圈之后发现,需要docker-ce 75.06以上版本才可以。这里大家可以自行验证。
参数说明:
- --mount :指定在容器启动时挂载数据卷。
- type:指定数据卷挂载的方式。有以下几个参数:
- volume。普通数据卷,默认的type类型。其函数映射到主机“ar/lib/docker/volumes”目录下。
- bind。绑定数据卷。使用这种类型可以在挂载数据卷时将其映射到主机的指定目录下。
- tmpfs。临时数据卷,只将容器的目录挂载到宿主机的内存中。一般在实际环境中不会使用这种方式。
- source:指定宿主机上的目录或者数据卷。这里使用的是第(1)步所创建的数据卷myvolume。
- target:将容器中的“/usr/share/nginx/htm/”目录挂载到宿主机。
3)也可以使用-v参数进行挂载。
使用-v我们将宿主机/home/data目录挂载到容器内的/data/mydatavolume目录下。
代码语言:bash复制# --privileged=true 不加这个,容器内使用ls会提示权限问题
docker run -it --privileged=true -v /home/data/:/data/mydatavolume centos /bin/bash
容器内:
宿主机:
可以看到目录已经成功挂载,且当你在宿主机修改的内容,会直接同步到容器内部。
-v命令格式为:
代码语言:bash复制-v 宿主机目录:容器内部目录
3.2、数据卷容器示例
数据卷容器也是一个容器,专门用来提供数据卷供其他容器挂载。如果用户需要在多个容器之间共享一些持续更新的数据,则最简单的方式是使用数据卷容器。
1)创建数据卷容器。
创建一个数据卷容器 dbdata,并在其中创建一个数据卷挂载到“/dbdata”下:
代码语言:bash复制docker run -it -v /dbdata --name dbdata centos
2)数据卷容器内生成一些文件。
代码语言:bash复制echo hello world > a.txt
3)创建一个容器container1,并使用--volumes-from挂载dbdata容器的数据卷。
docker run -it --volumes-from dbdata --name=container1 centos
在容器container1中可以查看目录/dbdata,其中已经有了刚生成的a.txt:
4)同理可以继续建容器container2,并使用--volumes-from挂载dbdata容器的数据卷。
代码语言:bash复制docker run -it --volumes-from dbdata --name=container2 centos
并创建b.txt:
5)在容器container1中也能看到该数据。
从结果可以看出两个容器container1和container2挂载了同一个数据卷,并且数据卷都在相同的、dbdata目录下。这样容器的任何一方在该目录下写入,其他容器也都可以看到。这样很方便的实现了不同容器之间的数据共享,并且利用这种方式很容易的实现容器数据的迁移。