github.com/guilhermebr/docker@v1.4.2-0.20150428121140-67da055cebca/docs/sources/userguide/dockerimages.md (about)

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