数据管理
容器中的管理数据主要有两种方式:
- 数据卷:容器内数据直接映射到本地主机环境。
- 数据卷容器:使用特定容器维护数据卷。
数据卷
数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。
数据卷提供的特性:
- 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便。
- 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作。
- 对数据卷的更新不会影响镜像,解耦开应用和数据。
- 数据卷会一直存在,直到没有容器使用,可以安全地卸载它。
操作数据卷常用命令
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参数所挂载数据卷的容器自身并不需要保持在运行状态。