目录搜索
ComposeAbout versions and upgrading (Compose)ASP.NET Core + SQL Server on Linux (Compose)CLI environment variables (Compose)Command-line completion (Compose)Compose(组成)Compose command-line reference(组合命令行参考)Control startup order (Compose)Django and PostgreSQL (Compose)Docker stacks and distributed application bundles (Compose)docker-compose build(docker-compose构建)docker-compose bundledocker-compose configdocker-compose createdocker-compose downdocker-compose eventsdocker-compose execdocker-compose helpdocker-compose imagesdocker-compose killdocker-compose logsdocker-compose pausedocker-compose portdocker-compose psdocker-compose pulldocker-compose pushdocker-compose restartdocker-compose rmdocker-compose rundocker-compose scaledocker-compose startdocker-compose stopdocker-compose topdocker-compose unpausedocker-compose upEnvironment file (Compose)Environment variables in ComposeExtend services in ComposeFrequently asked questions (Compose)Getting started (Compose)Install ComposeLink environment variables (deprecated) (Compose)Networking in ComposeOverview of Docker ComposeOverview of docker-compose CLIQuickstart: Compose and WordPressRails and PostgreSQL (Compose)Sample apps with ComposeUsing Compose in productionUsing Compose with SwarmEngine.NET Core application (Engine)About images, containers, and storage drivers (Engine)Add nodes to the swarm (Engine)Apply custom metadata (Engine)Apply rolling updates (Engine)apt-cacher-ngBest practices for writing Dockerfiles (Engine)Binaries (Engine)Bind container ports to the host (Engine)Breaking changes (Engine)Build your own bridge (Engine)Configure container DNS (Engine)Configure container DNS in user-defined networks (Engine)CouchDB (Engine)Create a base image (Engine)Create a swarm (Engine)Customize the docker0 bridge (Engine)Debian (Engine)Default bridge networkDelete the service (Engine)Deploy a service (Engine)Deploy services to a swarm (Engine)Deprecated Engine featuresDocker container networking (Engine)Docker overview (Engine)Docker run reference (Engine)Dockerfile reference (Engine)Dockerize an applicationDrain a node (Engine)EngineFAQ (Engine)Fedora (Engine)Get started (Engine)Get started with macvlan network driver (Engine)Get started with multi-host networking (Engine)How nodes work (Engine)How services work (Engine)Image management (Engine)Inspect the service (Engine)Install Docker (Engine)IPv6 with Docker (Engine)Join nodes to a swarm (Engine)Legacy container links (Engine)Lock your swarm (Engine)Manage nodes in a swarm (Engine)Manage sensitive data with Docker secrets (Engine)Manage swarm security with PKI (Engine)Manage swarm service networks (Engine)Migrate to Engine 1.10Optional Linux post-installation steps (Engine)Overview (Engine)PostgreSQL (Engine)Raft consensus in swarm mode (Engine)Riak (Engine)Run Docker Engine in swarm modeScale the service (Engine)SDKs (Engine)Select a storage driver (Engine)Set up for the tutorial (Engine)SSHd (Engine)Storage driver overview (Engine)Store service configuration data (Engine)Swarm administration guide (Engine)Swarm mode key concepts (Engine)Swarm mode overlay network security model (Engine)Swarm mode overview (Engine)Understand container communication (Engine)Use multi-stage builds (Engine)Use swarm mode routing mesh (Engine)Use the AUFS storage driver (Engine)Use the Btrfs storage driver (Engine)Use the Device mapper storage driver (Engine)Use the OverlayFS storage driver (Engine)Use the VFS storage driver (Engine)Use the ZFS storage driver (Engine)Engine: Admin GuideAmazon CloudWatch logs logging driver (Engine)Bind mounts (Engine)Collect Docker metrics with Prometheus (Engine)Configuring and running Docker (Engine)Configuring logging drivers (Engine)Control and configure Docker with systemd (Engine)ETW logging driver (Engine)Fluentd logging driver (Engine)Format command and log output (Engine)Google Cloud logging driver (Engine)Graylog Extended Format (GELF) logging driver (Engine)Journald logging driver (Engine)JSON File logging driver (Engine)Keep containers alive during daemon downtime (Engine)Limit a container's resources (Engine)Link via an ambassador container (Engine)Log tags for logging driver (Engine)Logentries logging driver (Engine)PowerShell DSC usage (Engine)Prune unused Docker objects (Engine)Run multiple services in a container (Engine)Runtime metrics (Engine)Splunk logging driver (Engine)Start containers automatically (Engine)Storage overview (Engine)Syslog logging driver (Engine)tmpfs mountsTroubleshoot volume problems (Engine)Use a logging driver plugin (Engine)Using Ansible (Engine)Using Chef (Engine)Using Puppet (Engine)View a container's logs (Engine)Volumes (Engine)Engine: CLIDaemon CLI reference (dockerd) (Engine)dockerdocker attachdocker builddocker checkpointdocker checkpoint createdocker checkpoint lsdocker checkpoint rmdocker commitdocker configdocker config createdocker config inspectdocker config lsdocker config rmdocker containerdocker container attachdocker container commitdocker container cpdocker container createdocker container diffdocker container execdocker container exportdocker container inspectdocker container killdocker container logsdocker container lsdocker container pausedocker container portdocker container prunedocker container renamedocker container restartdocker container rmdocker container rundocker container startdocker container statsdocker container stopdocker container topdocker container unpausedocker container updatedocker container waitdocker cpdocker createdocker deploydocker diffdocker eventsdocker execdocker exportdocker historydocker imagedocker image builddocker image historydocker image importdocker image inspectdocker image loaddocker image lsdocker image prunedocker image pulldocker image pushdocker image rmdocker image savedocker image tagdocker imagesdocker importdocker infodocker inspectdocker killdocker loaddocker logindocker logoutdocker logsdocker networkdocker network connectdocker network createdocker network disconnectdocker network inspectdocker network lsdocker network prunedocker network rmdocker nodedocker node demotedocker node inspectdocker node lsdocker node promotedocker node psdocker node rmdocker node updatedocker pausedocker plugindocker plugin createdocker plugin disabledocker plugin enabledocker plugin inspectdocker plugin installdocker plugin lsdocker plugin pushdocker plugin rmdocker plugin setdocker plugin upgradedocker portdocker psdocker pulldocker pushdocker renamedocker restartdocker rmdocker rmidocker rundocker savedocker searchdocker secretdocker secret createdocker secret inspectdocker secret lsdocker secret rmdocker servicedocker service createdocker service inspectdocker service logsdocker service lsdocker service psdocker service rmdocker service scaledocker service updatedocker stackdocker stack deploydocker stack lsdocker stack psdocker stack rmdocker stack servicesdocker startdocker statsdocker stopdocker swarmdocker swarm cadocker swarm initdocker swarm joindocker swarm join-tokendocker swarm leavedocker swarm unlockdocker swarm unlock-keydocker swarm updatedocker systemdocker system dfdocker system eventsdocker system infodocker system prunedocker tagdocker topdocker unpausedocker updatedocker versiondocker volumedocker volume createdocker volume inspectdocker volume lsdocker volume prunedocker volume rmdocker waitUse the Docker command line (Engine)Engine: ExtendAccess authorization plugin (Engine)Docker log driver pluginsDocker network driver plugins (Engine)Extending Engine with pluginsManaged plugin system (Engine)Plugin configuration (Engine)Plugins API (Engine)Volume plugins (Engine)Engine: SecurityAppArmor security profiles for Docker (Engine)Automation with content trust (Engine)Content trust in Docker (Engine)Delegations for content trust (Engine)Deploying Notary (Engine)Docker security (Engine)Docker security non-events (Engine)Isolate containers with a user namespace (Engine)Manage keys for content trust (Engine)Play in a content trust sandbox (Engine)Protect the Docker daemon socket (Engine)Seccomp security profiles for Docker (Engine)Secure EngineUse trusted imagesUsing certificates for repository client verification (Engine)Engine: TutorialsEngine tutorialsNetwork containers (Engine)Get StartedPart 1: OrientationPart 2: ContainersPart 3: ServicesPart 4: SwarmsPart 5: StacksPart 6: Deploy your appMachineAmazon Web Services (Machine)Digital Ocean (Machine)docker-machine activedocker-machine configdocker-machine createdocker-machine envdocker-machine helpdocker-machine inspectdocker-machine ipdocker-machine killdocker-machine lsdocker-machine provisiondocker-machine regenerate-certsdocker-machine restartdocker-machine rmdocker-machine scpdocker-machine sshdocker-machine startdocker-machine statusdocker-machine stopdocker-machine upgradedocker-machine urlDriver options and operating system defaults (Machine)Drivers overview (Machine)Exoscale (Machine)Generic (Machine)Get started with a local VM (Machine)Google Compute Engine (Machine)IBM Softlayer (Machine)Install MachineMachineMachine CLI overviewMachine command-line completionMachine concepts and helpMachine overviewMicrosoft Azure (Machine)Microsoft Hyper-V (Machine)Migrate from Boot2Docker to MachineOpenStack (Machine)Oracle VirtualBox (Machine)Provision AWS EC2 instances (Machine)Provision Digital Ocean Droplets (Machine)Provision hosts in the cloud (Machine)Rackspace (Machine)VMware Fusion (Machine)VMware vCloud Air (Machine)VMware vSphere (Machine)NotaryClient configuration (Notary)Common Server and signer configurations (Notary)Getting started with NotaryNotary changelogNotary configuration filesRunning a Notary serviceServer configuration (Notary)Signer configuration (Notary)Understand the service architecture (Notary)Use the Notary client
文字

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

  • 与绑定挂载相比,卷更容易备份或迁移。

  • 您可以使用 Docker CLI 命令或 Docker API 管理卷。

  • 卷在 Linux 和 Windows 容器上均可使用。

  • 卷可以在多个容器之间更安全地共享。

  • 卷驱动程序允许您在远程主机或云提供程序上存储卷,加密卷的内容或添加其他功能。

  • 新卷的内容可以由容器预先填充。

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

如果您的容器生成非持久状态数据,请考虑使用 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 挂载。

  • 了解存储驱动程序。

上一篇:下一篇: