非常教程

Docker 17参考手册

引擎: 管理员指南 | Engine: Admin Guide

Volumes (Engine)

卷是持久化由 Docker 容器生成和使用的数据的首选机制。虽然绑定挂载依赖于主机的目录结构,但卷由 Docker 完全管理。与绑定安装相比,卷有几个优点:

  • 与绑定挂载相比,卷更容易备份或迁移。
  • 您可以使用 Docker CLI 命令或 Docker API 管理卷。
  • 卷在 Linux 和 Windows 容器上均可使用。
  • 卷可以在多个容器之间更安全地共享。
  • 卷驱动程序允许您在远程主机或云提供程序上存储卷,加密卷的内容或添加其他功能。
  • 新卷的内容可以由容器预先填充。

另外,与使容器的可写入层中的数据持久化相比,卷通常是更好的选择,因为使用卷不会增加使用容器的容器的大小,并且容器的内容存在于给定容器的生命周期之外。

Volumes (Engine)

如果您的容器生成非持久状态数据,请考虑使用 tmpfs 挂载以避免将数据永久存储在任何地方,并通过避免写入容器的可写层来提高容器的性能。

卷使用rprivate绑定传播,并且卷的传播不可配置。

选择-v 或-moun t标志

最初,-v--volume用标志独立的容器和--mount用于群服务标志。但是,从 Docker 17.06 开始,您也可以使用--mount独立容器。一般来说,--mount更明确和详细。最大的区别在于,-v语法将所有选项组合在一个字段中,而--mount语法将它们分开。这是每个标志的语法比较。

提示:新用户应使用--mount语法。有经验的用户可能更熟悉这个语法-v--volume语法,但鼓励使用--mount,因为研究表明它更易于使用。

如果您需要指定音量驱动程序选项,则必须使用--mount

  • -v 或者 --volume:由三个由冒号(:)分隔的字段组成。这些字段必须按正确的顺序排列,每个字段的含义并不明显。
    • 对于命名卷,第一个字段是卷的名称,并且在给定主机上是唯一的。对于匿名卷,第一个字段被省略。
    • 第二个字段是文件或目录将被安装在容器中的路径。
    • 第三个字段是可选的,并且是逗号分隔的选项列表,例如ro。这些选项在下面讨论。
  • --mount:由多个键值对组成,由逗号分隔,每个由一个<key>=<value>元组组成。该--mount语法比更详细的-v--volume,但按键的顺序并不显著,并且标志的价值更容易理解。
    • type安装件,其可以是bindvolume,或tmpfs。本主题讨论卷,所以类型将始终如此volume
    • source安装的。对于命名卷,这是卷的名称。对于匿名卷,该字段被省略。可能被指定为sourcesrc
    • destination作为其值,其中的文件或目录将被安装在容器的路径。可以指定为destinationdsttarget
    • readonly选项(如果存在)将导致绑定挂载以只读方式挂载到容器中。
    • volume-opt可以多次指定的选项采用由选项名称和值组成的键值对。

以下示例在可能的地方显示了语法--mount-v语法,并--mount首先给出。

-v--mount行为之间的差异

与绑定挂载相反,卷的所有选项都可用于标志--mount-v标志。

将卷与服务一起使用时,仅--mount支持。

创建和管理卷

与绑定挂载不同,您可以创建和管理任何容器范围之外的卷。

创建一个卷

$ docker volume create my-vol

清单卷

$ docker volume ls

local               my-vol

检查卷

$ docker volume inspect my-vol
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]

删除卷

$ docker volume rm my-vol

使用卷启动容器

如果您启动的卷尚未存在的容器,Docker 将为您创建卷。以下示例将卷myvol2装入/app/容器中。

所述-v--mount以下实施例产生相同的结果。除非在运行第一个devtest容器和容器myvol2之后移除容器和容量,否则无法运行它们。

  • --mount
  • -v
$ docker run -d \
  -it \
  --name devtest \
  --mount source=myvol2,target=/app \
  nginx:latest
$ docker run -d \
  -it \
  --name devtest \
  -v myvol2:/app \
  nginx:latest

