亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

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構(gòu)建) 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

OverlayFS是與AUFS類似的現(xiàn)代聯(lián)合文件系統(tǒng),但速度更快,實現(xiàn)更簡單。Docker為OverlayFS提供了一個存儲驅(qū)動程序。

本主題將Linux內(nèi)核驅(qū)動程序稱為OverlayFSDocker存儲驅(qū)動程序,overlay或稱為Docker存儲驅(qū)動程序overlay2。

注意:如果您使用OverlayFS,請使用overlay2驅(qū)動程序而不是overlay驅(qū)動程序,因為它在inode利用率方面效率更高。要使用新的驅(qū)動程序,您需要4.0版或更高版本的Linux內(nèi)核。有關(guān)overlayvs 之間差異的更多信息overlay2,請參閱選擇存儲驅(qū)動程序。

先決條件

如果您滿足以下先決條件,則支持OverlayFS:

  • 僅限D(zhuǎn)ocker CE。Docker EE不支持OverlayFS。有關(guān)每個Docker EE平臺支持的存儲驅(qū)動程序列表,請參閱產(chǎn)品兼容性列表。

  • 版本4.0或更高版本的Linux內(nèi)核。如果您使用較舊的內(nèi)核,則需要使用該overlay驅(qū)動程序,這是不推薦的。

  • 支持以下支持文件系統(tǒng):

    • ext4 (僅限RHEL 7.1)

    • xfs(RHEL 7.2和更高版本),但僅限于d_type=true啟用。使用xfs_info驗證ftype選項設(shè)置為1。要xfs正確格式化文件系統(tǒng),請使用標志-n ftype=1。

  • 更改存儲驅(qū)動程序?qū)⑹鼓褎?chuàng)建的任何容器在本地系統(tǒng)上都不可訪問。使用docker save保存的容器,并推動現(xiàn)有圖像多克爾集線器或私人倉庫,讓你不必后重新創(chuàng)建它們。

使用overlayoverlay2存儲驅(qū)動程序配置Docker

要將Docker配置為使用overlay存儲驅(qū)動程序,Docker主機必須運行Linux內(nèi)核版本3.18(最好更新),并加載覆蓋內(nèi)核模塊。對于overlay2驅(qū)動程序,你的內(nèi)核版本必須是4.0或更新。強烈建議您overlay2盡可能使用。

在執(zhí)行此過程之前,您必須先滿足所有先決條件。

  1. 停止Docker。$ sudo systemctl停止docker

  2. 將內(nèi)容復(fù)制/var/lib/docker到臨時位置。$ cp -au /var/lib/docker /var/lib/docker.bk

  3. 如果您想使用所使用的備份文件系統(tǒng)/var/lib/,請格式化文件系統(tǒng)并將其裝入/var/lib/docker。請確保將此掛載添加/etc/fstab到永久。

  4. 編輯/etc/docker/daemon.json。如果它還不存在,請創(chuàng)建它。假設(shè)文件為空,請?zhí)砑右韵聝?nèi)容。{“storage-driver”:“overlay2”}如果您需要使用舊版overlay驅(qū)動程序,請改為指定它。要overlay2在CentOS(僅限D(zhuǎn)ocker CE)上使用,還必須設(shè)置存儲選項overlay2.override_kernel_check。在這種情況下,daemon.json將如下所示:{   "storage-driver": "overlay2",   "storage-opts":      "overlay2.override_kernel_check=true"    }查看每個存儲驅(qū)動程序的所有存儲選項:

- [Stable](../../../reference/commandline/dockerd/index#storage-driver-options)- [Edge](https://docs.docker.com/edge/engine/reference/commandline/dockerd/#storage-driver-options)

如果daemon.json文件包含格式錯誤的JSON,Docker將無法啟動。

  1. 啟動Docker。$ sudo systemctl啟動docker

  2. 驗證守護進程正在使用overlay/ overlay2storage驅(qū)動程序。使用該docker info命令并查找Storage DriverBacking filesystem。$ docker info容器:0映像:0存儲驅(qū)動程序:overlay備份文件系統(tǒng):extfs <output truncated>

Docker現(xiàn)在使用overlay2存儲驅(qū)動程序。泊塢窗已自動創(chuàng)建overlay與所需的安裝lowerdir,upperdir,merged,和workdir結(jié)構(gòu)。

繼續(xù)閱讀以了解OverlayFS如何在Docker容器中工作的詳細信息,以及有關(guān)與不同支持文件系統(tǒng)兼容的限制的性能建議和信息。

overlay2drivers如何工作

如果您仍在使用overlay驅(qū)動程序而不是overlay2,請參閱覆蓋驅(qū)動程序如何工作。

OverlayFS將單個Linux主機上的兩個目錄分層并將它們呈現(xiàn)為單個目錄。這些目錄稱為圖層,統(tǒng)一過程稱為聯(lián)合裝載。OverlayFS將下部目錄稱為lowerdir上部目錄upperdir。統(tǒng)一視圖通過自己的目錄公開merged。

雖然overlay驅(qū)動程序只能使用一個較低的OverlayFS層,因此需要硬鏈接來實現(xiàn)多層圖像,但該overlay2驅(qū)動程序本身最多支持128個較低的OverlayFS層。此功能為和層相關(guān)的Docker命令(如docker buildand)提供更好的性能docker commit,并且在后備文件系統(tǒng)上占用更少的inode。

映像和容器層在磁盤上

使用下載五層圖像后docker pull ubuntu,您可以看到六個目錄/var/lib/docker/overlay2。

警告:不要直接操作其中的任何文件或目錄/var/lib/docker/。這些文件和目錄由Docker管理。

$ ls -l /var/lib/docker/overlay2

total 24drwx------ 5 root root 4096 Jun 20 07:36 223c2864175491657d238e2664251df13b63adb8d050924fd1bfcdb278b866f7
drwx------ 3 root root 4096 Jun 20 07:36 3a36935c9df35472229c57f4a27105a136f5e4dbef0f87905b2e506e494e348b
drwx------ 5 root root 4096 Jun 20 07:36 4e9fa83caff3e8f4cc83693fa407a4a9fac9573deaf481506c102d484dd1e6a1
drwx------ 5 root root 4096 Jun 20 07:36 e8876a226237217ec61c4baf238a32992291d059fdac95ed6303bdff3f59cff5
drwx------ 5 root root 4096 Jun 20 07:36 eca1e4e1694283e001f200a667bb3cb40853cf2d1b12c29feda7422fed78afed
drwx------ 2 root root 4096 Jun 20 07:36 l

新的l(小寫L)目錄包含縮短的層標識符作為符號鏈接。這些標識符用于避免觸及mount命令參數(shù)的頁面大小限制。

$ ls -l /var/lib/docker/overlay2/l

total 20lrwxrwxrwx 1 root root 72 Jun 20 07:36 6Y5IM2XC7TSNIJZZFLJCS6I4I4 -> ../3a36935c9df35472229c57f4a27105a136f5e4dbef0f87905b2e506e494e348b/diff
lrwxrwxrwx 1 root root 72 Jun 20 07:36 B3WWEFKBG3PLLV737KZFIASSW7 -> ../4e9fa83caff3e8f4cc83693fa407a4a9fac9573deaf481506c102d484dd1e6a1/diff
lrwxrwxrwx 1 root root 72 Jun 20 07:36 JEYMODZYFCZFYSDABYXD5MF6YO -> ../eca1e4e1694283e001f200a667bb3cb40853cf2d1b12c29feda7422fed78afed/diff
lrwxrwxrwx 1 root root 72 Jun 20 07:36 NFYKDW6APBCCUCTOUSYDH4DXAT -> ../223c2864175491657d238e2664251df13b63adb8d050924fd1bfcdb278b866f7/diff
lrwxrwxrwx 1 root root 72 Jun 20 07:36 UL2MW33MSE3Q5VYIKBRN4ZAGQP -> ../e8876a226237217ec61c4baf238a32992291d059fdac95ed6303bdff3f59cff5/diff

最下層包含一個名為的文件link,其中包含縮短標識符的名稱,以及一個名為diff其中包含圖層內(nèi)容的目錄。

$ ls /var/lib/docker/overlay2/3a36935c9df35472229c57f4a27105a136f5e4dbef0f87905b2e506e494e348b/diff  link

$ cat /var/lib/docker/overlay2/3a36935c9df35472229c57f4a27105a136f5e4dbef0f87905b2e506e494e348b/link

6Y5IM2XC7TSNIJZZFLJCS6I4I4

$ ls  /var/lib/docker/overlay2/3a36935c9df35472229c57f4a27105a136f5e4dbef0f87905b2e506e494e348b/diff

bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

次低層和每個高層包含一個名為的文件lower,它表示其父文件,以及一個名為diff其中包含其內(nèi)容的目錄。它還包含一個merged目錄,該目錄包含其父層和其自身的統(tǒng)一內(nèi)容以及work由OverlayFS內(nèi)部使用的目錄。

$ ls /var/lib/docker/overlay2/223c2864175491657d238e2664251df13b63adb8d050924fd1bfcdb278b866f7

diff  link  lower  merged  work

$ cat /var/lib/docker/overlay2/223c2864175491657d238e2664251df13b63adb8d050924fd1bfcdb278b866f7/lower

l/6Y5IM2XC7TSNIJZZFLJCS6I4I4

$ ls /var/lib/docker/overlay2/223c2864175491657d238e2664251df13b63adb8d050924fd1bfcdb278b866f7/diff/etc  sbin  usr  var

要查看在overlayDocker中使用存儲驅(qū)動程序時存在的安裝,請使用該mount命令。為了可讀性,下面的輸出被截斷。

$ mount | grep overlay

overlay on /var/lib/docker/overlay2/9186877cdf386d0a3b016149cf30c208f326dca307529e646afce5b3f83f5304/merged
type overlay (rw,relatime,lowerdir=l/DJA75GUWHWG7EWICFYX54FIOVT:l/B3WWEFKBG3PLLV737KZFIASSW7:l/JEYMODZYFCZFYSDABYXD5MF6YO:l/UL2MW33MSE3Q5VYIKBRN4ZAGQP:l/NFYKDW6APBCCUCTOUSYDH4DXAT:l/6Y5IM2XC7TSNIJZZFLJCS6I4I4,upperdir=9186877cdf386d0a3b016149cf30c208f326dca307529e646afce5b3f83f5304/diff,workdir=9186877cdf386d0a3b016149cf30c208f326dca307529e646afce5b3f83f5304/work)

rw在第二行示出了overlay安裝件是可讀寫的。

overlay driver如何工作

此內(nèi)容僅適用于overlay驅(qū)動程序。Docker建議使用overlay2驅(qū)動程序,其工作方式不同。請參閱overlay2驅(qū)動程序的工作原理overlay2。

OverlayFS將單個Linux主機上的兩個目錄分層并將它們呈現(xiàn)為單個目錄。這些目錄被稱為圖層,并且統(tǒng)一過程被稱為聯(lián)合安裝。OverlayFS將下部目錄稱為lowerdir上部目錄a upperdir。統(tǒng)一視圖通過自己的目錄公開merged。

下圖顯示了Docker鏡像和Docker容器如何分層。圖像層是lowerdir和容器層是upperdir。統(tǒng)一視圖通過一個名為的目錄公開,該目錄merged實際上是容器的裝載點。該圖顯示了Docker構(gòu)造如何映射到OverlayFS構(gòu)造。



在圖像圖層和容器圖層包含相同文件的情況下,容器圖層會“wins”并遮擋圖像圖層中相同文件的存在。

overlay驅(qū)動程序僅適用于兩層。這意味著多層圖像不能實現(xiàn)為多個OverlayFS圖層。相反,每個圖像層都被實現(xiàn)為其自己的目錄下/var/lib/docker/overlay。然后使用硬鏈接作為空間高效的方式來引用與較低層共享的數(shù)據(jù)。從Docker 1.10開始,圖像層ID不再對應(yīng)于中的目錄名稱/var/lib/docker/。

為了創(chuàng)建容器,overlay驅(qū)動程序?qū)⒈硎緢D像頂層的目錄和容器的新目錄結(jié)合起來。圖像的頂層是lowerdir覆蓋圖中的,并且是只讀的。容器的新目錄upperdir是可寫的。

映像和容器層在磁盤上

以下docker pull命令顯示了一個Docker主機下載一個包含五層的Docker鏡像。

$ docker pull ubuntu

Using default tag: latest
latest: Pulling from library/ubuntu

5ba4f30e5bea: Pull complete
9d7d19c9dc56: Pull complete
ac6ad7efd0f9: Pull complete
e7491a747824: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:46fb5d001b88ad904c5c732b086b596b92cfb4a4840a3abd0e35dbb6870585e4
Status: Downloaded newer image for ubuntu:latest

圖像層

每個圖像層都有自己的目錄/var/lib/docker/overlay/,其中包含其內(nèi)容,如下所示。圖像層ID不對應(yīng)于目錄ID。

警告:不要直接操作其中的任何文件或目錄/var/lib/docker/。這些文件和目錄由Docker管理。

$ ls -l /var/lib/docker/overlay/total 20drwx------ 3 root root 4096 Jun 20 16:11 38f3ed2eac129654acef11c32670b534670c3a06e483fce313d72e3e0a15baa8
drwx------ 3 root root 4096 Jun 20 16:11 55f1e14c361b90570df46371b20ce6d480c434981cbda5fd68c6ff61aa0a5358
drwx------ 3 root root 4096 Jun 20 16:11 824c8a961a4f5e8fe4f4243dab57c5be798e7fd195f6d88ab06aea92ba931654
drwx------ 3 root root 4096 Jun 20 16:11 ad0fe55125ebf599da124da175174a4b8c1878afe6907bf7c78570341f308461
drwx------ 3 root root 4096 Jun 20 16:11 edab9b5e5bf73f2997524eebeac1de4cf9c8b904fa8ad3ec43b3504196aa3801

圖像層目錄包含該層獨有的文件以及與較低層共享的數(shù)據(jù)的硬鏈接。這可以有效利用磁盤空間。

$ ls -i /var/lib/docker/overlay/38f3ed2eac129654acef11c32670b534670c3a06e483fce313d72e3e0a15baa8/root/bin/ls19793696 /var/lib/docker/overlay/38f3ed2eac129654acef11c32670b534670c3a06e483fce313d72e3e0a15baa8/root/bin/ls

$ ls -i /var/lib/docker/overlay/55f1e14c361b90570df46371b20ce6d480c434981cbda5fd68c6ff61aa0a5358/root/bin/ls19793696 /var/lib/docker/overlay/55f1e14c361b90570df46371b20ce6d480c434981cbda5fd68c6ff61aa0a5358/root/bin/ls

容器層

容器也存在于Docker主機文件系統(tǒng)的磁盤中/var/lib/docker/overlay/。如果使用該ls -l命令列出正在運行的容器的子目錄,則存在三個目錄和一個文件:

$ ls -l /var/lib/docker/overlay/<directory-of-running-container>total 16-rw-r--r-- 1 root root   64 Jun 20 16:39 lower-id
drwxr-xr-x 1 root root 4096 Jun 20 16:39 merged
drwxr-xr-x 4 root root 4096 Jun 20 16:39 upper
drwx------ 3 root root 4096 Jun 20 16:39 work

