github.com/jandre/docker@v1.7.0/docs/userguide/usingdocker.md (about)

     1  <!--[metadata]>
     2  +++
     3  title = "Working with containers"
     4  description = "Learn how to manage and operate Docker containers."
     5  keywords = ["docker, the docker guide, documentation, docker.io, monitoring containers, docker top, docker inspect, docker port, ports, docker logs, log,  Logs"]
     6  [menu.main]
     7  parent="smn_containers"
     8  +++
     9  <![end-metadata]-->
    10  
    11  # Working with containers
    12  
    13  In the [last section of the Docker User Guide](/userguide/dockerizing)
    14  we launched our first containers. We launched two containers using the
    15  `docker run` command.
    16  
    17  * Containers we ran interactively in the foreground.
    18  * One container we ran daemonized in the background.
    19  
    20  In the process we learned about several Docker commands:
    21  
    22  * `docker ps` - Lists containers.
    23  * `docker logs` - Shows us the standard output of a container.
    24  * `docker stop` - Stops running containers.
    25  
    26  > **Tip:**
    27  > Another way to learn about `docker` commands is our
    28  > [interactive tutorial](https://www.docker.com/tryit/).
    29  
    30  The `docker` client is pretty simple. Each action you can take
    31  with Docker is a command and each command can take a series of
    32  flags and arguments.
    33  
    34      # Usage:  [sudo] docker [command] [flags] [arguments] ..
    35      # Example:
    36      $ docker run -i -t ubuntu /bin/bash
    37  
    38  Let's see this in action by using the `docker version` command to return
    39  version information on the currently installed Docker client and daemon.
    40  
    41      $ docker version
    42  
    43  This command will not only provide you the version of Docker client and
    44  daemon you are using, but also the version of Go (the programming
    45  language powering Docker).
    46  
    47      Client version: 0.8.0
    48      Go version (client): go1.2
    49  
    50      Git commit (client): cc3a8c8
    51      Server version: 0.8.0
    52  
    53      Git commit (server): cc3a8c8
    54      Go version (server): go1.2
    55  
    56      Last stable version: 0.8.0
    57  
    58  ## Get Docker command help
    59  
    60  You can display the help for specific Docker commands. The help details the
    61  options and their usage. To see a list of all the possible commands, use the
    62  following:
    63  
    64      $ docker --help
    65  
    66  To see usage for a specific command, specify the command with the `--help` flag:
    67  
    68      $ docker attach --help
    69  
    70      Usage: docker attach [OPTIONS] CONTAINER
    71  
    72      Attach to a running container
    73  
    74        --help=false        Print usage
    75        --no-stdin=false    Do not attach stdin
    76        --sig-proxy=true    Proxy all received signals to the process
    77  
    78  > **Note:** 
    79  > For further details and examples of each command, see the
    80  > [command reference](/reference/commandline/cli/) in this guide.
    81  
    82  ## Running a web application in Docker
    83  
    84  So now we've learnt a bit more about the `docker` client let's move onto
    85  the important stuff: running more containers. So far none of the
    86  containers we've run did anything particularly useful though. So let's
    87  build on that experience by running an example web application in
    88  Docker.
    89  
    90  For our web application we're going to run a Python Flask application.
    91  Let's start with a `docker run` command.
    92  
    93      $ docker run -d -P training/webapp python app.py
    94  
    95  Let's review what our command did. We've specified two flags: `-d` and
    96  `-P`. We've already seen the `-d` flag which tells Docker to run the
    97  container in the background. The `-P` flag is new and tells Docker to
    98  map any required network ports inside our container to our host. This
    99  lets us view our web application.
   100  
   101  We've specified an image: `training/webapp`. This image is a
   102  pre-built image we've created that contains a simple Python Flask web
   103  application.
   104  
   105  Lastly, we've specified a command for our container to run: `python app.py`. This launches our web application.
   106  
   107  > **Note:** 
   108  > You can see more detail on the `docker run` command in the [command
   109  > reference](/reference/commandline/cli/#run) and the [Docker Run
   110  > Reference](/reference/run/).
   111  
   112  ## Viewing our web application container
   113  
   114  Now let's see our running container using the `docker ps` command.
   115  
   116      $ docker ps -l
   117      CONTAINER ID  IMAGE                   COMMAND       CREATED        STATUS        PORTS                    NAMES
   118      bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  nostalgic_morse
   119  
   120  You can see we've specified a new flag, `-l`, for the `docker ps`
   121  command. This tells the `docker ps` command to return the details of the
   122  *last* container started.
   123  
   124  > **Note:** 
   125  > By default, the `docker ps` command only shows information about running
   126  > containers. If you want to see stopped containers too use the `-a` flag.
   127  
   128  We can see the same details we saw [when we first Dockerized a
   129  container](/userguide/dockerizing) with one important addition in the `PORTS`
   130  column.
   131  
   132      PORTS
   133      0.0.0.0:49155->5000/tcp
   134  
   135  When we passed the `-P` flag to the `docker run` command Docker mapped any
   136  ports exposed in our image to our host.
   137  
   138  > **Note:** 
   139  > We'll learn more about how to expose ports in Docker images when
   140  > [we learn how to build images](/userguide/dockerimages).
   141  
   142  In this case Docker has exposed port 5000 (the default Python Flask
   143  port) on port 49155.
   144  
   145  Network port bindings are very configurable in Docker. In our last example the
   146  `-P` flag is a shortcut for `-p 5000` that maps port 5000 inside the container
   147  to a high port (from *ephemeral port range* which typically ranges from 32768
   148  to 61000) on the local Docker host. We can also bind Docker containers to
   149  specific ports using the `-p` flag, for example:
   150  
   151      $ docker run -d -p 80:5000 training/webapp python app.py
   152  
   153  This would map port 5000 inside our container to port 80 on our local
   154  host. You might be asking about now: why wouldn't we just want to always
   155  use 1:1 port mappings in Docker containers rather than mapping to high
   156  ports? Well 1:1 mappings have the constraint of only being able to map
   157  one of each port on your local host. Let's say you want to test two
   158  Python applications: both bound to port 5000 inside their own containers.
   159  Without Docker's port mapping you could only access one at a time on the
   160  Docker host.
   161  
   162  So let's now browse to port 49155 in a web browser to
   163  see the application.
   164  
   165  ![Viewing the web application](/userguide/webapp1.png).
   166  
   167  Our Python application is live!
   168  
   169  > **Note:**
   170  > If you have used the `boot2docker` virtual machine on OS X, Windows or Linux,
   171  > you'll need to get the IP of the virtual host instead of using localhost.
   172  > You can do this by running the following outside of the `boot2docker` shell
   173  > (i.e., from your comment line or terminal application).
   174  > 
   175  >     $ boot2docker ip
   176  >     The VM's Host only interface IP address is: 192.168.59.103
   177  > 
   178  > In this case you'd browse to http://192.168.59.103:49155 for the above example.
   179  
   180  ## A network port shortcut
   181  
   182  Using the `docker ps` command to return the mapped port is a bit clumsy so
   183  Docker has a useful shortcut we can use: `docker port`. To use `docker port` we
   184  specify the ID or name of our container and then the port for which we need the
   185  corresponding public-facing port.
   186  
   187      $ docker port nostalgic_morse 5000
   188      0.0.0.0:49155
   189  
   190  In this case we've looked up what port is mapped externally to port 5000 inside
   191  the container.
   192  
   193  ## Viewing the web application's logs
   194  
   195  Let's also find out a bit more about what's happening with our application and
   196  use another of the commands we've learnt, `docker logs`.
   197  
   198      $ docker logs -f nostalgic_morse
   199      * Running on http://0.0.0.0:5000/
   200      10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 -
   201      10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 -
   202  
   203  This time though we've added a new flag, `-f`. This causes the `docker
   204  logs` command to act like the `tail -f` command and watch the
   205  container's standard out. We can see here the logs from Flask showing
   206  the application running on port 5000 and the access log entries for it.
   207  
   208  ## Looking at our web application container's processes
   209  
   210  In addition to the container's logs we can also examine the processes
   211  running inside it using the `docker top` command.
   212  
   213      $ docker top nostalgic_morse
   214      PID                 USER                COMMAND
   215      854                 root                python app.py
   216  
   217  Here we can see our `python app.py` command is the only process running inside
   218  the container.
   219  
   220  ## Inspecting our web application container
   221  
   222  Lastly, we can take a low-level dive into our Docker container using the
   223  `docker inspect` command. It returns a JSON hash of useful configuration
   224  and status information about Docker containers.
   225  
   226      $ docker inspect nostalgic_morse
   227  
   228  Let's see a sample of that JSON output.
   229  
   230      [{
   231          "ID": "bc533791f3f500b280a9626688bc79e342e3ea0d528efe3a86a51ecb28ea20",
   232          "Created": "2014-05-26T05:52:40.808952951Z",
   233          "Path": "python",
   234          "Args": [
   235             "app.py"
   236          ],
   237          "Config": {
   238             "Hostname": "bc533791f3f5",
   239             "Domainname": "",
   240             "User": "",
   241      . . .
   242  
   243  We can also narrow down the information we want to return by requesting a
   244  specific element, for example to return the container's IP address we would:
   245  
   246      $ docker inspect -f '{{ .NetworkSettings.IPAddress }}' nostalgic_morse
   247      172.17.0.5
   248  
   249  ## Stopping our web application container
   250  
   251  Okay we've seen web application working. Now let's stop it using the
   252  `docker stop` command and the name of our container: `nostalgic_morse`.
   253  
   254      $ docker stop nostalgic_morse
   255      nostalgic_morse
   256  
   257  We can now use the `docker ps` command to check if the container has
   258  been stopped.
   259  
   260      $ docker ps -l
   261  
   262  ## Restarting our web application container
   263  
   264  Oops! Just after you stopped the container you get a call to say another
   265  developer needs the container back. From here you have two choices: you
   266  can create a new container or restart the old one. Let's look at
   267  starting our previous container back up.
   268  
   269      $ docker start nostalgic_morse
   270      nostalgic_morse
   271  
   272  Now quickly run `docker ps -l` again to see the running container is
   273  back up or browse to the container's URL to see if the application
   274  responds.
   275  
   276  > **Note:** 
   277  > Also available is the `docker restart` command that runs a stop and
   278  > then start on the container.
   279  
   280  ## Removing our web application container
   281  
   282  Your colleague has let you know that they've now finished with the container
   283  and won't need it again. So let's remove it using the `docker rm` command.
   284  
   285      $ docker rm nostalgic_morse
   286      Error: Impossible to remove a running container, please stop it first or use -f
   287      2014/05/24 08:12:56 Error: failed to remove one or more containers
   288  
   289  What happened? We can't actually remove a running container. This protects
   290  you from accidentally removing a running container you might need. Let's try
   291  this again by stopping the container first.
   292  
   293      $ docker stop nostalgic_morse
   294      nostalgic_morse
   295      $ docker rm nostalgic_morse
   296      nostalgic_morse
   297  
   298  And now our container is stopped and deleted.
   299  
   300  > **Note:**
   301  > Always remember that deleting a container is final!
   302  
   303  # Next steps
   304  
   305  Until now we've only used images that we've downloaded from
   306  [Docker Hub](https://hub.docker.com) now let's get introduced to
   307  building and sharing our own images.
   308  
   309  Go to [Working with Docker Images](/userguide/dockerimages).
   310