github.com/a4a881d4/docker@v1.9.0-rc2/docs/userguide/dockerimages.md (about)

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