github.com/sijibomii/docker@v0.0.0-20231230191044-5cf6ca554647/docs/userguide/storagedriver/imagesandcontainers.md (about)

     1  <!--[metadata]>
     2  +++
     3  title = "Understand images, containers, and storage drivers"
     4  description = "Learn the technologies that support storage drivers."
     5  keywords = ["container, storage, driver, AUFS, btfs, devicemapper,zvfs"]
     6  [menu.main]
     7  parent = "engine_driver"
     8  weight = -2
     9  +++
    10  <![end-metadata]-->
    11  
    12  
    13  # Understand images, containers, and storage drivers
    14  
    15  To use storage drivers effectively, you must understand how Docker builds and
    16  stores images. Then, you need an understanding of how these images are used by 
    17  containers. Finally, you'll need a short introduction to the technologies that 
    18  enable both images and container operations.
    19  
    20  ## Images and layers
    21  
    22  Each Docker image references a list of read-only layers that represent 
    23  filesystem differences. Layers are stacked on top of each other to form a base 
    24  for a container's root filesystem. The diagram below shows the Ubuntu 15.04 
    25  image comprising 4 stacked image layers.
    26  
    27  ![](images/image-layers.jpg)
    28  
    29  The Docker storage driver is responsible for stacking these layers and 
    30  providing a single unified view.
    31   
    32  When you create a new container, you add a new, thin, writable layer on top of 
    33  the underlying stack. This layer is often called the "container layer". All 
    34  changes made to the running container - such as writing new files, modifying 
    35  existing files, and deleting files - are written to this thin writable 
    36  container layer. The diagram below shows a container based on the Ubuntu 15.04 
    37  image.
    38  
    39  ![](images/container-layers.jpg)
    40  
    41  ### Content addressable storage
    42  
    43  Docker 1.10 introduced a new content addressable storage model. This is a 
    44  completely new way to address image and layer data on disk. Previously, image 
    45  and layer data was referenced and stored using a a randomly generated UUID. In 
    46  the new model this is replaced by a secure *content hash*.
    47  
    48  The new model improves security, provides a built-in way to avoid ID 
    49  collisions, and guarantees data integrity after pull, push, load, and save 
    50  operations. It also enables better sharing of layers by allowing many images to
    51   freely share their layers even if they didn’t come from the same build.
    52  
    53  The diagram below shows an updated version of the previous diagram, 
    54  highlighting the changes implemented by Docker 1.10. 
    55  
    56  ![](images/container-layers-cas.jpg)
    57  
    58  As can be seen, all image layer IDs are cryptographic hashes, whereas the 
    59  container ID is still a randomly generated UUID.
    60  
    61  There are several things to note regarding the new model. These include:
    62  
    63  1. Migration of existing images
    64  2. Image and layer filesystem structures
    65  
    66  Existing images, those created and pulled by earlier versions of Docker, need 
    67  to be migrated before they can be used with the new model. This migration 
    68  involves calculating new secure checksums and is performed automatically the 
    69  first time you start an updated Docker daemon. After the migration is complete,
    70   all images and tags will have brand new secure IDs. 
    71  
    72  Although the migration is automatic and transparent, it is computationally 
    73  intensive. This means it and can take time if you have lots of image data. 
    74  During this time your Docker daemon will not respond to other requests.
    75  
    76  A migration tool exists that allows you to migrate existing images to the new 
    77  format before upgrading your Docker daemon. This means that upgraded Docker 
    78  daemons do not need to perform the migration in-band, and therefore avoids any 
    79  associated downtime. It also provides a way to manually migrate existing images
    80   so that they can be distributed to other Docker daemons in your environment 
    81  that are already running the latest versions of Docker.
    82  
    83  The migration tool is provided by Docker, Inc., and runs as a container. You 
    84  can download it from [https://github.com/docker/v1.10-migrator/releases](https://github.com/docker/v1.10-migrator/releases).
    85  
    86  While running the "migrator" image you need to expose your Docker host's data 
    87  directory to the container. If you are using the default Docker data path, the 
    88  command to run the container will look like this 
    89  
    90      $ sudo docker run --rm -v /var/lib/docker:/var/lib/docker docker/v1.10-migrator
    91  
    92  If you use the `devicemapper` storage driver, you will need to include the 
    93  `--privileged` option so that the container has access to your storage devices.
    94  
    95  #### Migration example
    96  
    97  The following example shows the migration tool in use on a Docker host running
    98  version 1.9.1 of the Docker daemon and the AUFS storage driver. The Docker host
    99   is running on a **t2.micro** AWS EC2 instance with 1 vCPU, 1GB RAM, and a 
   100  single 8GB general purpose SSD EBS volume. The Docker data directory 
   101  (`/var/lib/docker`) was consuming 2GB of space.
   102  
   103      $ docker images
   104      REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
   105      jenkins             latest              285c9f0f9d3d        17 hours ago        708.5 MB
   106      mysql               latest              d39c3fa09ced        8 days ago          360.3 MB
   107      mongo               latest              a74137af4532        13 days ago         317.4 MB
   108      postgres            latest              9aae83d4127f        13 days ago         270.7 MB
   109      redis               latest              8bccd73928d9        2 weeks ago         151.3 MB
   110      centos              latest              c8a648134623        4 weeks ago         196.6 MB
   111      ubuntu              15.04               c8be1ac8145a        7 weeks ago         131.3 MB
   112      
   113      $ sudo du -hs /var/lib/docker
   114      2.0G    /var/lib/docker
   115      
   116      $ time docker run --rm -v /var/lib/docker:/var/lib/docker docker/v1.10-migrator
   117      Unable to find image 'docker/v1.10-migrator:latest' locally
   118      latest: Pulling from docker/v1.10-migrator
   119      ed1f33c5883d: Pull complete
   120      b3ca410aa2c1: Pull complete
   121      2b9c6ed9099e: Pull complete
   122      dce7e318b173: Pull complete
   123      Digest: sha256:bd2b245d5d22dd94ec4a8417a9b81bb5e90b171031c6e216484db3fe300c2097
   124      Status: Downloaded newer image for docker/v1.10-migrator:latest
   125      time="2016-01-27T12:31:06Z" level=debug msg="Assembling tar data for 01e70da302a553ba13485ad020a0d77dbb47575a31c4f48221137bb08f45878d from /var/lib/docker/aufs/diff/01e70da302a553ba13485ad020a0d77dbb47575a31c4f48221137bb08f45878d"
   126      time="2016-01-27T12:31:06Z" level=debug msg="Assembling tar data for 07ac220aeeef9febf1ac16a9d1a4eff7ef3c8cbf5ed0be6b6f4c35952ed7920d from /var/lib/docker/aufs/diff/07ac220aeeef9febf1ac16a9d1a4eff7ef3c8cbf5ed0be6b6f4c35952ed7920d"
   127      <snip>
   128      time="2016-01-27T12:32:00Z" level=debug msg="layer dbacfa057b30b1feaf15937c28bd8ca0d6c634fc311ccc35bd8d56d017595d5b took 10.80 seconds"
   129  
   130      real    0m59.583s
   131      user    0m0.046s
   132      sys     0m0.008s
   133  
   134  The Unix `time` command prepends the `docker run` command to produce timings 
   135  for the operation. As can be seen, the overall time taken to migrate 7 images 
   136  comprising 2GB of disk space took approximately 1 minute. However, this 
   137  included the time taken to pull the `docker/v1.10-migrator` image 
   138  (approximately 3.5 seconds). The same operation on an m4.10xlarge EC2 instance 
   139  with 40 vCPUs, 160GB RAM and an 8GB provisioned IOPS EBS volume resulted in the
   140   following improved timings:
   141  
   142      real    0m9.871s
   143      user    0m0.094s
   144      sys     0m0.021s
   145  
   146  This shows that the migration operation is affected by the hardware spec of the
   147   machine performing the migration.
   148  
   149  ## Container and layers
   150  
   151  The major difference between a container and an image is the top writable 
   152  layer. All writes to the container that add new or modify existing data are 
   153  stored in this writable layer. When the container is deleted the writable layer
   154   is also deleted. The underlying image remains unchanged.
   155  
   156  Because each container has its own thin writable container layer, and all 
   157  changes are stored this container layer, this means that multiple containers 
   158  can share access to the same underlying image and yet have their own data 
   159  state. The diagram below shows multiple containers sharing the same Ubuntu 
   160  15.04 image.
   161  
   162  ![](images/sharing-layers.jpg)
   163  
   164  The Docker storage driver is responsible for enabling and managing both the 
   165  image layers and the writable container layer. How a storage driver 
   166  accomplishes these can vary between drivers. Two key technologies behind Docker
   167   image and container management are stackable image layers and copy-on-write 
   168  (CoW).
   169  
   170  
   171  ## The copy-on-write strategy
   172  
   173  Sharing is a good way to optimize resources. People do this instinctively in
   174  daily life. For example, twins Jane and Joseph taking an Algebra class at
   175  different times from different teachers can share the same exercise book by
   176  passing it between each other. Now, suppose Jane gets an assignment to complete
   177  the homework on page 11 in the book. At that point, Jane copies page 11, 
   178  completes the homework, and hands in her copy. The original exercise book is 
   179  unchanged and only Jane has a copy of the changed page 11.
   180  
   181  Copy-on-write is a similar strategy of sharing and copying. In this strategy,
   182  system processes that need the same data share the same instance of that data
   183  rather than having their own copy. At some point, if one process needs to 
   184  modify or write to the data, only then does the operating system make a copy of
   185   the data for that process to use. Only the process that needs to write has 
   186  access to the data copy. All the other processes continue to use the original 
   187  data.
   188  
   189  Docker uses a copy-on-write technology with both images and containers. This 
   190  CoW strategy optimizes both image disk space usage and the performance of 
   191  container start times. The next sections look at how copy-on-write is leveraged
   192   with images and containers through sharing and copying.
   193  
   194  ### Sharing promotes smaller images
   195  
   196  This section looks at image layers and copy-on-write technology.  All image and
   197   container layers exist inside the Docker host's *local storage area* and are 
   198  managed by the storage driver. On Linux-based Docker hosts this is usually 
   199  located under `/var/lib/docker/`.
   200  
   201  The Docker client reports on image layers when instructed to pull and push
   202  images with `docker pull` and `docker push`. The command below pulls the
   203  `ubuntu:15.04` Docker image from Docker Hub.
   204  
   205      $ docker pull ubuntu:15.04
   206      15.04: Pulling from library/ubuntu
   207      1ba8ac955b97: Pull complete
   208      f157c4e5ede7: Pull complete
   209      0b7e98f84c4c: Pull complete
   210      a3ed95caeb02: Pull complete
   211      Digest: sha256:5e279a9df07990286cce22e1b0f5b0490629ca6d187698746ae5e28e604a640e
   212      Status: Downloaded newer image for ubuntu:15.04
   213  
   214  From the output, you'll see  that the command actually pulls 4 image layers.
   215  Each of the above lines lists an image layer and its UUID or cryptographic 
   216  hash. The combination of these four layers makes up the `ubuntu:15.04` Docker 
   217  image.
   218  
   219  Each of these layers is stored in its own directory inside the Docker host's 
   220  local storage are. 
   221  
   222  Versions of Docker prior to 1.10 stored each layer in a directory with the same
   223   name as the image layer ID. However, this is not the case for images pulled 
   224  with Docker version 1.10 and later. For example, the command below shows an 
   225  image being pulled from Docker Hub, followed by a directory listing on a host 
   226  running version 1.9.1 of the Docker Engine.
   227  
   228      $  docker pull ubuntu:15.04
   229      15.04: Pulling from library/ubuntu
   230      47984b517ca9: Pull complete
   231      df6e891a3ea9: Pull complete
   232      e65155041eed: Pull complete
   233      c8be1ac8145a: Pull complete
   234      Digest: sha256:5e279a9df07990286cce22e1b0f5b0490629ca6d187698746ae5e28e604a640e
   235      Status: Downloaded newer image for ubuntu:15.04
   236  
   237      $ ls /var/lib/docker/aufs/layers
   238      47984b517ca9ca0312aced5c9698753ffa964c2015f2a5f18e5efa9848cf30e2
   239      c8be1ac8145a6e59a55667f573883749ad66eaeef92b4df17e5ea1260e2d7356
   240      df6e891a3ea9cdce2a388a2cf1b1711629557454fd120abd5be6d32329a0e0ac
   241      e65155041eed7ec58dea78d90286048055ca75d41ea893c7246e794389ecf203
   242  
   243  Notice how the four directories match up with the layer IDs of the downloaded 
   244  image. Now compare this with the same operations performed on a host running 
   245  version 1.10 of the Docker Engine.
   246  
   247      $ docker pull ubuntu:15.04
   248      15.04: Pulling from library/ubuntu
   249      1ba8ac955b97: Pull complete
   250      f157c4e5ede7: Pull complete
   251      0b7e98f84c4c: Pull complete
   252      a3ed95caeb02: Pull complete
   253      Digest: sha256:5e279a9df07990286cce22e1b0f5b0490629ca6d187698746ae5e28e604a640e
   254      Status: Downloaded newer image for ubuntu:15.04
   255  
   256      $ ls /var/lib/docker/aufs/layers/
   257      1d6674ff835b10f76e354806e16b950f91a191d3b471236609ab13a930275e24
   258      5dbb0cbe0148cf447b9464a358c1587be586058d9a4c9ce079320265e2bb94e7
   259      bef7199f2ed8e86fa4ada1309cfad3089e0542fec8894690529e4c04a7ca2d73
   260      ebf814eccfe98f2704660ca1d844e4348db3b5ccc637eb905d4818fbfb00a06a
   261  
   262  See how the four directories do not match up with the image layer IDs pulled in
   263   the previous step.
   264  
   265  Despite the differences between image management before and after version 1.10,
   266  all versions of Docker still allow images to share layers. For example, If you 
   267  `pull` an image that shares some of the same image layers as an image that has 
   268  already been pulled, the Docker daemon recognizes this, and only pulls the 
   269  layers it doesn't already have stored locally. After the second pull, the two 
   270  images will share any common image layers.
   271  
   272  You can illustrate this now for yourself. Starting with the `ubuntu:15.04` 
   273  image that you just pulled, make a change to it, and build a new image based on
   274   the change. One way to do this is using a `Dockerfile` and the `docker build` 
   275  command.
   276  
   277  1. In an empty directory, create a simple `Dockerfile` that starts with the 
   278     ubuntu:15.04 image.
   279  
   280          FROM ubuntu:15.04
   281  
   282  2. Add a new file called "newfile" in the image's `/tmp` directory with the 
   283     text "Hello world" in it.
   284  
   285      When you are done, the `Dockerfile` contains two lines:
   286  
   287          FROM ubuntu:15.04
   288  
   289          RUN echo "Hello world" > /tmp/newfile
   290  
   291  3. Save and close the file.
   292  
   293  4. From a terminal in the same folder as your `Dockerfile`, run the following 
   294     command:
   295  
   296          $ docker build -t changed-ubuntu .
   297          Sending build context to Docker daemon 2.048 kB
   298          Step 1 : FROM ubuntu:15.04
   299           ---> 3f7bcee56709
   300          Step 2 : RUN echo "Hello world" > /tmp/newfile
   301           ---> Running in d14acd6fad4e
   302           ---> 94e6b7d2c720
   303          Removing intermediate container d14acd6fad4e
   304          Successfully built 94e6b7d2c720
   305  
   306      > **Note:** The period (.) at the end of the above command is important. It
   307      >  tells the `docker build` command to use the current working directory as
   308      >   its build context.
   309  
   310      The output above shows a new image with image ID `94e6b7d2c720`.
   311  
   312  5. Run the `docker images` command to verify the new `changed-ubuntu` image is 
   313     in the Docker host's local storage area.
   314  
   315          REPOSITORY       TAG      IMAGE ID       CREATED           SIZE
   316          changed-ubuntu   latest   03b964f68d06   33 seconds ago    131.4 MB
   317          ubuntu           15.04    013f3d01d247   6 weeks ago       131.3 MB
   318  
   319  6. Run the `docker history` command to see which image layers were used to 
   320     create the new `changed-ubuntu` image.
   321  
   322          $ docker history changed-ubuntu
   323          IMAGE               CREATED              CREATED BY                                      SIZE        COMMENT
   324          94e6b7d2c720        2 minutes ago       /bin/sh -c echo "Hello world" > /tmp/newfile    12 B 
   325          3f7bcee56709        6 weeks ago         /bin/sh -c #(nop) CMD ["/bin/bash"]             0 B  
   326          <missing>           6 weeks ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/   1.879 kB
   327          <missing>           6 weeks ago         /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic   701 B
   328          <missing>           6 weeks ago         /bin/sh -c #(nop) ADD file:8e4943cd86e9b2ca13   131.3 MB
   329  
   330      The `docker history` output shows the new `94e6b7d2c720` image layer at the
   331      top. You know that this is the new image layer added because it was created
   332       by the `echo "Hello world" > /tmp/newfile` command in your `Dockerfile`. 
   333      The 4 image layers below it are the exact same image layers 
   334      that make up the `ubuntu:15.04` image.
   335  
   336  > **Note:** Under the content addressable storage model introduced with Docker 
   337  > 1.10, image history data is no longer stored in a config file with each image
   338  > layer. It is now stored as a string of text in a single config file that 
   339  > relates to the overall image. This can result in some image layers showing as
   340  >  "missing" in the output of the `docker history` command. This is normal 
   341  >  behaviour and can be ignored.
   342  >
   343  > You may hear images like these referred to as *flat images*.
   344  
   345  Notice the new `changed-ubuntu` image does not have its own copies of every 
   346  layer. As can be seen in the diagram below, the new image is sharing its four 
   347  underlying layers with the `ubuntu:15.04` image.
   348  
   349  ![](images/saving-space.jpg)
   350  
   351  The `docker history` command also shows the size of each image layer. As you 
   352  can see, the `94e6b7d2c720` layer is only consuming 12 Bytes of disk space. 
   353  This means that the `changed-ubuntu` image we just created is only consuming an
   354   additional 12 Bytes of disk space on the Docker host - all layers below the 
   355  `94e6b7d2c720` layer already exist on the Docker host and are shared by other 
   356  images.
   357  
   358  This sharing of image layers is what makes Docker images and containers so 
   359  space efficient.
   360  
   361  ### Copying makes containers efficient
   362  
   363  You learned earlier that a container is a Docker image with a thin writable, 
   364  container layer added. The diagram below shows the layers of a container based 
   365  on the `ubuntu:15.04` image:
   366  
   367  ![](images/container-layers-cas.jpg)
   368  
   369  All writes made to a container are stored in the thin writable container layer.
   370   The other layers are read-only (RO) image layers and can't be changed. This 
   371  means that multiple containers can safely share a single underlying image. The 
   372  diagram below shows multiple containers sharing a single copy of the 
   373  `ubuntu:15.04` image. Each container has its own thin RW layer, but they all 
   374  share a single instance of the ubuntu:15.04 image:
   375  
   376  ![](images/sharing-layers.jpg)
   377  
   378  When an existing file in a container is modified, Docker uses the storage 
   379  driver to perform a copy-on-write operation. The specifics of operation depends
   380   on the storage driver. For the AUFS and OverlayFS storage drivers, the 
   381  copy-on-write operation is pretty much as follows:
   382  
   383  *  Search through the image layers for the file to update. The process starts 
   384  at the top, newest layer and works down to the base layer one layer at a 
   385  time.
   386  *  Perform a "copy-up" operation on the first copy of the file that is found. A
   387   "copy up" copies the file up to the container's own thin writable layer.
   388  * Modify the *copy of the file* in container's thin writable layer.
   389  
   390  Btrfs, ZFS, and other drivers handle the copy-on-write differently. You can 
   391  read more about the methods of these drivers later in their detailed 
   392  descriptions.
   393  
   394  Containers that write a lot of data will consume more space than containers 
   395  that do not. This is because most write operations consume new space in the 
   396  container's thin writable top layer. If your container needs to write a lot of 
   397  data, you should consider using a data volume.
   398  
   399  A copy-up operation can incur a noticeable performance overhead. This overhead 
   400  is different depending on which storage driver is in use. However, large files,
   401   lots of layers, and deep directory trees can make the impact more noticeable. 
   402  Fortunately, the operation only occurs the first time any particular file is 
   403  modified. Subsequent modifications to the same file do not cause a copy-up 
   404  operation and can operate directly on the file's existing copy already present 
   405  in the container layer.
   406  
   407  Let's see what happens if we spin up 5 containers based on our `changed-ubuntu`
   408   image we built earlier:
   409  
   410  1. From a terminal on your Docker host, run the following `docker run` command 
   411  5 times.
   412  
   413          $ docker run -dit changed-ubuntu bash
   414          75bab0d54f3cf193cfdc3a86483466363f442fba30859f7dcd1b816b6ede82d4
   415          $ docker run -dit changed-ubuntu bash
   416          9280e777d109e2eb4b13ab211553516124a3d4d4280a0edfc7abf75c59024d47
   417          $ docker run -dit changed-ubuntu bash
   418          a651680bd6c2ef64902e154eeb8a064b85c9abf08ac46f922ad8dfc11bb5cd8a
   419          $ docker run -dit changed-ubuntu bash
   420          8eb24b3b2d246f225b24f2fca39625aaad71689c392a7b552b78baf264647373
   421          $ docker run -dit changed-ubuntu bash
   422          0ad25d06bdf6fca0dedc38301b2aff7478b3e1ce3d1acd676573bba57cb1cfef
   423  
   424      This launches 5 containers based on the `changed-ubuntu` image.  As each 
   425  container is created, Docker adds a writable layer and assigns it a random 
   426  UUID. This is the value returned from the `docker run` command.
   427  
   428  2. Run the `docker ps` command to verify the 5 containers are running.
   429  
   430          $ docker ps
   431          CONTAINER ID    IMAGE             COMMAND    CREATED              STATUS              PORTS    NAMES
   432          0ad25d06bdf6    changed-ubuntu    "bash"     About a minute ago   Up About a minute            stoic_ptolemy
   433          8eb24b3b2d24    changed-ubuntu    "bash"     About a minute ago   Up About a minute            pensive_bartik
   434          a651680bd6c2    changed-ubuntu    "bash"     2 minutes ago        Up 2 minutes                 hopeful_turing
   435          9280e777d109    changed-ubuntu    "bash"     2 minutes ago        Up 2 minutes                 backstabbing_mahavira
   436          75bab0d54f3c    changed-ubuntu    "bash"     2 minutes ago        Up 2 minutes                 boring_pasteur
   437  
   438      The output above shows 5 running containers, all sharing the 
   439  `changed-ubuntu` image. Each `CONTAINER ID` is derived from the UUID when 
   440  creating each container.
   441  
   442  3. List the contents of the local storage area.
   443  
   444          $ sudo ls /var/lib/docker/containers
   445          0ad25d06bdf6fca0dedc38301b2aff7478b3e1ce3d1acd676573bba57cb1cfef
   446          9280e777d109e2eb4b13ab211553516124a3d4d4280a0edfc7abf75c59024d47
   447          75bab0d54f3cf193cfdc3a86483466363f442fba30859f7dcd1b816b6ede82d4
   448          a651680bd6c2ef64902e154eeb8a064b85c9abf08ac46f922ad8dfc11bb5cd8a
   449          8eb24b3b2d246f225b24f2fca39625aaad71689c392a7b552b78baf264647373
   450  
   451  Docker's copy-on-write strategy not only reduces the amount of space consumed 
   452  by containers, it also reduces the time required to start a container. At start
   453   time, Docker only has to create the thin writable layer for each container. 
   454  The diagram below shows these 5 containers sharing a single read-only (RO) 
   455  copy of the `changed-ubuntu` image.
   456  
   457  ![](images/shared-uuid.jpg)
   458  
   459  If Docker had to make an entire copy of the underlying image stack each time it
   460  started a new container, container start times and disk space used would be
   461  significantly increased.
   462  
   463  ## Data volumes and the storage driver
   464  
   465  When a container is deleted, any data written to the container that is not 
   466  stored in a *data volume* is deleted along with the container. 
   467  
   468  A data volume is a directory or file in the Docker host's filesystem that is 
   469  mounted directly into a container. Data volumes are not controlled by the 
   470  storage driver. Reads and writes to data volumes bypass the storage driver and 
   471  operate at native host speeds. You can mount any number of data volumes into a 
   472  container. Multiple containers can also share one or more data volumes.
   473  
   474  The diagram below shows a single Docker host running two containers. Each 
   475  container exists inside of its own address space within the Docker host's local
   476   storage area (`/var/lib/docker/...`). There is also a single shared data 
   477  volume located at `/data` on the Docker host. This is mounted directly into 
   478  both containers.
   479  
   480  ![](images/shared-volume.jpg)
   481  
   482  Data volumes reside outside of the local storage area on the Docker host, 
   483  further reinforcing their independence from the storage driver's control. When 
   484  a container is deleted, any data stored in data volumes persists on the Docker 
   485  host.
   486  
   487  For detailed information about data volumes 
   488  [Managing data in containers](https://docs.docker.com/userguide/dockervolumes/).
   489  
   490  ## Related information
   491  
   492  * [Select a storage driver](selectadriver.md)
   493  * [AUFS storage driver in practice](aufs-driver.md)
   494  * [Btrfs storage driver in practice](btrfs-driver.md)
   495  * [Device Mapper storage driver in practice](device-mapper-driver.md)