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/:/ ...

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"

你可能感兴趣的:(Docker 自修笔记(六)—— 示例学习)