directory search
Compose About 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 bundle docker-compose config docker-compose create docker-compose down docker-compose events docker-compose exec docker-compose help docker-compose images docker-compose kill docker-compose logs docker-compose pause docker-compose port docker-compose ps docker-compose pull docker-compose push docker-compose restart docker-compose rm docker-compose run docker-compose scale docker-compose start docker-compose stop docker-compose top docker-compose unpause docker-compose up Environment file (Compose) Environment variables in Compose Extend services in Compose Frequently asked questions (Compose) Getting started (Compose) Install Compose Link environment variables (deprecated) (Compose) Networking in Compose Overview of Docker Compose Overview of docker-compose CLI Quickstart: Compose and WordPress Rails and PostgreSQL (Compose) Sample apps with Compose Using Compose in production Using Compose with Swarm Engine .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-ng Best 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 network Delete the service (Engine) Deploy a service (Engine) Deploy services to a swarm (Engine) Deprecated Engine features Docker container networking (Engine) Docker overview (Engine) Docker run reference (Engine) Dockerfile reference (Engine) Dockerize an application Drain a node (Engine) Engine FAQ (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.10 Optional Linux post-installation steps (Engine) Overview (Engine) PostgreSQL (Engine) Raft consensus in swarm mode (Engine) Riak (Engine) Run Docker Engine in swarm mode Scale 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 Guide Amazon 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 mounts Troubleshoot 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: CLI Daemon CLI reference (dockerd) (Engine) docker docker attach docker build docker checkpoint docker checkpoint create docker checkpoint ls docker checkpoint rm docker commit docker config docker config create docker config inspect docker config ls docker config rm docker container docker container attach docker container commit docker container cp docker container create docker container diff docker container exec docker container export docker container inspect docker container kill docker container logs docker container ls docker container pause docker container port docker container prune docker container rename docker container restart docker container rm docker container run docker container start docker container stats docker container stop docker container top docker container unpause docker container update docker container wait docker cp docker create docker deploy docker diff docker events docker exec docker export docker history docker image docker image build docker image history docker image import docker image inspect docker image load docker image ls docker image prune docker image pull docker image push docker image rm docker image save docker image tag docker images docker import docker info docker inspect docker kill docker load docker login docker logout docker logs docker network docker network connect docker network create docker network disconnect docker network inspect docker network ls docker network prune docker network rm docker node docker node demote docker node inspect docker node ls docker node promote docker node ps docker node rm docker node update docker pause docker plugin docker plugin create docker plugin disable docker plugin enable docker plugin inspect docker plugin install docker plugin ls docker plugin push docker plugin rm docker plugin set docker plugin upgrade docker port docker ps docker pull docker push docker rename docker restart docker rm docker rmi docker run docker save docker search docker secret docker secret create docker secret inspect docker secret ls docker secret rm docker service docker service create docker service inspect docker service logs docker service ls docker service ps docker service rm docker service scale docker service update docker stack docker stack deploy docker stack ls docker stack ps docker stack rm docker stack services docker start docker stats docker stop docker swarm docker swarm ca docker swarm init docker swarm join docker swarm join-token docker swarm leave docker swarm unlock docker swarm unlock-key docker swarm update docker system docker system df docker system events docker system info docker system prune docker tag docker top docker unpause docker update docker version docker volume docker volume create docker volume inspect docker volume ls docker volume prune docker volume rm docker wait Use the Docker command line (Engine) Engine: Extend Access authorization plugin (Engine) Docker log driver plugins Docker network driver plugins (Engine) Extending Engine with plugins Managed plugin system (Engine) Plugin configuration (Engine) Plugins API (Engine) Volume plugins (Engine) Engine: Security AppArmor 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 Engine Use trusted images Using certificates for repository client verification (Engine) Engine: Tutorials Engine tutorials Network containers (Engine) Get Started Part 1: Orientation Part 2: Containers Part 3: Services Part 4: Swarms Part 5: Stacks Part 6: Deploy your app Machine Amazon Web Services (Machine) Digital Ocean (Machine) docker-machine active docker-machine config docker-machine create docker-machine env docker-machine help docker-machine inspect docker-machine ip docker-machine kill docker-machine ls docker-machine provision docker-machine regenerate-certs docker-machine restart docker-machine rm docker-machine scp docker-machine ssh docker-machine start docker-machine status docker-machine stop docker-machine upgrade docker-machine url Driver 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 Machine Machine Machine CLI overview Machine command-line completion Machine concepts and help Machine overview Microsoft Azure (Machine) Microsoft Hyper-V (Machine) Migrate from Boot2Docker to Machine OpenStack (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) Notary Client configuration (Notary) Common Server and signer configurations (Notary) Getting started with Notary Notary changelog Notary configuration files Running a Notary service Server configuration (Notary) Signer configuration (Notary) Understand the service architecture (Notary) Use the Notary client
characters

卷是持久化由 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 挂载。

  • 了解存储驱动程序。

Previous article: Next article: