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