lower-id文件包含容器所基于的圖像頂層的ID,即OverlayFS lowerdir

$ cat /var/lib/docker/overlay/ec444863a55a9f1ca2df72223d459c5d940a721b2288ff86a3f27be28b53be6c/lower-id

55f1e14c361b90570df46371b20ce6d480c434981cbda5fd68c6ff61aa0a5358

upper目錄包含容器的讀寫層的內(nèi)容,該層對應(yīng)于OverlayFS upperdir。

merged目錄是lowerdirand 的聯(lián)合裝載upperdir,它包含正在運行的容器內(nèi)的文件系統(tǒng)的視圖。

work目錄在OverlayFS內(nèi)部。

要查看在overlayDocker中使用存儲驅(qū)動程序時存在的安裝,請使用mount命令。為了可讀性,下面的輸出被截斷。

$ mount | grep overlay

overlay on /var/lib/docker/overlay/ec444863a55a.../merged
type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay/55f1e14c361b.../root,upperdir=/var/lib/docker/overlay/ec444863a55a.../upper,workdir=/var/lib/docker/overlay/ec444863a55a.../work)

rw在第二行示出了overlay安裝件是可讀寫的。

容器讀取和寫入的工作方式overlayoverlay2

讀取文件

考慮三種場景,其中一個容器打開一個文件進行重疊讀取訪問。

  • 該文件不存在于容器層中:如果容器打開一個文件進行讀取訪問,并且該文件尚不存在于容器(upperdir)中,則從圖像中讀取該文件(lowerdir)這會導(dǎo)致很少的性能開銷。

  • 該文件只存在于容器層中:如果容器打開文件以進行讀取訪問,并且文件存在于容器(upperdir)中而不存在于image(lowerdir)中,則直接從容器中讀取文件。

  • 該文件同時存在于容器圖層和圖像圖層中:如果容器打開一個用于讀取訪問的文件,并且該文件存在于圖像圖層和容器圖層中,則讀取容器圖層中的文件版本。容器圖層(upperdir)中的文件在圖像圖層(lowerdir)中隱藏具有相同名稱的文件。

修改文件或目錄

考慮一些容器中的文件被修改的場景。

  • 第一次寫入文件:容器首次寫入現(xiàn)有文件時,該文件不存在于容器(upperdir)中。的overlay/ overlay2驅(qū)動程序執(zhí)行一個copy_up操作將文件從圖像(復(fù)制lowerdir)到所述容器(upperdir)。容器然后將更改寫入容器層中的文件的新副本。但是,OverlayFS在文件級別而不是塊級別上工作。這意味著所有OverlayFS copy_up操作都會復(fù)制整個文件,即使\文件非常大并且只有一小部分被修改。這可能會對容器寫入性能產(chǎn)生顯著影響。但是,有兩件事值得注意:

-  The copy\_up operation only occurs the first time a given file is written to. Subsequent writes to the same file operate against the copy of the file already copied up to the container.
-  OverlayFS only works with two layers. This means that performance should be better than AUFS, which can suffer noticeable latencies when searching for files in images with many layers. This advantage applies to both `overlay` and `overlay2` drivers. `overlayfs2` will be slightly less performant than `overlayfs` on initial read, because it has to look through more layers, but it caches the results so this is only a small penalty.
  • 刪除文件和目錄

-  When a _file_ is deleted within a container, a _whiteout_ file is created in the container (`upperdir`). The version of the file in the image layer (`lowerdir`) is not deleted (because the `lowerdir` is read-only). However, the whiteout file prevents it from being available to the container.
-  When a _directory_ is deleted within a container, an _opaque directory_ is created within the container (`upperdir`). This works in the same way as a whiteout file and effectively prevents the directory from being accessed, even though it still exists in the image (`lowerdir`).
  • 重命名目錄rename(2)僅當源路徑和目標路徑位于頂層時,才允許調(diào)用目錄。否則,它會返回EXDEV錯誤(“不允許跨設(shè)備鏈接”)。您的應(yīng)用程序需要被設(shè)計為處理EXDEV并回退到“復(fù)制和取消鏈接”策略。

