Docker 自修笔记(六)—— 示例学习

本博客为JDGan自修Docker的笔记,如有粗鄙之处,还请见谅~

阅读本博客前,请确定了解了以前的blog:
Docker 自修笔记(五)

Docker的数据管理

Data volumes(数据卷)

Data volumes 是一种特别设计的目录,绕开了联合文件系统。

  • Volumes在容器创建时就初始化,如果容器的父映像包含指定的挂载点上的数据,则在卷初始化时将现有数据复制到新卷中。
  • 数据卷可以被容器共享。
  • 可以对数据卷直接进行变更操作。
  • 更新镜像时,数据卷变更不会同步。
  • 就算容器被删了,数据卷还是会保存下来。

添加一个数据卷

Docker通过docker createdocker 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/<path>:/<container path> ...

Windows

docker run -v c:\<path>:c:\<container path>

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=<key>=<value>

$ 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"

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,554评论 0 120
  • 五、Docker 端口映射 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了...
    R_X阅读 1,806评论 0 7
  • 01 我今年刚好30,比起28 , 29岁时的焦虑,这一年反而过得通透了很多。 不得不说,这个年龄有点尴尬,刚毕业...
    筱潞candy阅读 403评论 0 0
  • 我来了 为了遇见你
    苏昱玮阅读 355评论 0 0
  • 做人 做人智商高不高没关系,情商高不高也问题不大,但做人的格局一定要大,说白了,你可以不聪明,也可以不懂交际,但一...
    真的在听吗阅读 222评论 0 1