使用docker inspect devtest验证创建卷并安装正确。寻找Mounts部分:

"Mounts": [
    {
        "Type": "volume",
        "Name": "myvol2",
        "Source": "/var/lib/docker/volumes/myvol2/_data",
        "Destination": "/app",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],

这表明挂载是一个卷,它显示正确的源和目标,并且挂载是可读写的。

停止容器并移除卷。

$ docker container stop devtest

$ docker container rm devtest

$ docker volume rm myvol2

用卷启动服务

当您启动服务并定义一个卷时,每个服务容器将使用其自己的本地卷。如果使用local卷驱动程序,则任何容器都不能共享此数据,但某些卷驱动程序确实支持共享存储。AWS 的 Docker 和 Azure 的 Docker 都使用 Cloudstor 插件支持持久存储。

以下示例启动一个nginx具有四个副本的服务,每个副本使用一个称为的本地卷myvol2

$ docker service create -d \
  --name devtest-service \
  --mount source=myvol2,target=/app \
  nginx:latest

使用docker service ps devtest-service验证服务正在运行:

$ docker service ps devtest-service

ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
4d7oz1j85wwn        devtest-service.1   nginx:latest        moby                Running             Running 14 seconds ago   

删除停止所有任务的服务:

$ docker service rm devtest-service

服务的语法差异

docker service create命令不支持-v--volume标志。将卷安装到服务的容器中时,必须使用该--mount标志。

使用容器填充卷

如果您启动一个创建新卷的容器(如上所述),并且容器在要装载的目录中具有文件或目录(/app/如上所述),则该目录的内容将被复制到卷中。然后容器将安装并使用该卷,并且使用该卷的其他容器也将有权访问预填充的内容。

为了说明这一点,这个例子启动一个nginx容器,并nginx-vol用容器/usr/share/nginx/html目录的内容填充新卷,这是 Nginx 存储其默认 HTML 内容的地方。

这个例子--mount-v最后的结果是一样的。

  • --mount
  • -v
$ docker run -d \
  -it \
  --name=nginxtest \
  --mount source=nginx-vol,destination=/usr/share/nginx/html \
  nginx:latest
$ docker run -d \
  -it \
  --name=nginxtest \
  -v nginx-vol:/usr/share/nginx/html \
  nginx:latest

运行这些示例之一后,运行以下命令来清理容器和卷。

$ docker container stop nginxtest

$ docker container rm nginxtest

$ docker volume rm nginx-vol

使用只读卷

对于某些开发应用程序,容器能够写入绑定安装非常有用,以便将更改传播回Docker主机。在其他时候,容器应该只能读取数据而不能修改它。请记住,多个容器可以安装相同的卷,并且可以同时对它们中的某些容器进行读写安装,也可以对其他容器进行只读。

这个例子修改了上面的例子,但是通过ro在容器中的挂载点之后添加选项列表(默认为空),将目录挂载为只读卷。如果存在多个选项,请用逗号分隔它们。

--mount-v实例有同样的结果。

  • --mount
  • -v
$ docker run -d \
  -it \
  --name=nginxtest \
  --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly \
  nginx:latest
$ docker run -d \
  -it \
  --name=nginxtest \
  -v nginx-vol:/usr/share/nginx/html:ro \
  nginx:latest

使用docker inspect nginxtest验证绑定安装正确创建。寻找Mounts部分:

"Mounts": [
    {
        "Type": "volume",
        "Name": "nginx-vol",
        "Source": "/var/lib/docker/volumes/nginx-vol/_data",
        "Destination": "/usr/share/nginx/html",
        "Driver": "local",
        "Mode": "",
        "RW": false,
        "Propagation": ""
    }
],

停止并移除容器,然后移除该容器:

$ docker container stop nginxtest

$ docker container rm nginxtest

$ docker volume rm nginx-vol

使用卷驱动程序

当您使用创建卷docker volume create或启动使用尚未创建的卷的容器时,可以指定卷驱动程序。以下示例vieux/sshfs首先在创建独立卷时使用卷驱动程序,然后在启动将创建新卷的容器时使用卷驱动程序。

初始设置

此示例假定您有两个节点,其中第一个是 Docker 主机,可以使用 SSH 连接到第二个节点。

在 Docker 主机上安装vieux/sshfs插件:

$ docker plugin install --grant-all-permissions vieux/sshfs

使用卷驱动程序创建卷

本示例指定了一个 SSH 密码,但如果两台主机配置了共享密钥,则可以省略该密码。每个卷驱动器可能有零个或多个可配置选项,每个选项都使用一个-o标志来指定。

$ docker volume create --driver vieux/sshfs \
  -o sshcmd=test@node2:/home/test \
  -o password=testpassword \
  sshvolume

启动一个使用卷驱动程序创建卷的容器

本示例指定了一个 SSH 密码,但如果两台主机配置了共享密钥,则可以省略该密码。每个卷驱动可能有零个或多个可配置选项。如果卷驱动程序要求您传递选项,则必须使用此--mount标志挂载卷,而不是-v**。**

$ docker run -d \
  --it \
  --name sshfs-container \
  --volume-driver vieux/sshfs \
  --mount src=sshvolume,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \
  nginx:latest

下一步

  • 了解绑定挂载。
  • 了解 tmpfs 挂载。
  • 了解存储驱动程序。

存储,持久性,数据持久性,卷

引擎: 管理员指南 | Engine: Admin Guide相关

1.Amazon CloudWatch记录日志记录驱动程序(引擎) | Amazon CloudWatch logs logging driver (Engine)
2. 绑定挂载 | Bind mounts (Engine)
3.使用Prometheus(引擎)收集Docker指标 | Collect Docker metrics with Prometheus (Engine)
4.配置和运行Docker(引擎) | Configuring and running Docker (Engine)
5.配置日志记录驱动程序 | Configuring logging drivers (Engine)
6.使用systemd控制和配置Docker(引擎) | Control and configure Docker with systemd (Engine)
7.ETW日志记录驱动程序(引擎) | ETW logging driver (Engine)
8.流利的日志驱动程序(引擎) | Fluentd logging driver (Engine)
9.格式化命令和日志输出(引擎) | Format command and log output (Engine)
10.Google Cloud日志记录驱动程序(引擎) | Google Cloud logging driver (Engine)
11.Graylog扩展格式(GELF)日志记录驱动程序(引擎) | Graylog Extended Format (GELF) logging driver (Engine)
12.Journald日志记录驱动程序(引擎) | Journald logging driver (Engine)
13.JSON文件日志记录驱动程序(引擎) | JSON File logging driver (Engine)
14.在守护进程停机期间保持容器处于活动状态(引擎) | Keep containers alive during daemon downtime (Engine)
15.限制容器的资源(引擎) | Limit a container's resources (Engine)
16.通过大使容器链接(引擎) | Link via an ambassador container (Engine)
17.记录驱动程序的日志标记(引擎) | Log tags for logging driver (Engine)
18.Logentries日志驱动程序(引擎) | Logentries logging driver (Engine)
19.PowerShell DSC用法(引擎) | PowerShell DSC usage (Engine)
20.修剪未使用的Docker对象(引擎) | Prune unused Docker objects (Engine)
21.在容器中运行多个服务(引擎) | Run multiple services in a container (Engine)
22.运行时指标(引擎) | Runtime metrics (Engine)
23.Splunk日志记录驱动程序(引擎) | Splunk logging driver (Engine)
24.自动启动容器(引擎) | Start containers automatically (Engine)
25.存储概述(引擎) | Storage overview (Engine)
26.Syslog日志记录驱动程序(引擎) | Syslog logging driver (Engine)
27.tmpfs mounts
28.解决卷问题(引擎) | Troubleshoot volume problems (Engine)
29.使用日志驱动程序插件(引擎) | Use a logging driver plugin (Engine)
30.使用Ansible(引擎) | Using Ansible (Engine)
31.使用Chef(引擎) | Using Chef (Engine)
32.使用Puppet(引擎) | Using Puppet (Engine)
33.查看容器的日志(引擎) | View a container's logs (Engine)
Docker 17

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

主页 https://docker.com/
源码 https://github.com/docker/docker
版本 17
发布版本 17.06