06. 管理Docker容器数据

2024-01-23 22:33:09 浏览数 (2)

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以上版本才可以。这里大家可以自行验证。

参数说明:

  1. --mount :指定在容器启动时挂载数据卷。
  2. type:指定数据卷挂载的方式。有以下几个参数:
    1. volume。普通数据卷,默认的type类型。其函数映射到主机“ar/lib/docker/volumes”目录下。
    2. bind。绑定数据卷。使用这种类型可以在挂载数据卷时将其映射到主机的指定目录下。
    3. tmpfs。临时数据卷,只将容器的目录挂载到宿主机的内存中。一般在实际环境中不会使用这种方式。
  3. source:指定宿主机上的目录或者数据卷。这里使用的是第(1)步所创建的数据卷myvolume。
  4. 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目录下。这样容器的任何一方在该目录下写入,其他容器也都可以看到。这样很方便的实现了不同容器之间的数据共享,并且利用这种方式很容易的实现容器数据的迁移。

0 人点赞