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

Btrfs是下一代的写时复制文件系统,支持许多先进的存储技术,使其非常适合Docker。Btrfs包含在主线Linux内核中。

Docker的btrfs存储驱动程序利用了许多用于映像和容器管理的Btrfs功能。其中包括块级操作,精简配置,写入时复制快照以及易于管理。您可以轻松地将多个物理块设备组合到一个Btrfs文件系统中。

本文将Docker的Btrfs存储驱动程序称为btrfsBtrfs文件系统,并将其作为Btrfs。

注意btrfs存储驱动程序仅在Ubuntu或Debian上的Docker CE和SLES上的Docker EE/CS引擎上受支持。

先决条件

如果您满足以下先决条件,则支持btrfs

  • Docker CE:对于Docker CE,btrfs仅在Ubuntu或Debian上推荐。

  • Docker EE:对于Docker EE和CS-Engine,btrfs仅在SLES上受支持。有关商业支持的Docker的所有支持配置,请参阅产品兼容性表。

  • 更改存储驱动程序将使您已创建的任何容器在本地系统上都不可访问。使用docker save保存的容器,并推动现有图像多克尔集线器或私人仓库,让你不必后重新创建它们。

  • btrfs需要专用的块存储设备,如物理磁盘。该块设备必须格式化为Btrfs并装入/var/lib/docker/。以下配置说明会引导您完成此过程。默认情况下,SLES /文件系统使用BTRFS格式化,因此对于SLES,不需要使用单独的块设备,但出于性能方面的考虑,您可以选择这样做。

  • btrfs支持必须存在于你的内核中。要检查这一点,运行以下命令:$ sudo cat/proc/filesystems | grep btrfs btrfs

  • 要在操作系统级别管理BTRFS文件系统,您需要该btrfs命令。如果您没有此命令,请安装btrfsprogs软件包(SLES)或btrfs-tools软件包(Ubuntu)。

配置Docker以使用btrfs存储驱动程序

此过程在SLES和Ubuntu上基本相同。

  1. 停止Docker。

2. 将/var/lib/docker/内容复制到备份位置,然后清空以下内容/var/lib/docker/

$sudo cp-au/var/lib/docker/var/lib/docker.bk$sudo rm/var/lib/docker/%2A

3. 将您的专用块设备或设备格式化为Btrfs文件系统。这个例子假定你正在使用两个叫做/dev/xvdfand的块设备/dev/xvdg。仔细检查块设备名称,因为这是一种破坏性操作。$ sudo mkfs.btrfs -f /dev/xvdf /dev/xvdg Btrfs还有很多选项,包括striping和RAID。请参阅Btrfs文档。

4. 将新的Btrfs文件系统/var/lib/docker/挂载到挂载点上。您可以指定用于创建Btrfs文件系统的任何块设备。

$ sudo mount -t btrfs /dev/xvdf /var/lib/docker

不要忘记在重新启动时通过添加/etc/fstab条目来使永久更改。

