本博客为JDGan自修Docker的笔记,如有粗鄙之处,还请见谅~
阅读本博客前,请确定了解了以前的blog:
Docker 自修笔记(五)
Docker的数据管理
Data volumes(数据卷)
Data volumes 是一种特别设计的目录,绕开了联合文件系统。
- Volumes在容器创建时就初始化,如果容器的父映像包含指定的挂载点上的数据,则在卷初始化时将现有数据复制到新卷中。
- 数据卷可以被容器共享。
- 可以对数据卷直接进行变更操作。
- 更新镜像时,数据卷变更不会同步。
- 就算容器被删了,数据卷还是会保存下来。
添加一个数据卷
Docker通过docker create
和docker run
添加-v
标签来创建数据卷。
$ docker run -d -P --name web -v /webapp training/webapp python app.py
这样就在容器里的/webapp
位置创建了一个新的数据卷。
也可以在Dockerfile里使用VOLUME直接添加数据卷。
定位数据卷
需要定位数据卷时,可以直接通过命令查看。
$ docker inspect web
...
"Mounts": [
{
"Name": "fac362...80535",
"Source": "/var/lib/docker/volumes/fac362...80535/_data", //主机地址
"Destination": "/webapp", //容器
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
...
将一个主机目录设置为数据卷
Docker同样可以通过-v
标签将已有的主机目录设置为数据卷。
$ docker run -d -P --name web -v /src/webapp:/webapp training/webapp python app.py
其中/src/webapp
就是主机目录,加载到容器中/webapp
,并运行起来。如果容器中的/webapp
已经存在,这个命令不会覆盖,仅仅是在原文件基础上添加一个读写层来运行,在这个数据卷被删除后,原有的文件会恢复访问。
- 容器目录必须是绝对路径,而主机目录可以是相对或绝对路径。
- 数据卷的名称
name
必须符合规则:^[a-z0-9][a-z0-9\.-_]*$
。 - 容器绝对路径必须以
/
开头。
MAC
docker run -v /Users/:/ ...
Windows
docker run -v c:\:c:\
Virtual machine
虚拟机等文件系统则需要设置文件共享才能使用 -v 命令
可以通过命令来修改数据卷的读写模式
$ docker run -d -P --name web -v /src/webapp:/webapp:ro training/webapp python app.py
也可以通过cached
降低数据卷的一致性需求来提高性能
$ docker run -d -P --name web -v /src/webapp:/webapp:cached training/webapp python app.py
安装一个共享数据卷
在容器中创建一个名次数据卷。
$ docker run -d -P \
--volume-driver=convoy \ //如果不需要使用convoy,可以使用local
-v my-named-volume:/webapp \
--name web training/webapp python app.py
直接创建数据卷,附上docker插件。其中传参的方式是o=
:
$ docker volume create -d convoy --opt o=size=20GB my-named-volume
$ docker run -d -P \
-v my-named-volume:/webapp \
--name web training/webapp python app.py
数据卷标记
标记:z
表示数据卷可以背多个容器共享。
标记:Z
表示数据卷不能共享,是容器专用的私有卷。
将一个文件挂载为容器数据卷
-v
也可以将单个文件挂载到容器作为数据卷。
$ docker run --rm -it -v ~/.bash_history:/root/.bash_history ubuntu /bin/bash
创建并部署数据卷容器
$ docker create -v /dbdata --name dbstore training/postgres /bin/true
$ docker run -d --volumes-from dbstore --name db1 training/postgres
$ docker run -d --volumes-from dbstore --name db2 training/postgres
$ docker run -d --name db3 --volumes-from db1 training/postgres
如果需要删除容器同时删除挂载的数据卷,则要使用docker rm -v
,否则该数据卷就会变为无关联dangling
数据卷,可以通过docker volume ls -f dangling=true
查询到这些数据卷。
删除数据卷
$ docker run --rm -v /foo -v awesome:/bar busybox top
删除所有没有使用和挂载的数据卷并释放空间:
$ docker volume prune
列出所有数据卷
$ docker volume ls
备份恢复和迁移数据卷
如果需要做到备份恢复和迁移数据卷,将需要用到--volumes-from
,举个栗子:
$ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
这个栗子梨,创建了一个新的容器并启动,挂载了dbstore容器的数据卷,部署在本地目录/backup
,最后,通过tar
备份了dbdata
的数据卷到/backup/backup.tar
。
$ docker run -v /dbdata --name dbstore2 ubuntu /bin/bash
$ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"