github.com/boynux/docker@v1.11.0-rc4/docs/userguide/networking/default_network/dockerlinks.md (about)

     1  <!--[metadata]>
     2  +++
     3  title = "Legacy container links"
     4  description = "Learn how to connect Docker containers together."
     5  keywords = ["Examples, Usage, user guide, links, linking, docker, documentation, examples, names, name, container naming, port, map, network port,  network"]
     6  [menu.main]
     7  parent = "smn_networking_def"
     8  weight=-2
     9  +++
    10  <![end-metadata]-->
    11  
    12  # Legacy container links
    13  
    14  The information in this section explains legacy container links within the Docker default bridge. This is a `bridge` network named `bridge` created automatically when you install Docker. 
    15  
    16  Before the [Docker networks feature](../dockernetworks.md), you could use the
    17  Docker link feature to allow containers to discover each other and securely
    18  transfer information about one container to another container. With the
    19  introduction of the Docker networks feature, you can still create links but they
    20  behave differently between default `bridge` network and
    21  [user defined networks](../work-with-networks.md#linking-containers-in-user-defined-networks)
    22  
    23  This section briefly discusses connecting via a network port and then goes into
    24  detail on container linking in default `bridge` network.
    25  
    26  ## Connect using network port mapping
    27  
    28  In [the Using Docker section](../../containers/usingdocker.md), you created a
    29  container that ran a Python Flask application:
    30  
    31      $ docker run -d -P training/webapp python app.py
    32  
    33  > **Note:**
    34  > Containers have an internal network and an IP address
    35  > (as we saw when we used the `docker inspect` command to show the container's
    36  > IP address in the [Using Docker](../../containers/usingdocker.md) section).
    37  > Docker can have a variety of network configurations. You can see more
    38  > information on Docker networking [here](../index.md).
    39  
    40  When that container was created, the `-P` flag was used to automatically map
    41  any network port inside it to a random high port within an *ephemeral port
    42  range* on your Docker host. Next, when `docker ps` was run, you saw that port
    43  5000 in the container was bound to port 49155 on the host.
    44  
    45      $ docker ps nostalgic_morse
    46      CONTAINER ID  IMAGE                   COMMAND       CREATED        STATUS        PORTS                    NAMES
    47      bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  nostalgic_morse
    48  
    49  You also saw how you can bind a container's ports to a specific port using
    50  the `-p` flag. Here port 80 of the host is mapped to port 5000 of the
    51  container:
    52  
    53      $ docker run -d -p 80:5000 training/webapp python app.py
    54  
    55  And you saw why this isn't such a great idea because it constrains you to
    56  only one container on that specific port.
    57  
    58  Instead, you may specify a range of host ports to bind a container port to
    59  that is different than the default *ephemeral port range*:
    60  
    61      $ docker run -d -p 8000-9000:5000 training/webapp python app.py
    62  
    63  This would bind port 5000 in the container to a randomly available port
    64  between 8000 and 9000 on the host.
    65  
    66  There are also a few other ways you can configure the `-p` flag. By
    67  default the `-p` flag will bind the specified port to all interfaces on
    68  the host machine. But you can also specify a binding to a specific
    69  interface, for example only to the `localhost`.
    70  
    71      $ docker run -d -p 127.0.0.1:80:5000 training/webapp python app.py
    72  
    73  This would bind port 5000 inside the container to port 80 on the
    74  `localhost` or `127.0.0.1` interface on the host machine.
    75  
    76  Or, to bind port 5000 of the container to a dynamic port but only on the
    77  `localhost`, you could use:
    78  
    79      $ docker run -d -p 127.0.0.1::5000 training/webapp python app.py
    80  
    81  You can also bind UDP ports by adding a trailing `/udp`. For example:
    82  
    83      $ docker run -d -p 127.0.0.1:80:5000/udp training/webapp python app.py
    84  
    85  You also learned about the useful `docker port` shortcut which showed us the
    86  current port bindings. This is also useful for showing you specific port
    87  configurations. For example, if you've bound the container port to the
    88  `localhost` on the host machine, then the `docker port` output will reflect that.
    89  
    90      $ docker port nostalgic_morse 5000
    91      127.0.0.1:49155
    92  
    93  > **Note:**
    94  > The `-p` flag can be used multiple times to configure multiple ports.
    95  
    96  ## Connect with the linking system
    97  
    98  > **Note**:
    99  > This section covers the legacy link feature in the default `bridge` network.
   100  > Please refer to [linking containers in user-defined networks]
   101  > (../work-with-networks.md#linking-containers-in-user-defined-networks)
   102  > for more information on links in user-defined networks.
   103  
   104  Network port mappings are not the only way Docker containers can connect to one
   105  another. Docker also has a linking system that allows you to link multiple
   106  containers together and send connection information from one to another. When
   107  containers are linked, information about a source container can be sent to a
   108  recipient container. This allows the recipient to see selected data describing
   109  aspects of the source container.
   110  
   111  ### The importance of naming
   112  
   113  To establish links, Docker relies on the names of your containers.
   114  You've already seen that each container you create has an automatically
   115  created name; indeed you've become familiar with our old friend
   116  `nostalgic_morse` during this guide. You can also name containers
   117  yourself. This naming provides two useful functions:
   118  
   119  1. It can be useful to name containers that do specific functions in a way
   120     that makes it easier for you to remember them, for example naming a
   121     container containing a web application `web`.
   122  
   123  2. It provides Docker with a reference point that allows it to refer to other
   124     containers, for example, you can specify to link the container `web` to container `db`.
   125  
   126  You can name your container by using the `--name` flag, for example:
   127  
   128      $ docker run -d -P --name web training/webapp python app.py
   129  
   130  This launches a new container and uses the `--name` flag to
   131  name the container `web`. You can see the container's name using the
   132  `docker ps` command.
   133  
   134      $ docker ps -l
   135      CONTAINER ID  IMAGE                  COMMAND        CREATED       STATUS       PORTS                    NAMES
   136      aed84ee21bde  training/webapp:latest python app.py  12 hours ago  Up 2 seconds 0.0.0.0:49154->5000/tcp  web
   137  
   138  You can also use `docker inspect` to return the container's name.
   139  
   140  
   141  > **Note:**
   142  > Container names have to be unique. That means you can only call
   143  > one container `web`. If you want to re-use a container name you must delete
   144  > the old container (with `docker rm`) before you can create a new
   145  > container with the same name. As an alternative you can use the `--rm`
   146  > flag with the `docker run` command. This will delete the container
   147  > immediately after it is stopped.
   148  
   149  ## Communication across links
   150  
   151  Links allow containers to discover each other and securely transfer information
   152  about one container to another container. When you set up a link, you create a
   153  conduit between a source container and a recipient container. The recipient can
   154  then access select data about the source. To create a link, you use the `--link`
   155  flag. First, create a new container, this time one containing a database.
   156  
   157      $ docker run -d --name db training/postgres
   158  
   159  This creates a new container called `db` from the `training/postgres`
   160  image, which contains a PostgreSQL database.
   161  
   162  Now, you need to delete the `web` container you created previously so you can replace it
   163  with a linked one:
   164  
   165      $ docker rm -f web
   166  
   167  Now, create a new `web` container and link it with your `db` container.
   168  
   169      $ docker run -d -P --name web --link db:db training/webapp python app.py
   170  
   171  This will link the new `web` container with the `db` container you created
   172  earlier. The `--link` flag takes the form:
   173  
   174      --link <name or id>:alias
   175  
   176  Where `name` is the name of the container we're linking to and `alias` is an
   177  alias for the link name. You'll see how that alias gets used shortly.
   178  The `--link` flag also takes the form:
   179  
   180  	--link <name or id>
   181  
   182  In which case the alias will match the name. You could have written the previous
   183  example as:
   184  
   185      $ docker run -d -P --name web --link db training/webapp python app.py
   186  
   187  Next, inspect your linked containers with `docker inspect`:
   188  
   189      $ docker inspect -f "{{ .HostConfig.Links }}" web
   190      [/db:/web/db]
   191  
   192  You can see that the `web` container is now linked to the `db` container
   193  `web/db`. Which allows it to access information about the `db` container.
   194  
   195  So what does linking the containers actually do? You've learned that a link allows a
   196  source container to provide information about itself to a recipient container. In
   197  our example, the recipient, `web`, can access information about the source `db`. To do
   198  this, Docker creates a secure tunnel between the containers that doesn't need to
   199  expose any ports externally on the container; you'll note when we started the
   200  `db` container we did not use either the `-P` or `-p` flags. That's a big benefit of
   201  linking: we don't need to expose the source container, here the PostgreSQL database, to
   202  the network.
   203  
   204  Docker exposes connectivity information for the source container to the
   205  recipient container in two ways:
   206  
   207  * Environment variables,
   208  * Updating the `/etc/hosts` file.
   209  
   210  ### Environment variables
   211  
   212  Docker creates several environment variables when you link containers. Docker
   213  automatically creates environment variables in the target container based on
   214  the `--link` parameters.  It will also expose all environment variables
   215  originating from Docker from the source container. These include variables from:
   216  
   217  * the `ENV` commands in the source container's Dockerfile
   218  * the `-e`, `--env` and `--env-file` options on the `docker run`
   219  command when the source container is started
   220  
   221  These environment variables enable programmatic discovery from within the
   222  target container of information related to the source container.
   223  
   224  > **Warning**:
   225  > It is important to understand that *all* environment variables originating
   226  > from Docker within a container are made available to *any* container
   227  > that links to it. This could have serious security implications if sensitive
   228  > data is stored in them.
   229  
   230  Docker sets an `<alias>_NAME` environment variable for each target container
   231  listed in the `--link` parameter. For example, if a new container called
   232  `web` is linked to a database container called `db` via `--link db:webdb`,
   233  then Docker creates a `WEBDB_NAME=/web/webdb` variable in the `web` container.
   234  
   235  Docker also defines a set of environment variables for each port exposed by the
   236  source container.  Each variable has a unique prefix in the form:
   237  
   238  `<name>_PORT_<port>_<protocol>`
   239  
   240  The components in this prefix are:
   241  
   242  * the alias `<name>` specified in the `--link` parameter (for example, `webdb`)
   243  * the `<port>` number exposed
   244  * a `<protocol>` which is either TCP or UDP
   245  
   246  Docker uses this prefix format to define three distinct environment variables:
   247  
   248  * The `prefix_ADDR` variable contains the IP Address from the URL, for
   249  example `WEBDB_PORT_5432_TCP_ADDR=172.17.0.82`.
   250  * The `prefix_PORT` variable contains just the port number from the URL for
   251  example `WEBDB_PORT_5432_TCP_PORT=5432`.
   252  * The `prefix_PROTO` variable contains just the protocol from the URL for
   253  example `WEBDB_PORT_5432_TCP_PROTO=tcp`.
   254  
   255  If the container exposes multiple ports, an environment variable set is
   256  defined for each one. This means, for example, if a container exposes 4 ports
   257  that Docker creates 12 environment variables, 3 for each port.
   258  
   259  Additionally, Docker creates an environment variable called `<alias>_PORT`.
   260  This variable contains the URL of the source container's first exposed port.
   261  The  'first' port is defined as the exposed port with the lowest number.
   262  For example, consider the `WEBDB_PORT=tcp://172.17.0.82:5432` variable.  If
   263  that port is used for both tcp and udp, then the tcp one is specified.
   264  
   265  Finally, Docker also exposes each Docker originated environment variable
   266  from the source container as an environment variable in the target. For each
   267  variable Docker creates an `<alias>_ENV_<name>` variable in the target
   268  container. The variable's value is set to the value Docker used when it
   269  started the source container.
   270  
   271  Returning back to our database example, you can run the `env`
   272  command to list the specified container's environment variables.
   273  
   274  ```
   275      $ docker run --rm --name web2 --link db:db training/webapp env
   276      . . .
   277      DB_NAME=/web2/db
   278      DB_PORT=tcp://172.17.0.5:5432
   279      DB_PORT_5432_TCP=tcp://172.17.0.5:5432
   280      DB_PORT_5432_TCP_PROTO=tcp
   281      DB_PORT_5432_TCP_PORT=5432
   282      DB_PORT_5432_TCP_ADDR=172.17.0.5
   283      . . .
   284  ```
   285  
   286  You can see that Docker has created a series of environment variables with
   287  useful information about the source `db` container. Each variable is prefixed
   288  with
   289  `DB_`, which is populated from the `alias` you specified above. If the `alias`
   290  were `db1`, the variables would be prefixed with `DB1_`. You can use these
   291  environment variables to configure your applications to connect to the database
   292  on the `db` container. The connection will be secure and private; only the
   293  linked `web` container will be able to talk to the `db` container.
   294  
   295  ### Important notes on Docker environment variables
   296  
   297  Unlike host entries in the [`/etc/hosts` file](#updating-the-etchosts-file),
   298  IP addresses stored in the environment variables are not automatically updated
   299  if the source container is restarted. We recommend using the host entries in
   300  `/etc/hosts` to resolve the IP address of linked containers.
   301  
   302  These environment variables are only set for the first process in the
   303  container. Some daemons, such as `sshd`, will scrub them when spawning shells
   304  for connection.
   305  
   306  ### Updating the `/etc/hosts` file
   307  
   308  In addition to the environment variables, Docker adds a host entry for the
   309  source container to the `/etc/hosts` file. Here's an entry for the `web`
   310  container:
   311  
   312      $ docker run -t -i --rm --link db:webdb training/webapp /bin/bash
   313      root@aed84ee21bde:/opt/webapp# cat /etc/hosts
   314      172.17.0.7  aed84ee21bde
   315      . . .
   316      172.17.0.5  webdb 6e5cdeb2d300 db
   317  
   318  You can see two relevant host entries. The first is an entry for the `web`
   319  container that uses the Container ID as a host name. The second entry uses the
   320  link alias to reference the IP address of the `db` container. In addition to
   321  the alias you provide, the linked container's name--if unique from the alias
   322  provided to the `--link` parameter--and the linked container's hostname will
   323  also be added in `/etc/hosts` for the linked container's IP address. You can ping
   324  that host now via any of these entries:
   325  
   326      root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping
   327      root@aed84ee21bde:/opt/webapp# ping webdb
   328      PING webdb (172.17.0.5): 48 data bytes
   329      56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms
   330      56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms
   331      56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms
   332  
   333  > **Note:**
   334  > In the example, you'll note you had to install `ping` because it was not included
   335  > in the container initially.
   336  
   337  Here, you used the `ping` command to ping the `db` container using its host entry,
   338  which resolves to `172.17.0.5`. You can use this host entry to configure an application
   339  to make use of your `db` container.
   340  
   341  > **Note:**
   342  > You can link multiple recipient containers to a single source. For
   343  > example, you could have multiple (differently named) web containers attached to your
   344  >`db` container.
   345  
   346  If you restart the source container, the linked containers `/etc/hosts` files
   347  will be automatically updated with the source container's new IP address,
   348  allowing linked communication to continue.
   349  
   350      $ docker restart db
   351      db
   352      $ docker run -t -i --rm --link db:db training/webapp /bin/bash
   353      root@aed84ee21bde:/opt/webapp# cat /etc/hosts
   354      172.17.0.7  aed84ee21bde
   355      . . .
   356      172.17.0.9  db
   357  
   358  # Related information