OverlayFS和Docker性能

這兩個overlay2overlay驅(qū)動程序比aufs和更高性能devicemapper。在某些情況下,overlay2可能表現(xiàn)更好btrfs。但是,請注意以下細節(jié)。

  • 頁面緩存。OverlayFS支持頁面緩存共享。訪問同一文件的多個容器共享該文件的單個頁面緩存條目。這使得內(nèi)存驅(qū)動程序overlayoverlay2驅(qū)動程序更加高效,并且適用于高密度用例(如PaaS)。

  • copy_up。與AUFS一樣,只要容器首次寫入文件,OverlayFS就必須執(zhí)行復(fù)制操作。這可能會延遲寫入操作,特別是對于大型文件。但是,一旦文件被復(fù)制完畢,后續(xù)對該文件的所有寫入都會發(fā)生在上層,而不需要進一步的復(fù)制操作。OverlayFS copy_up操作比AUFS操作要快,因為AUFS支持的層數(shù)多于OverlayFS,并且如果搜索很多AUFS層,可能會產(chǎn)生更大的延遲。overlay2同樣支持多個圖層,但可以緩解高速緩存中的任何性能。

  • Inode限制。使用overlay存儲驅(qū)動程序會導(dǎo)致過多的inode消耗。在Docker主機上存在大量圖像和容器時尤其如此。增加文件系統(tǒng)可用的inode數(shù)量的唯一方法是重新格式化它。為避免遇到此問題,強烈建議您overlay2盡可能使用。

性能的最佳實踐

以下通用性能最佳實踐也適用于OverlayFS。

  • 使用快速存儲:固態(tài)硬盤(SSD)比旋轉(zhuǎn)磁盤提供更快的讀取和寫入速度。

  • 將卷用于寫入繁重的工作負載:卷為寫入繁重的工作負載提供最佳和最可預(yù)測的性能。這是因為它們繞過了存儲驅(qū)動程序,并且不會產(chǎn)生精簡配置和寫入時復(fù)制引入的任何潛在開銷。卷還有其他好處,例如允許您在容器之間共享數(shù)據(jù),并且即使在沒有正在運行的容器正在使用它們時也會持久存在。

OverlayFS兼容性的限制

總結(jié)OverlayFS與其他文件系統(tǒng)不兼容的方面:

  • open(2):OverlayFS只實現(xiàn)POSIX標準的一個子集。這可能導(dǎo)致某些OverlayFS操作違反POSIX標準。一種這樣的操作是復(fù)制操作。假設(shè)你的應(yīng)用程序調(diào)用fd1=open("foo", O_RDONLY),然后fd2=open("foo", O_RDWR)。在這種情況下,您的應(yīng)用程序期望fd1fd2引用同一個文件。但是,由于第二次調(diào)用后發(fā)生的復(fù)制操作,open(2)描述符引用不同的文件。的fd1繼續(xù)引用該文件的圖像(在lowerdir)和fd2引用在容器中的文件(upperdir)。解決這個問題的方法是touch引起復(fù)制操作發(fā)生的文件。隨后所有open(2)無論只讀還是讀寫訪問模式,操作都將引用容器中的文件(upperdir)。 yum已知會受到影響,除非yum-plugin-ovl安裝了包裝。如果yum-plugin-ovl軟件包在您的發(fā)行版中不可用,例如6.8或7.2之前的RHEL / CentOS,則可能需要在運行touch /var/lib/rpm/*之前運行yum install。這個包實現(xiàn)了touch上面提到的解決方法yum。

  • rename(2):OverlayFS不完全支持rename(2)系統(tǒng)調(diào)用。您的應(yīng)用程序需要檢測其失敗并回退到“復(fù)制和取消鏈接”策略。

Previous article: Next article: