docker基础之数据管理

数据管理

容器中的管理数据主要有两种方式:

  1. 数据卷:容器内数据直接映射到本地主机环境。
  2. 数据卷容器:使用特定容器维护数据卷。

数据卷

数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。

数据卷提供的特性:

  1. 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便。
  2. 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作。
  3. 对数据卷的更新不会影响镜像,解耦开应用和数据。
  4. 数据卷会一直存在,直到没有容器使用,可以安全地卸载它。

操作数据卷常用命令

docker提供volume子命令来管理数据卷。

  • 创建一个本地数据卷,名字叫test
docker volume create -d local test

可以在本地/var/lib/docker/volumes查看创建的数据卷

  • 查看数据卷详细信息
docker volume inspect (数据卷名称/id)
  • 列出已有数据卷
docker volume ls
  • 清理无用数据卷
docker volume prune
  • 删除数据卷
docker volume rm (数据卷名称/id)

默认情况下,删除容器时不会删除数据卷,如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。

  • 启动一个挂载数据卷的容器

使用-v指令可以指定挂载一个本地的已有目录映射到容器中去作为数据卷

$ docker run -d -P --name web -v /src/webapp:/webapp training/webapp python app.py

-v指令语法解析:-v [HOST-DIR]:CONTAINER-DIR[:OPTIONS] 表示将本地HOST-DIR目录挂载到容器内的CONTAINER-DIR目录,OPTIONS表示数据卷属性,默认是可读写(rw)。

绑定数据卷

在创建容器时,将主机本地的任意路径挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷。

在用docker run命令的时候,可以使用-mount选项来使用数据卷。

-mount选项支持三种类型的数据卷,包括:

  • volume:普通数据卷,映射到主机/var/lib/docker/volumes路径下;
  • bind:绑定数据卷,映射到主机指定路径下;
  • tmpfs:临时数据卷,只存在于内存中。

例子:

使用training/webapp镜像创建一个web容器,并创建一个数据卷挂载到容器的/opt/weball目录下:

docker run -d -P --name web --mount type=bind,source=/webapp,destination=/opt/webapp trainging/webapp python app.py

上述命令等价于使用旧的-v标记可以在容器内创建一个数据卷:

docker run -d -P --name web -v /webapp:/opt/webapp trainging/webapp python app.py

–mount和-v指令的区别是:以前使用 -v 参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹,现在使用 --mount 参数时如果本地目录不存在,Docker 会报错。

Docker挂载数据卷的默认权限是读写(rw),用户可以通过ro指定为只读:

docker run -d -P --name web --mount type=bind,source=/webapp,destination=/opt/webapp:ro trainging/webapp python app.py

加了:ro后,容器内对所挂载数据卷内的数据就无法修改了。

注意:本地目录的路径必须是绝对路径,容器内路径可以为相对路径。

推荐直接挂载文件所在的目录到容器内,而不是直接挂载一个文件到容器。

数据卷容器

如果用户在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。

首先,创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到容器内/dbdata:

docker run -it -v /dbdata --name test ubuntu

然后可以在其他容器中使用--volumes-from来挂载test容器中的数据卷.

例如创建db1和db2两个容器,并从test容器挂载数据卷:

docker run -it --volumes-from test --name db1 ubuntu
docker run -it --volumes-from test --name db2 ubuntu

此时,容器db1和db2都挂载同一个数据卷到相同的/dbdata目录,三个容器任何一方在该目录下的写入,其他容器都可以看到。

注意:

  • 如果删除了挂载的容器,数据卷并不会被自动删除。
  • 使用–volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态。
发布了47 篇原创文章 · 获赞 16 · 访问量 3471

猜你喜欢

转载自blog.csdn.net/kaihuishang666/article/details/104378735