5. 将内容复制/var/lib/docker.bk/var/lib/docker/。$ sudo cp -au /var/lib/docker.bk/* / var / lib / docker /

6. 配置Docker以使用btrfs存储驱动程序。即使/var/lib/docker/现在使用Btrfs文件系统,这也是必需的。编辑或创建文件/etc/docker/daemon.json。如果它是新文件,请添加以下内容。如果它是现有文件,则仅添加键和值,如果它不是结束括号(})前的最后一行,请仔细用逗号结束该行。

{   "storage-driver": "btrfs" }

查看每个存储驱动程序的所有存储选项:

- [Stable](../../../reference/commandline/dockerd/index#storage-driver-options)- [Edge](https://docs.docker.com/edge/engine/reference/commandline/dockerd/#storage-driver-options)
  1. 启动Docker。运行后,验证btrfs是否正在用作存储驱动程序。$ docker info  Containers: 0  Running: 0  Paused: 0  Stopped: 0 Images: 0 Server Version: 17.03.1-ce 存储驱动程序:btrfs 生成版本:Btrfs v4.4 库文件版本:101 <output truncated>

2. 准备好后,请删除/var/lib/docker.bk目录。

管理Btrfs卷

Btrfs的好处之一是可以轻松地管理Btrfs文件系统,而无需卸载文件系统或重新启动Docker。

当空间不足时,Btrfs会自动扩展容量大约1 GB的数据

要将块设备添加到Btrfs卷,请使用btrfs device addbtrfs filesystem balance命令。

$ sudo btrfs device add /dev/svdh /var/lib/docker

$ sudo btrfs filesystem balance /var/lib/docker

注意:虽然可以在Docker运行时执行这些操作,但性能会受到影响。计划停机窗口以平衡Btrfs文件系统可能是最好的。

如何btrfs存储驱动程序作品

btrfs存储驱动器从工作方式不同devicemapper在您的整个或其他存储驱动程序/var/lib/docker/目录存储在增加了Btrfs卷上。

映像和容器层在磁盘上

有关图像图层和可写容器图层的信息存储在/var/lib/docker/btrfs/subvolumes/。该子目录包含每个图像或容器层的一个目录,统一文件系统是从一个图层加上所有其父图层构建的。子卷本质上是写入时复制,并具有从底层存储池按需分配的空间。它们也可以嵌套和快照。下图显示了4个子卷。'Subvolume 2'和'Subvolume 3'是嵌套的,而'Subvolume 4'则显示它自己的内部目录树。

只有图像的基础层被存储为真正的子卷。所有其他图层都存储为快照,只包含该图层中引入的差异。您可以创建快照快照,如下图所示。

在磁盘上,快照的外观与子卷相似,但实际上它们更小巧,更节省空间。写时复制用于最大限度地提高存储效率并最小化层大小,并且容器的可写层中的写入在块级进行管理。下图显示了一个子卷及其快照共享数据。

为了获得最大效率,当容器需要更多空间时,它将以大小约1 GB的分配。

Docker的btrfs存储驱动程序将每个图像层和容器存储在其自己的Btrfs子卷或快照中。图像的基础层存储为子卷,而子图像层和容器存储为快照。这在下图中显示。

在运行btrfs驱动程序的Docker主机上创建映像和容器的高级过程如下所示:

  1. 图像的基础层存储在Btrfs 子卷/var/lib/docker/btrfs/subvolumes

2. 随后的图像层被存储为增加了Btrfs 快照父层的子体积或快照的,但与此层中引入的变化。这些差异存储在块级别。

3. 容器的可写图层是最终图像层的Btrfs快照,运行容器引入了差异。这些差异存储在块级别。容器如何读取和写入btrfs阅读文件的工作容器是图像的空间高效快照。快照中的元数据指向存储池中的实际数据块。这与子卷相同。因此,针对快照执行的读取基本上与针对子卷执行的读取相同。

写入文件

  1. 编写新文件将新文件写入容器会调用按需分配操作以将新数据块分配给容器的快照。该文件然后被写入这个新的空间。按需分配操作对于使用Btrfs进行的所有写入都是原生的,并且与将新数据写入子卷相同。因此,将新文件写入容器的快照以本地Btrfs速度运行。

  • 修改现有文件:更新容器中的现有文件是写时复制操作(redirect-on-write是Btrfs术语)。原始数据是从文件当前存在的层读取的,只有修改后的块才写入容器的可写层。接下来,Btrfs驱动程序更新快照中的文件系统元数据以指向这个新数据。这种行为的开销很小。

  • 删除文件或目录:如果容器删除存在于较低层的文件或目录,则Btrfs会掩盖较低层中文件或目录的存在。如果一个容器创建一个文件然后将其删除,则此操作在Btrfs文件系统中执行,并且空间被回收。

使用Btrfs时,编写和更新大量小文件可能会导致性能下降。

Btrfs和Docker性能

影响Docker在btrfs存储驱动程序下的性能有几个因素。

注意:通过将Docker卷用于写入繁重的工作负载,而不是依赖将数据存储在容器的可写层中,可以缓解这些因素中的许多因素。然而,在增加了Btrfs的情况下,多克尔量仍将从这些画中后卫吃亏,除非/var/lib/docker/volumes/通过增加了Btrfs支持。

  • 页面缓存。Btrfs不支持页面缓存共享。这意味着访问相同文件的每个进程都将文件复制到Docker主机的内存中。因此,btrfs驱动程序可能不是PaaS等高密度用例的最佳选择。

  • 小写。执行大量小写操作的容器(此使用模式与在短时间内启动和停止很多容器时发生的情况相匹配)可能导致Btrfs块的使用不当。这可能会过早地填充Btrfs文件系统并导致Docker主机出现空间不足的情况。使用btrfs filesys show您必须密切监控增加了Btrfs设备上的可用空间量。

  • 顺序写入。写入磁盘时,Btrfs使用日志记录技术。这会影响顺序写入的性能,最多可将性能降低50%。

  • 碎片化。碎片是Btrfs等写入时复制文件系统的自然副产品。许多小型随机写入可能会增加此问题。碎片化可能表现为使用SSD时的CPU峰值或使用旋转磁盘时的磁头颠簸。这些问题都会损害性能。

如果您的Linux内核版本为3.9或更高版本,则可以autodefrag在安装Btrfs卷时启用该功能。在将其部署到生产环境之前,请先在自己的工作负载上测试此功能,因为有些测试显示对性能有负面影响。

  • SSD性能:Btrfs包含SSD介质的本机优化。要启用这些功能,请使用-o ssd安装选项安装Btrfs文件系统。这些优化包括通过避免优化(例如不适用于固态介质的搜索优化)来增强SSD写入性能。

  • 平衡Btrfs文件系统经常:使用操作系统实用程序(如cron作业)在非高峰时段定期平衡Btrfs文件系统。这回收未分配的块,并有助于防止文件系统不必要的填满。除非将其他物理块设备添加到文件系统,否则无法重新平衡完全完整的Btrfs文件系统。查看BTRFS Wiki。

  • 使用快速存储:固态硬盘(SSD)比旋转磁盘提供更快的读取和写入速度。

  • 将卷用于写入繁重的工作负载:卷为写入繁重的工作负载提供最佳和最可预测的性能。这是因为它们绕过了存储驱动程序,并且不会产生精简配置和写入时复制引入的任何潜在开销。卷还有其他好处,例如允许您在容器之间共享数据,并且即使在没有正在运行的容器正在使用它们时也会持久存在。

相关信息

  • 了解图像,容器和存储驱动程序

  • 选择存储驱动程序

  • AUFS存储驱动程序在实践中

  • 设备Mapper存储驱动程序在实践中的应用

Previous article: Next article: