github.com/kobeld/docker@v1.12.0-rc1/docs/tutorials/dockerimages.md (about)

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