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