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  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  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  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  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  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  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  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  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  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)