目录搜索
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
文字

ZFS是下一代文件系统,支持许多高级存储技术,如卷管理,快照,校验和,压缩和重复数据删除,复制等。

它由Sun Microsystems(现在是Oracle Corporation)创建,并且根据CDDL许可证开源。由于CDDL和GPL之间的许可不兼容,ZFS不能作为主线Linux内核的一部分发货。但是,ZFS On Linux(ZoL)项目提供了可以单独安装的树外内核模块和用户空间工具。

Linux(ZoL)端口上的ZFS健康且成熟。但是,目前不推荐使用zfsDocker存储驱动程序进行生产使用,除非您在Linux上拥有丰富的ZFS经验。

注意:在Linux平台上还有一个ZFS的FUSE实现。这不被推荐。本地ZFS驱动程序(ZoL)经过更多测试,性能更高,使用更广泛。本文档的其余部分涉及本地ZoL端口。

先决条件

  • ZFS需要一个或多个专用块设备,最好是固态驱动器(SSD)。

  • ZFS仅支持泊坞CE与Ubuntu 14.04或更高版本,与zfs包(16.04及更高版本)或zfs-nativeubuntu-zfs已安装的软件包(14.04)。

    • 对于Ubuntu 14.04,您需要先启用补充软件包存储库,ppa:zfs-native/stable然后才能安装软件包。有关说明,请参阅https://launchpad.net/~zfs-native/+archive/ubuntu/stable。

  • Docker EE或CS-Engine或任何其他Linux平台不支持ZFS。

  • /var/lib/docker/目录必须安装在ZFS格式的文件系统上。

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

使用zfs存储驱动程序配置Docker

  1. 停止Docker。

  2. 将内容复制/var/lib/docker//var/lib/docker.bk并删除内容/var/lib/docker/。$ sudo cp -au /var/lib/docker /var/lib/docker.bk  $ sudo rm -rf /var/lib/docker/*

  3. zpool在您的专用块设备或设备上创建一个新的,并将其安装到/var/lib/docker/。确保你已经指定了正确的设备,因为这是一个破坏性的操作。此示例将两个设备添加到池中。$ sudo zpool create -f zpool-docker -m /var/lib/docker /dev/xvdf /dev/xvdg该命令创建zpool并命名它zpool-docker。该名称仅用于显示目的,您可以使用不同的名称。检查池是否使用正确创建和安装zfs list。$ sudo zfs list  NAME           USED  AVAIL  REFER  MOUNTPOINT zpool-docker    55K  96.4G    19K  /var/lib/docker

  4. 配置Docker以使用zfs。编辑/etc/docker/daemon.json并设置storage-driverzfs。如果该文件之前为空,它现在应该如下所示:{“storage-driver”:“zfs”}保存并关闭文件。

  5. 启动Docker。使用docker info验证存储驱动程序zfs。$ sudo docker信息容器:0正在运行:0已暂停:0已停止:0图像:0服务器版本:17.03.1-ce存储驱动程序:zfs Zpool:zpool-docker Zpool运行状况:ONLINE父数据集:zpool-docker父级使用的空间:249856可用空间:103498395648父配额:否压缩:关闭<output truncated>

管理 zfs

增加正在运行的设备的容量

要增加大小zpool,您需要将专用块设备添加到Docker主机,然后将其添加到zpool使用zpool add命令:

$ sudo zpool add zpool-docker /dev/xvdh

限制容器的可写入存储配额

如果要基于每个image?dataset集实现配额,可以设置size存储选项以限制单个容器可用于其可写层的空间量。

编辑/etc/docker/daemon.json并添加以下内容:

{  "storage-driver": "zfs",  "storage-opts": ["size=256M"]}

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

  • Stable

  • Edge

保存并关闭文件,然后重新启动Docker。

如何zfs存储驱动程序作品

ZFS使用以下对象:

  • 文件系统:精简配置,zpool按需分配空间。

  • 快照:文件系统的只读空间有效时间点拷贝。

  • 克隆:快照的读写副本。用于存储与上一层的差异。

创建一个克隆的过程:



  1. 从文件系统创建只读快照。

  2. 从快照创建可写克隆。这包含与父层的任何差异。

文件系统,快照和克隆都从底层分配空间zpool

映像和容器层在磁盘上

每个正在运行的容器的统一文件系统都安装在一个安装点上/var/lib/docker/zfs/graph/。继续阅读以获得关于统一文件系统组成的解释。

图像分层和共享

图像的基础层是ZFS文件系统。每个子图层都是基于ZFS下方图层的ZFS快照。容器是基于ZFS快照的ZFS快照,该ZFS快照是从创建映像的顶层开始的。

下图显示了如何将这与基于双层图像的正在运行的容器放在一起。



当你启动一个容器时,以下步骤按顺序进行:

  1. 图像的基础层作为ZFS文件系统存在于Docker主机上。

  2. 其他图像层是直接位于其下方的图像层的数据集的克隆。在该图中,通过获取基础层的ZFS快照并从该快照创建克隆来添加“第1层”。该克隆是可写的,并从zpool消耗按需空间。快照是只读的,将基本层保持为不可变对象。

  3. 当容器启动时,图像上方会添加一个可写图层。在该图中,容器的读写层是通过制作图像顶层(第1层)的快照并从该快照创建克隆来创建的。

  4. 当容器修改其可写层的内容时,将为已更改的块分配空间。默认情况下,这些块是128k。

容器读取和写入的工作方式 zfs

读取文件

每个容器的可写层都是一个ZFS克隆,它将其所有数据与其创建的数据集(其父层的快照)共享。即使正在读取的数据来自深层,读操作也是最快的。

编写文件

编写一个新文件:根据需要从底层分配空间zpool,并将块直接写入容器的可写层。

修改现有文件:只为已更改的块分配空间,并使用写时复制(CoW)策略将这些块写入容器的可写层。这可以最大限度地减小图层的大小并提高写入性能。

删除文件或目录

  • 当删除存在于较低层的文件或目录时,即使文件或目录仍然存在于较低的只读层中,ZFS驱动程序也会掩盖该容器可写层中的文件或目录的存在。

  • 如果您创建并删除容器可写层中的文件或目录,则块将被回收zpool

ZFS和Docker性能

有几个因素会影响Docker使用zfs存储驱动程序的性能。

  • 内存:内存对ZFS性能有重大影响。ZFS最初设计用于具有大量内存的大型企业级服务器。

  • ZFS特性:ZFS包含重复数据删除功能。使用此功能可能会节省磁盘空间,但会占用大量内存。建议您停用zpoolDocker使用的此功能,除非您使用SAN,NAS或其他硬件RAID技术。

  • ZFS缓存:ZFS将磁盘块缓存在称为自适应替换缓存(ARC)的内存结构中。ZFS 的Single Copy ARC功能允许一个块的单个缓存副本由a的多个克隆共享使用此功能,多个运行中的容器可以共享一个缓存块的单个副本。此功能使ZFS成为PaaS和其他高密度用例的理想选择。

  • 碎片:碎片是ZFS等写入时复制文件系统的自然副产品。ZFS通过使用128k的小块来缓解这种情况。ZFS意向日志(ZIL)和写入合并(延迟写入)也有助于减少碎片。您可以使用监视碎片zfs status。但是,如果不重新格式化和恢复文件系统,则无法对ZFS进行碎片整理。

  • 使用适用于Linux的本机ZFS驱动程序:由于性能较差,不建议使用ZFS FUSE实施。

性能最佳实践

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

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

上一篇:下一篇: