github.com/kobeld/docker@v1.12.0-rc1/docs/tutorials/dockerimages.md (about) 1 <!--[metadata]> 2 +++ 3 aliases = [ 4 "/engine/userguide/containers/dockerimages/", 5 "/engine/userguide/dockerimages/" 6 ] 7 title = "Build your own images" 8 description = "How to work with Docker images." 9 keywords = ["documentation, docs, the docker guide, docker guide, docker, docker platform, docker.io, Docker images, Docker image, image management, Docker repos, Docker repositories, docker, docker tag, docker tags, Docker Hub, collaboration"] 10 [menu.main] 11 parent = "engine_learn" 12 weight = -4 13 +++ 14 <![end-metadata]--> 15 16 # Build your own images 17 18 Docker images are the basis of containers. Each time you've used `docker run` 19 you told it which image you wanted. In the previous sections of the guide you 20 used Docker images that already exist, for example the `ubuntu` image and the 21 `training/webapp` image. 22 23 You also discovered that Docker stores downloaded images on the Docker host. If 24 an image isn't already present on the host then it'll be downloaded from a 25 registry: by default the [Docker Hub Registry](https://hub.docker.com). 26 27 In this section you're going to explore Docker images a bit more 28 including: 29 30 * Managing and working with images locally on your Docker host. 31 * Creating basic images. 32 * Uploading images to [Docker Hub Registry](https://hub.docker.com). 33 34 ## Listing images on the host 35 36 Let's start with listing the images you have locally on our host. You can 37 do this using the `docker images` command like so: 38 39 $ docker images 40 REPOSITORY TAG IMAGE ID CREATED SIZE 41 ubuntu 14.04 1d073211c498 3 days ago 187.9 MB 42 busybox latest 2c5ac3f849df 5 days ago 1.113 MB 43 training/webapp latest 54bb4e8718e8 5 months ago 348.7 MB 44 45 You can see the images you've previously used in the user guide. 46 Each has been downloaded from [Docker Hub](https://hub.docker.com) when you 47 launched a container using that image. When you list images, you get three crucial pieces of information in the listing. 48 49 * What repository they came from, for example `ubuntu`. 50 * The tags for each image, for example `14.04`. 51 * The image ID of each image. 52 53 > **Tip:** 54 > You can use [a third-party dockviz tool](https://github.com/justone/dockviz) 55 > or the [Image layers site](https://imagelayers.io/) to display 56 > visualizations of image data. 57 58 A repository potentially holds multiple variants of an image. In the case of 59 our `ubuntu` image you can see multiple variants covering Ubuntu 10.04, 12.04, 60 12.10, 13.04, 13.10 and 14.04. Each variant is identified by a tag and you can 61 refer to a tagged image like so: 62 63 ubuntu:14.04 64 65 So when you run a container you refer to a tagged image like so: 66 67 $ docker run -t -i ubuntu:14.04 /bin/bash 68 69 If instead you wanted to run an Ubuntu 12.04 image you'd use: 70 71 $ docker run -t -i ubuntu:12.04 /bin/bash 72 73 If you don't specify a variant, for example you just use `ubuntu`, then Docker 74 will default to using the `ubuntu:latest` image. 75 76 > **Tip:** 77 > You should always specify an image tag, for example `ubuntu:14.04`. 78 > That way, you always know exactly what variant of an image you are using. 79 > This is useful for troubleshooting and debugging. 80 81 ## Getting a new image 82 83 So how do you get new images? Well Docker will automatically download any image 84 you use that isn't already present on the Docker host. But this can potentially 85 add some time to the launch of a container. If you want to pre-load an image you 86 can download it using the `docker pull` command. Suppose you'd like to 87 download the `centos` image. 88 89 $ docker pull centos 90 Pulling repository centos 91 b7de3133ff98: Pulling dependent layers 92 5cc9e91966f7: Pulling fs layer 93 511136ea3c5a: Download complete 94 ef52fb1fe610: Download complete 95 . . . 96 97 Status: Downloaded newer image for centos 98 99 You can see that each layer of the image has been pulled down and now you 100 can run a container from this image and you won't have to wait to 101 download the image. 102 103 $ docker run -t -i centos /bin/bash 104 bash-4.1# 105 106 ## Finding images 107 108 One of the features of Docker is that a lot of people have created Docker 109 images for a variety of purposes. Many of these have been uploaded to 110 [Docker Hub](https://hub.docker.com). You can search these images on the 111 [Docker Hub](https://hub.docker.com) website. 112 113  114 115 You can also search for images on the command line using the `docker search` 116 command. Suppose your team wants an image with Ruby and Sinatra installed on 117 which to do our web application development. You can search for a suitable image 118 by using the `docker search` command to find all the images that contain the 119 term `sinatra`. 120 121 $ docker search sinatra 122 NAME DESCRIPTION STARS OFFICIAL AUTOMATED 123 training/sinatra Sinatra training image 0 [OK] 124 marceldegraaf/sinatra Sinatra test app 0 125 mattwarren/docker-sinatra-demo 0 [OK] 126 luisbebop/docker-sinatra-hello-world 0 [OK] 127 bmorearty/handson-sinatra handson-ruby + Sinatra for Hands on with D... 0 128 subwiz/sinatra 0 129 bmorearty/sinatra 0 130 . . . 131 132 You can see the command returns a lot of images that use the term `sinatra`. 133 You've received a list of image names, descriptions, Stars (which measure the 134 social popularity of images - if a user likes an image then they can "star" it), 135 and the Official and Automated build statuses. [Official 136 Repositories](https://docs.docker.com/docker-hub/official_repos) are a carefully 137 curated set of Docker repositories supported by Docker, Inc. Automated 138 repositories are [Automated Builds](dockerrepos.md#automated-builds) that allow 139 you to validate the source and content of an image. 140 141 You've reviewed the images available to use and you decided to use the 142 `training/sinatra` image. So far you've seen two types of images repositories, 143 images like `ubuntu`, which are called base or root images. These base images 144 are provided by Docker Inc and are built, validated and supported. These can be 145 identified by their single word names. 146 147 You've also seen user images, for example the `training/sinatra` image you've 148 chosen. A user image belongs to a member of the Docker community and is built 149 and maintained by them. You can identify user images as they are always 150 prefixed with the user name, here `training`, of the user that created them. 151 152 ## Pulling our image 153 154 You've identified a suitable image, `training/sinatra`, and now you can download it using the `docker pull` command. 155 156 $ docker pull training/sinatra 157 158 The team can now use this image by running their own containers. 159 160 $ docker run -t -i training/sinatra /bin/bash 161 root@a8cb6ce02d85:/# 162 163 ## Creating our own images 164 165 The team has found the `training/sinatra` image pretty useful but it's not quite 166 what they need and you need to make some changes to it. There are two ways you 167 can update and create images. 168 169 1. You can update a container created from an image and commit the results to an image. 170 2. You can use a `Dockerfile` to specify instructions to create an image. 171 172 173 ### Updating and committing an image 174 175 To update an image you first need to create a container from the image 176 you'd like to update. 177 178 $ docker run -t -i training/sinatra /bin/bash 179 root@0b2616b0e5a8:/# 180 181 > **Note:** 182 > Take note of the container ID that has been created, `0b2616b0e5a8`, as you'll 183 > need it in a moment. 184 185 Inside our running container let's add the `json` gem. 186 187 root@0b2616b0e5a8:/# gem install json 188 189 Once this has completed let's exit our container using the `exit` 190 command. 191 192 Now you have a container with the change you want to make. You can then 193 commit a copy of this container to an image using the `docker commit` 194 command. 195 196 $ docker commit -m "Added json gem" -a "Kate Smith" \ 197 0b2616b0e5a8 ouruser/sinatra:v2 198 4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c 199 200 Here you've used the `docker commit` command. You've specified two flags: `-m` 201 and `-a`. The `-m` flag allows us to specify a commit message, much like you 202 would with a commit on a version control system. The `-a` flag allows us to 203 specify an author for our update. 204 205 You've also specified the container you want to create this new image from, 206 `0b2616b0e5a8` (the ID you recorded earlier) and you've specified a target for 207 the image: 208 209 ouruser/sinatra:v2 210 211 Break this target down. It consists of a new user, `ouruser`, that you're 212 writing this image to. You've also specified the name of the image, here you're 213 keeping the original image name `sinatra`. Finally you're specifying a tag for 214 the image: `v2`. 215 216 You can then look at our new `ouruser/sinatra` image using the `docker images` 217 command. 218 219 $ docker images 220 REPOSITORY TAG IMAGE ID CREATED SIZE 221 training/sinatra latest 5bc342fa0b91 10 hours ago 446.7 MB 222 ouruser/sinatra v2 3c59e02ddd1a 10 hours ago 446.7 MB 223 ouruser/sinatra latest 5db5f8471261 10 hours ago 446.7 MB 224 225 To use our new image to create a container you can then: 226 227 $ docker run -t -i ouruser/sinatra:v2 /bin/bash 228 root@78e82f680994:/# 229 230 ### Building an image from a `Dockerfile` 231 232 Using the `docker commit` command is a pretty simple way of extending an image 233 but it's a bit cumbersome and it's not easy to share a development process for 234 images amongst a team. Instead you can use a new command, `docker build`, to 235 build new images from scratch. 236 237 To do this you create a `Dockerfile` that contains a set of instructions that 238 tell Docker how to build our image. 239 240 First, create a directory and a `Dockerfile`. 241 242 $ mkdir sinatra 243 $ cd sinatra 244 $ touch Dockerfile 245 246 If you are using Docker Machine on Windows, you may access your host 247 directory by `cd` to `/c/Users/your_user_name`. 248 249 Each instruction creates a new layer of the image. Try a simple example now for 250 building your own Sinatra image for your fictitious development team. 251 252 # This is a comment 253 FROM ubuntu:14.04 254 MAINTAINER Kate Smith <ksmith@example.com> 255 RUN apt-get update && apt-get install -y ruby ruby-dev 256 RUN gem install sinatra 257 258 Examine what your `Dockerfile` does. Each instruction prefixes a statement and 259 is capitalized. 260 261 INSTRUCTION statement 262 263 > **Note:** You use `#` to indicate a comment 264 265 The first instruction `FROM` tells Docker what the source of our image is, in 266 this case you're basing our new image on an Ubuntu 14.04 image. The instruction uses the `MAINTAINER` instruction to specify who maintains the new image. 267 268 Lastly, you've specified two `RUN` instructions. A `RUN` instruction executes 269 a command inside the image, for example installing a package. Here you're 270 updating our APT cache, installing Ruby and RubyGems and then installing the 271 Sinatra gem. 272 273 274 275 Now let's take our `Dockerfile` and use the `docker build` command to build an image. 276 277 $ docker build -t ouruser/sinatra:v2 . 278 Sending build context to Docker daemon 2.048 kB 279 Sending build context to Docker daemon 280 Step 1 : FROM ubuntu:14.04 281 ---> e54ca5efa2e9 282 Step 2 : MAINTAINER Kate Smith <ksmith@example.com> 283 ---> Using cache 284 ---> 851baf55332b 285 Step 3 : RUN apt-get update && apt-get install -y ruby ruby-dev 286 ---> Running in 3a2558904e9b 287 Selecting previously unselected package libasan0:amd64. 288 (Reading database ... 11518 files and directories currently installed.) 289 Preparing to unpack .../libasan0_4.8.2-19ubuntu1_amd64.deb ... 290 Unpacking libasan0:amd64 (4.8.2-19ubuntu1) ... 291 Selecting previously unselected package libatomic1:amd64. 292 Preparing to unpack .../libatomic1_4.8.2-19ubuntu1_amd64.deb ... 293 Unpacking libatomic1:amd64 (4.8.2-19ubuntu1) ... 294 Selecting previously unselected package libgmp10:amd64. 295 Preparing to unpack .../libgmp10_2%3a5.1.3+dfsg-1ubuntu1_amd64.deb ... 296 Unpacking libgmp10:amd64 (2:5.1.3+dfsg-1ubuntu1) ... 297 Selecting previously unselected package libisl10:amd64. 298 Preparing to unpack .../libisl10_0.12.2-1_amd64.deb ... 299 Unpacking libisl10:amd64 (0.12.2-1) ... 300 Selecting previously unselected package libcloog-isl4:amd64. 301 Preparing to unpack .../libcloog-isl4_0.18.2-1_amd64.deb ... 302 Unpacking libcloog-isl4:amd64 (0.18.2-1) ... 303 Selecting previously unselected package libgomp1:amd64. 304 Preparing to unpack .../libgomp1_4.8.2-19ubuntu1_amd64.deb ... 305 Unpacking libgomp1:amd64 (4.8.2-19ubuntu1) ... 306 Selecting previously unselected package libitm1:amd64. 307 Preparing to unpack .../libitm1_4.8.2-19ubuntu1_amd64.deb ... 308 Unpacking libitm1:amd64 (4.8.2-19ubuntu1) ... 309 Selecting previously unselected package libmpfr4:amd64. 310 Preparing to unpack .../libmpfr4_3.1.2-1_amd64.deb ... 311 Unpacking libmpfr4:amd64 (3.1.2-1) ... 312 Selecting previously unselected package libquadmath0:amd64. 313 Preparing to unpack .../libquadmath0_4.8.2-19ubuntu1_amd64.deb ... 314 Unpacking libquadmath0:amd64 (4.8.2-19ubuntu1) ... 315 Selecting previously unselected package libtsan0:amd64. 316 Preparing to unpack .../libtsan0_4.8.2-19ubuntu1_amd64.deb ... 317 Unpacking libtsan0:amd64 (4.8.2-19ubuntu1) ... 318 Selecting previously unselected package libyaml-0-2:amd64. 319 Preparing to unpack .../libyaml-0-2_0.1.4-3ubuntu3_amd64.deb ... 320 Unpacking libyaml-0-2:amd64 (0.1.4-3ubuntu3) ... 321 Selecting previously unselected package libmpc3:amd64. 322 Preparing to unpack .../libmpc3_1.0.1-1ubuntu1_amd64.deb ... 323 Unpacking libmpc3:amd64 (1.0.1-1ubuntu1) ... 324 Selecting previously unselected package openssl. 325 Preparing to unpack .../openssl_1.0.1f-1ubuntu2.4_amd64.deb ... 326 Unpacking openssl (1.0.1f-1ubuntu2.4) ... 327 Selecting previously unselected package ca-certificates. 328 Preparing to unpack .../ca-certificates_20130906ubuntu2_all.deb ... 329 Unpacking ca-certificates (20130906ubuntu2) ... 330 Selecting previously unselected package manpages. 331 Preparing to unpack .../manpages_3.54-1ubuntu1_all.deb ... 332 Unpacking manpages (3.54-1ubuntu1) ... 333 Selecting previously unselected package binutils. 334 Preparing to unpack .../binutils_2.24-5ubuntu3_amd64.deb ... 335 Unpacking binutils (2.24-5ubuntu3) ... 336 Selecting previously unselected package cpp-4.8. 337 Preparing to unpack .../cpp-4.8_4.8.2-19ubuntu1_amd64.deb ... 338 Unpacking cpp-4.8 (4.8.2-19ubuntu1) ... 339 Selecting previously unselected package cpp. 340 Preparing to unpack .../cpp_4%3a4.8.2-1ubuntu6_amd64.deb ... 341 Unpacking cpp (4:4.8.2-1ubuntu6) ... 342 Selecting previously unselected package libgcc-4.8-dev:amd64. 343 Preparing to unpack .../libgcc-4.8-dev_4.8.2-19ubuntu1_amd64.deb ... 344 Unpacking libgcc-4.8-dev:amd64 (4.8.2-19ubuntu1) ... 345 Selecting previously unselected package gcc-4.8. 346 Preparing to unpack .../gcc-4.8_4.8.2-19ubuntu1_amd64.deb ... 347 Unpacking gcc-4.8 (4.8.2-19ubuntu1) ... 348 Selecting previously unselected package gcc. 349 Preparing to unpack .../gcc_4%3a4.8.2-1ubuntu6_amd64.deb ... 350 Unpacking gcc (4:4.8.2-1ubuntu6) ... 351 Selecting previously unselected package libc-dev-bin. 352 Preparing to unpack .../libc-dev-bin_2.19-0ubuntu6_amd64.deb ... 353 Unpacking libc-dev-bin (2.19-0ubuntu6) ... 354 Selecting previously unselected package linux-libc-dev:amd64. 355 Preparing to unpack .../linux-libc-dev_3.13.0-30.55_amd64.deb ... 356 Unpacking linux-libc-dev:amd64 (3.13.0-30.55) ... 357 Selecting previously unselected package libc6-dev:amd64. 358 Preparing to unpack .../libc6-dev_2.19-0ubuntu6_amd64.deb ... 359 Unpacking libc6-dev:amd64 (2.19-0ubuntu6) ... 360 Selecting previously unselected package ruby. 361 Preparing to unpack .../ruby_1%3a1.9.3.4_all.deb ... 362 Unpacking ruby (1:1.9.3.4) ... 363 Selecting previously unselected package ruby1.9.1. 364 Preparing to unpack .../ruby1.9.1_1.9.3.484-2ubuntu1_amd64.deb ... 365 Unpacking ruby1.9.1 (1.9.3.484-2ubuntu1) ... 366 Selecting previously unselected package libruby1.9.1. 367 Preparing to unpack .../libruby1.9.1_1.9.3.484-2ubuntu1_amd64.deb ... 368 Unpacking libruby1.9.1 (1.9.3.484-2ubuntu1) ... 369 Selecting previously unselected package manpages-dev. 370 Preparing to unpack .../manpages-dev_3.54-1ubuntu1_all.deb ... 371 Unpacking manpages-dev (3.54-1ubuntu1) ... 372 Selecting previously unselected package ruby1.9.1-dev. 373 Preparing to unpack .../ruby1.9.1-dev_1.9.3.484-2ubuntu1_amd64.deb ... 374 Unpacking ruby1.9.1-dev (1.9.3.484-2ubuntu1) ... 375 Selecting previously unselected package ruby-dev. 376 Preparing to unpack .../ruby-dev_1%3a1.9.3.4_all.deb ... 377 Unpacking ruby-dev (1:1.9.3.4) ... 378 Setting up libasan0:amd64 (4.8.2-19ubuntu1) ... 379 Setting up libatomic1:amd64 (4.8.2-19ubuntu1) ... 380 Setting up libgmp10:amd64 (2:5.1.3+dfsg-1ubuntu1) ... 381 Setting up libisl10:amd64 (0.12.2-1) ... 382 Setting up libcloog-isl4:amd64 (0.18.2-1) ... 383 Setting up libgomp1:amd64 (4.8.2-19ubuntu1) ... 384 Setting up libitm1:amd64 (4.8.2-19ubuntu1) ... 385 Setting up libmpfr4:amd64 (3.1.2-1) ... 386 Setting up libquadmath0:amd64 (4.8.2-19ubuntu1) ... 387 Setting up libtsan0:amd64 (4.8.2-19ubuntu1) ... 388 Setting up libyaml-0-2:amd64 (0.1.4-3ubuntu3) ... 389 Setting up libmpc3:amd64 (1.0.1-1ubuntu1) ... 390 Setting up openssl (1.0.1f-1ubuntu2.4) ... 391 Setting up ca-certificates (20130906ubuntu2) ... 392 debconf: unable to initialize frontend: Dialog 393 debconf: (TERM is not set, so the dialog frontend is not usable.) 394 debconf: falling back to frontend: Readline 395 debconf: unable to initialize frontend: Readline 396 debconf: (This frontend requires a controlling tty.) 397 debconf: falling back to frontend: Teletype 398 Setting up manpages (3.54-1ubuntu1) ... 399 Setting up binutils (2.24-5ubuntu3) ... 400 Setting up cpp-4.8 (4.8.2-19ubuntu1) ... 401 Setting up cpp (4:4.8.2-1ubuntu6) ... 402 Setting up libgcc-4.8-dev:amd64 (4.8.2-19ubuntu1) ... 403 Setting up gcc-4.8 (4.8.2-19ubuntu1) ... 404 Setting up gcc (4:4.8.2-1ubuntu6) ... 405 Setting up libc-dev-bin (2.19-0ubuntu6) ... 406 Setting up linux-libc-dev:amd64 (3.13.0-30.55) ... 407 Setting up libc6-dev:amd64 (2.19-0ubuntu6) ... 408 Setting up manpages-dev (3.54-1ubuntu1) ... 409 Setting up libruby1.9.1 (1.9.3.484-2ubuntu1) ... 410 Setting up ruby1.9.1-dev (1.9.3.484-2ubuntu1) ... 411 Setting up ruby-dev (1:1.9.3.4) ... 412 Setting up ruby (1:1.9.3.4) ... 413 Setting up ruby1.9.1 (1.9.3.484-2ubuntu1) ... 414 Processing triggers for libc-bin (2.19-0ubuntu6) ... 415 Processing triggers for ca-certificates (20130906ubuntu2) ... 416 Updating certificates in /etc/ssl/certs... 164 added, 0 removed; done. 417 Running hooks in /etc/ca-certificates/update.d....done. 418 ---> c55c31703134 419 Removing intermediate container 3a2558904e9b 420 Step 4 : RUN gem install sinatra 421 ---> Running in 6b81cb6313e5 422 unable to convert "\xC3" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to US-ASCII for README.rdoc, skipping 423 unable to convert "\xC3" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to US-ASCII for README.rdoc, skipping 424 Successfully installed rack-1.5.2 425 Successfully installed tilt-1.4.1 426 Successfully installed rack-protection-1.5.3 427 Successfully installed sinatra-1.4.5 428 4 gems installed 429 Installing ri documentation for rack-1.5.2... 430 Installing ri documentation for tilt-1.4.1... 431 Installing ri documentation for rack-protection-1.5.3... 432 Installing ri documentation for sinatra-1.4.5... 433 Installing RDoc documentation for rack-1.5.2... 434 Installing RDoc documentation for tilt-1.4.1... 435 Installing RDoc documentation for rack-protection-1.5.3... 436 Installing RDoc documentation for sinatra-1.4.5... 437 ---> 97feabe5d2ed 438 Removing intermediate container 6b81cb6313e5 439 Successfully built 97feabe5d2ed 440 441 You've specified our `docker build` command and used the `-t` flag to identify 442 our new image as belonging to the user `ouruser`, the repository name `sinatra` 443 and given it the tag `v2`. 444 445 You've also specified the location of our `Dockerfile` using the `.` to 446 indicate a `Dockerfile` in the current directory. 447 448 > **Note:** 449 > You can also specify a path to a `Dockerfile`. 450 451 Now you can see the build process at work. The first thing Docker does is 452 upload the build context: basically the contents of the directory you're 453 building in. This is done because the Docker daemon does the actual 454 build of the image and it needs the local context to do it. 455 456 Next you can see each instruction in the `Dockerfile` being executed 457 step-by-step. You can see that each step creates a new container, runs 458 the instruction inside that container and then commits that change - 459 just like the `docker commit` work flow you saw earlier. When all the 460 instructions have executed you're left with the `97feabe5d2ed` image 461 (also helpfuly tagged as `ouruser/sinatra:v2`) and all intermediate 462 containers will get removed to clean things up. 463 464 > **Note:** 465 > An image can't have more than 127 layers regardless of the storage driver. 466 > This limitation is set globally to encourage optimization of the overall 467 > size of images. 468 469 You can then create a container from our new image. 470 471 $ docker run -t -i ouruser/sinatra:v2 /bin/bash 472 root@8196968dac35:/# 473 474 > **Note:** 475 > This is just a brief introduction to creating images. We've 476 > skipped a whole bunch of other instructions that you can use. We'll see more of 477 > those instructions in later sections of the Guide or you can refer to the 478 > [`Dockerfile`](../reference/builder.md) reference for a 479 > detailed description and examples of every instruction. 480 > To help you write a clear, readable, maintainable `Dockerfile`, we've also 481 > written a [`Dockerfile` Best Practices guide](../userguide/eng-image/dockerfile_best-practices.md). 482 483 484 ## Setting tags on an image 485 486 You can also add a tag to an existing image after you commit or build it. We 487 can do this using the `docker tag` command. Now, add a new tag to your 488 `ouruser/sinatra` image. 489 490 $ docker tag 5db5f8471261 ouruser/sinatra:devel 491 492 The `docker tag` command takes the ID of the image, here `5db5f8471261`, and our 493 user name, the repository name and the new tag. 494 495 Now, see your new tag using the `docker images` command. 496 497 $ docker images ouruser/sinatra 498 REPOSITORY TAG IMAGE ID CREATED SIZE 499 ouruser/sinatra latest 5db5f8471261 11 hours ago 446.7 MB 500 ouruser/sinatra devel 5db5f8471261 11 hours ago 446.7 MB 501 ouruser/sinatra v2 5db5f8471261 11 hours ago 446.7 MB 502 503 ## Image Digests 504 505 Images that use the v2 or later format have a content-addressable identifier 506 called a `digest`. As long as the input used to generate the image is 507 unchanged, the digest value is predictable. To list image digest values, use 508 the `--digests` flag: 509 510 $ docker images --digests | head 511 REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE 512 ouruser/sinatra latest sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf 5db5f8471261 11 hours ago 446.7 MB 513 514 When pushing or pulling to a 2.0 registry, the `push` or `pull` command 515 output includes the image digest. You can `pull` using a digest value. 516 517 $ docker pull ouruser/sinatra@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf 518 519 You can also reference by digest in `create`, `run`, and `rmi` commands, as well as the 520 `FROM` image reference in a Dockerfile. 521 522 ## Push an image to Docker Hub 523 524 Once you've built or created a new image you can push it to [Docker 525 Hub](https://hub.docker.com) using the `docker push` command. This 526 allows you to share it with others, either publicly, or push it into [a 527 private repository](https://hub.docker.com/account/billing-plans/). 528 529 $ docker push ouruser/sinatra 530 The push refers to a repository [ouruser/sinatra] (len: 1) 531 Sending image list 532 Pushing repository ouruser/sinatra (3 tags) 533 . . . 534 535 ## Remove an image from the host 536 537 You can also remove images on your Docker host in a way [similar to 538 containers](usingdocker.md) using the `docker rmi` command. 539 540 Delete the `training/sinatra` image as you don't need it anymore. 541 542 $ docker rmi training/sinatra 543 Untagged: training/sinatra:latest 544 Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d 545 Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f 546 Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0 547 548 > **Note:** To remove an image from the host, please make sure 549 > that there are no containers actively based on it. 550 551 # Next steps 552 553 Until now you've seen how to build individual applications inside Docker 554 containers. Now learn how to build whole application stacks with Docker 555 by networking together multiple Docker containers. 556 557 Go to [Network containers](networkingcontainers.md).