Initial commit
138
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/configure-dns.md
generated
vendored
Normal file
@@ -0,0 +1,138 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
title = "Configure container DNS in user-defined networks"
|
||||
description = "Learn how to configure DNS in user-defined networks"
|
||||
keywords = ["docker, DNS, network"]
|
||||
[menu.main]
|
||||
parent = "smn_networking"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Embedded DNS server in user-defined networks
|
||||
|
||||
The information in this section covers the embedded DNS server operation for
|
||||
containers in user-defined networks. DNS lookup for containers connected to
|
||||
user-defined networks works differently compared to the containers connected
|
||||
to `default bridge` network.
|
||||
|
||||
> **Note**: In order to maintain backward compatibility, the DNS configuration
|
||||
> in `default bridge` network is retained with no behaviorial change.
|
||||
> Please refer to the [DNS in default bridge network](default_network/configure-dns.md)
|
||||
> for more information on DNS configuration in the `default bridge` network.
|
||||
|
||||
As of Docker 1.10, the docker daemon implements an embedded DNS server which
|
||||
provides built-in service discovery for any container created with a valid
|
||||
`name` or `net-alias` or aliased by `link`. The exact details of how Docker
|
||||
manages the DNS configurations inside the container can change from one Docker
|
||||
version to the next. So you should not assume the way the files such as
|
||||
`/etc/hosts`, `/etc/resolv.conf` are managed inside the containers and leave
|
||||
the files alone and use the following Docker options instead.
|
||||
|
||||
Various container options that affect container domain name services.
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<code>--name=CONTAINER-NAME</code>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Container name configured using <code>--name</code> is used to discover a container within
|
||||
an user-defined docker network. The embedded DNS server maintains the mapping between
|
||||
the container name and its IP address (on the network the container is connected to).
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<code>--net-alias=ALIAS</code>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
In addition to <code>--name</code> as described above, a container is discovered by one or more
|
||||
of its configured <code>--net-alias</code> (or <code>--alias</code> in <code>docker network connect</code> command)
|
||||
within the user-defined network. The embedded DNS server maintains the mapping between
|
||||
all of the container aliases and its IP address on a specific user-defined network.
|
||||
A container can have different aliases in different networks by using the <code>--alias</code>
|
||||
option in <code>docker network connect</code> command.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<code>--link=CONTAINER_NAME:ALIAS</code>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Using this option as you <code>run</code> a container gives the embedded DNS
|
||||
an extra entry named <code>ALIAS</code> that points to the IP address
|
||||
of the container identified by <code>CONTAINER_NAME</code>. When using <code>--link</code>
|
||||
the embedded DNS will guarantee that localized lookup result only on that
|
||||
container where the <code>--link</code> is used. This lets processes inside the new container
|
||||
connect to container without without having to know its name or IP.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p>
|
||||
<code>--dns=[IP_ADDRESS...]</code>
|
||||
</p></td>
|
||||
<td><p>
|
||||
The IP addresses passed via the <code>--dns</code> option is used by the embedded DNS
|
||||
server to forward the DNS query if embedded DNS server is unable to resolve a name
|
||||
resolution request from the containers.
|
||||
These <code>--dns</code> IP addresses are managed by the embedded DNS server and
|
||||
will not be updated in the container's <code>/etc/resolv.conf</code> file.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p>
|
||||
<code>--dns-search=DOMAIN...</code>
|
||||
</p></td>
|
||||
<td><p>
|
||||
Sets the domain names that are searched when a bare unqualified hostname is
|
||||
used inside of the container. These <code>--dns-search</code> options are managed by the
|
||||
embedded DNS server and will not be updated in the container's <code>/etc/resolv.conf</code> file.
|
||||
When a container process attempts to access <code>host</code> and the search
|
||||
domain <code>example.com</code> is set, for instance, the DNS logic will not only
|
||||
look up <code>host</code> but also <code>host.example.com</code>.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p>
|
||||
<code>--dns-opt=OPTION...</code>
|
||||
</p></td>
|
||||
<td><p>
|
||||
Sets the options used by DNS resolvers. These options are managed by the embedded
|
||||
DNS server and will not be updated in the container's <code>/etc/resolv.conf</code> file.
|
||||
</p>
|
||||
<p>
|
||||
See documentation for <code>resolv.conf</code> for a list of valid options
|
||||
</p></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
In the absence of the `--dns=IP_ADDRESS...`, `--dns-search=DOMAIN...`, or
|
||||
`--dns-opt=OPTION...` options, Docker uses the `/etc/resolv.conf` of the
|
||||
host machine (where the `docker` daemon runs). While doing so the daemon
|
||||
filters out all localhost IP address `nameserver` entries from the host's
|
||||
original file.
|
||||
|
||||
Filtering is necessary because all localhost addresses on the host are
|
||||
unreachable from the container's network. After this filtering, if there are
|
||||
no more `nameserver` entries left in the container's `/etc/resolv.conf` file,
|
||||
the daemon adds public Google DNS nameservers (8.8.8.8 and 8.8.4.4) to the
|
||||
container's DNS configuration. If IPv6 is enabled on the daemon, the public
|
||||
IPv6 Google DNS nameservers will also be added (2001:4860:4860::8888 and
|
||||
2001:4860:4860::8844).
|
||||
|
||||
> **Note**: If you need access to a host's localhost resolver, you must modify
|
||||
> your DNS service on the host to listen on a non-localhost address that is
|
||||
> reachable from within the container.
|
||||
103
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/binding.md
generated
vendored
Normal file
@@ -0,0 +1,103 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
title = "Bind container ports to the host"
|
||||
description = "expose, port, docker, bind publish"
|
||||
keywords = ["Examples, Usage, network, docker, documentation, user guide, multihost, cluster"]
|
||||
[menu.main]
|
||||
parent = "smn_networking_def"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Bind container ports to the host
|
||||
|
||||
The information in this section explains binding container ports within the Docker default bridge. This is a `bridge` network named `bridge` created automatically when you install Docker.
|
||||
|
||||
> **Note**: The [Docker networks feature](../dockernetworks.md) allows you to
|
||||
create user-defined networks in addition to the default bridge network.
|
||||
|
||||
By default Docker containers can make connections to the outside world, but the
|
||||
outside world cannot connect to containers. Each outgoing connection will
|
||||
appear to originate from one of the host machine's own IP addresses thanks to an
|
||||
`iptables` masquerading rule on the host machine that the Docker server creates
|
||||
when it starts:
|
||||
|
||||
```
|
||||
$ sudo iptables -t nat -L -n
|
||||
...
|
||||
Chain POSTROUTING (policy ACCEPT)
|
||||
target prot opt source destination
|
||||
MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
|
||||
...
|
||||
```
|
||||
The Docker server creates a masquerade rule that let containers connect to IP
|
||||
addresses in the outside world.
|
||||
|
||||
If you want containers to accept incoming connections, you will need to provide
|
||||
special options when invoking `docker run`. There are two approaches.
|
||||
|
||||
First, you can supply `-P` or `--publish-all=true|false` to `docker run` which
|
||||
is a blanket operation that identifies every port with an `EXPOSE` line in the
|
||||
image's `Dockerfile` or `--expose <port>` commandline flag and maps it to a host
|
||||
port somewhere within an _ephemeral port range_. The `docker port` command then
|
||||
needs to be used to inspect created mapping. The _ephemeral port range_ is
|
||||
configured by `/proc/sys/net/ipv4/ip_local_port_range` kernel parameter,
|
||||
typically ranging from 32768 to 61000.
|
||||
|
||||
Mapping can be specified explicitly using `-p SPEC` or `--publish=SPEC` option.
|
||||
It allows you to particularize which port on docker server - which can be any
|
||||
port at all, not just one within the _ephemeral port range_ -- you want mapped
|
||||
to which port in the container.
|
||||
|
||||
Either way, you should be able to peek at what Docker has accomplished in your
|
||||
network stack by examining your NAT tables.
|
||||
|
||||
```
|
||||
# What your NAT rules might look like when Docker
|
||||
# is finished setting up a -P forward:
|
||||
|
||||
$ iptables -t nat -L -n
|
||||
...
|
||||
Chain DOCKER (2 references)
|
||||
target prot opt source destination
|
||||
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:172.17.0.2:80
|
||||
|
||||
# What your NAT rules might look like when Docker
|
||||
# is finished setting up a -p 80:80 forward:
|
||||
|
||||
Chain DOCKER (2 references)
|
||||
target prot opt source destination
|
||||
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80
|
||||
```
|
||||
|
||||
You can see that Docker has exposed these container ports on `0.0.0.0`, the
|
||||
wildcard IP address that will match any possible incoming port on the host
|
||||
machine. If you want to be more restrictive and only allow container services to
|
||||
be contacted through a specific external interface on the host machine, you have
|
||||
two choices. When you invoke `docker run` you can use either `-p
|
||||
IP:host_port:container_port` or `-p IP::port` to specify the external interface
|
||||
for one particular binding.
|
||||
|
||||
Or if you always want Docker port forwards to bind to one specific IP address,
|
||||
you can edit your system-wide Docker server settings and add the option
|
||||
`--ip=IP_ADDRESS`. Remember to restart your Docker server after editing this
|
||||
setting.
|
||||
|
||||
> **Note**: With hairpin NAT enabled (`--userland-proxy=false`), containers port
|
||||
exposure is achieved purely through iptables rules, and no attempt to bind the
|
||||
exposed port is ever made. This means that nothing prevents shadowing a
|
||||
previously listening service outside of Docker through exposing the same port
|
||||
for a container. In such conflicting situation, Docker created iptables rules
|
||||
will take precedence and route to the container.
|
||||
|
||||
The `--userland-proxy` parameter, true by default, provides a userland
|
||||
implementation for inter-container and outside-to-container communication. When
|
||||
disabled, Docker uses both an additional `MASQUERADE` iptable rule and the
|
||||
`net.ipv4.route_localnet` kernel parameter which allow the host machine to
|
||||
connect to a local container exposed port through the commonly used loopback
|
||||
address: this alternative is preferred for performance reasons.
|
||||
|
||||
## Related information
|
||||
|
||||
- [Understand Docker container networks](../dockernetworks.md)
|
||||
- [Work with network commands](../work-with-networks.md)
|
||||
- [Legacy container links](dockerlinks.md)
|
||||
78
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/build-bridges.md
generated
vendored
Normal file
@@ -0,0 +1,78 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
title = "Build your own bridge"
|
||||
description = "Learn how to build your own bridge interface"
|
||||
keywords = ["docker, bridge, docker0, network"]
|
||||
[menu.main]
|
||||
parent = "smn_networking_def"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Build your own bridge
|
||||
|
||||
This section explains how to build your own bridge to replace the Docker default
|
||||
bridge. This is a `bridge` network named `bridge` created automatically when you
|
||||
install Docker.
|
||||
|
||||
> **Note**: The [Docker networks feature](../dockernetworks.md) allows you to
|
||||
create user-defined networks in addition to the default bridge network.
|
||||
|
||||
You can set up your own bridge before starting Docker and use `-b BRIDGE` or
|
||||
`--bridge=BRIDGE` to tell Docker to use your bridge instead. If you already
|
||||
have Docker up and running with its default `docker0` still configured,
|
||||
you can directly create your bridge and restart Docker with it or want to begin by
|
||||
stopping the service and removing the interface:
|
||||
|
||||
```
|
||||
# Stopping Docker and removing docker0
|
||||
|
||||
$ sudo service docker stop
|
||||
$ sudo ip link set dev docker0 down
|
||||
$ sudo brctl delbr docker0
|
||||
$ sudo iptables -t nat -F POSTROUTING
|
||||
```
|
||||
|
||||
Then, before starting the Docker service, create your own bridge and give it
|
||||
whatever configuration you want. Here we will create a simple enough bridge
|
||||
that we really could just have used the options in the previous section to
|
||||
customize `docker0`, but it will be enough to illustrate the technique.
|
||||
|
||||
```
|
||||
# Create our own bridge
|
||||
|
||||
$ sudo brctl addbr bridge0
|
||||
$ sudo ip addr add 192.168.5.1/24 dev bridge0
|
||||
$ sudo ip link set dev bridge0 up
|
||||
|
||||
# Confirming that our bridge is up and running
|
||||
|
||||
$ ip addr show bridge0
|
||||
4: bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default
|
||||
link/ether 66:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff
|
||||
inet 192.168.5.1/24 scope global bridge0
|
||||
valid_lft forever preferred_lft forever
|
||||
|
||||
# Tell Docker about it and restart (on Ubuntu)
|
||||
|
||||
$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
|
||||
$ sudo service docker start
|
||||
|
||||
# Confirming new outgoing NAT masquerade is set up
|
||||
|
||||
$ sudo iptables -t nat -L -n
|
||||
...
|
||||
Chain POSTROUTING (policy ACCEPT)
|
||||
target prot opt source destination
|
||||
MASQUERADE all -- 192.168.5.0/24 0.0.0.0/0
|
||||
```
|
||||
|
||||
The result should be that the Docker server starts successfully and is now
|
||||
prepared to bind containers to the new bridge. After pausing to verify the
|
||||
bridge's configuration, try creating a container -- you will see that its IP
|
||||
address is in your new IP address range, which Docker will have auto-detected.
|
||||
|
||||
You can use the `brctl show` command to see Docker add and remove interfaces
|
||||
from the bridge as you start and stop containers, and can run `ip addr` and `ip
|
||||
route` inside a container to see that it has been given an address in the
|
||||
bridge's IP address range and has been told to use the Docker host's IP address
|
||||
on the bridge as its default gateway to the rest of the Internet.
|
||||
132
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/configure-dns.md
generated
vendored
Normal file
@@ -0,0 +1,132 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
title = "Configure container DNS"
|
||||
description = "Learn how to configure DNS in Docker"
|
||||
keywords = ["docker, bridge, docker0, network"]
|
||||
[menu.main]
|
||||
parent = "smn_networking_def"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Configure container DNS
|
||||
|
||||
The information in this section explains configuring container DNS within
|
||||
the Docker default bridge. This is a `bridge` network named `bridge` created
|
||||
automatically when you install Docker.
|
||||
|
||||
> **Note**: The [Docker networks feature](../dockernetworks.md) allows you to create user-defined networks in addition to the default bridge network. Please refer to the [Docker Embedded DNS](../configure-dns.md) section for more information on DNS configurations in user-defined networks.
|
||||
|
||||
How can Docker supply each container with a hostname and DNS configuration, without having to build a custom image with the hostname written inside? Its trick is to overlay three crucial `/etc` files inside the container with virtual files where it can write fresh information. You can see this by running `mount` inside a container:
|
||||
|
||||
```
|
||||
$$ mount
|
||||
...
|
||||
/dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ...
|
||||
/dev/disk/by-uuid/1fec...ebdf on /etc/hosts type ext4 ...
|
||||
/dev/disk/by-uuid/1fec...ebdf on /etc/resolv.conf type ext4 ...
|
||||
...
|
||||
```
|
||||
|
||||
This arrangement allows Docker to do clever things like keep `resolv.conf` up to date across all containers when the host machine receives new configuration over DHCP later. The exact details of how Docker maintains these files inside the container can change from one Docker version to the next, so you should leave the files themselves alone and use the following Docker options instead.
|
||||
|
||||
Four different options affect container domain name services.
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<code>-h HOSTNAME</code> or <code>--hostname=HOSTNAME</code>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Sets the hostname by which the container knows itself. This is written
|
||||
into <code>/etc/hostname</code>, into <code>/etc/hosts</code> as the name
|
||||
of the container's host-facing IP address, and is the name that
|
||||
<code>/bin/bash</code> inside the container will display inside its
|
||||
prompt. But the hostname is not easy to see from outside the container.
|
||||
It will not appear in <code>docker ps</code> nor in the
|
||||
<code>/etc/hosts</code> file of any other container.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<code>--link=CONTAINER_NAME</code> or <code>ID:ALIAS</code>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Using this option as you <code>run</code> a container gives the new
|
||||
container's <code>/etc/hosts</code> an extra entry named
|
||||
<code>ALIAS</code> that points to the IP address of the container
|
||||
identified by <code>CONTAINER_NAME_or_ID<c/ode>. This lets processes
|
||||
inside the new container connect to the hostname <code>ALIAS</code>
|
||||
without having to know its IP. The <code>--link=</code> option is
|
||||
discussed in more detail below. Because Docker may assign a different IP
|
||||
address to the linked containers on restart, Docker updates the
|
||||
<code>ALIAS</code> entry in the <code>/etc/hosts</code> file of the
|
||||
recipient containers.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p>
|
||||
<code>--dns=IP_ADDRESS...</code>
|
||||
</p></td>
|
||||
<td><p>
|
||||
Sets the IP addresses added as <code>server</code> lines to the container's
|
||||
<code>/etc/resolv.conf</code> file. Processes in the container, when
|
||||
confronted with a hostname not in <code>/etc/hosts</code>, will connect to
|
||||
these IP addresses on port 53 looking for name resolution services. </p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p>
|
||||
<code>--dns-search=DOMAIN...</code>
|
||||
</p></td>
|
||||
<td><p>
|
||||
Sets the domain names that are searched when a bare unqualified hostname is
|
||||
used inside of the container, by writing <code>search</code> lines into the
|
||||
container's <code>/etc/resolv.conf</code>. When a container process attempts
|
||||
to access <code>host</code> and the search domain <code>example.com</code>
|
||||
is set, for instance, the DNS logic will not only look up <code>host</code>
|
||||
but also <code>host.example.com</code>.
|
||||
</p>
|
||||
<p>
|
||||
Use <code>--dns-search=.</code> if you don't wish to set the search domain.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p>
|
||||
<code>--dns-opt=OPTION...</code>
|
||||
</p></td>
|
||||
<td><p>
|
||||
Sets the options used by DNS resolvers by writing an <code>options<code>
|
||||
line into the container's <code>/etc/resolv.conf<code>.
|
||||
</p>
|
||||
<p>
|
||||
See documentation for <code>resolv.conf<code> for a list of valid options
|
||||
</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p></p></td>
|
||||
<td><p></p></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
Regarding DNS settings, in the absence of the `--dns=IP_ADDRESS...`, `--dns-search=DOMAIN...`, or `--dns-opt=OPTION...` options, Docker makes each container's `/etc/resolv.conf` look like the `/etc/resolv.conf` of the host machine (where the `docker` daemon runs). When creating the container's `/etc/resolv.conf`, the daemon filters out all localhost IP address `nameserver` entries from the host's original file.
|
||||
|
||||
Filtering is necessary because all localhost addresses on the host are unreachable from the container's network. After this filtering, if there are no more `nameserver` entries left in the container's `/etc/resolv.conf` file, the daemon adds public Google DNS nameservers (8.8.8.8 and 8.8.4.4) to the container's DNS configuration. If IPv6 is enabled on the daemon, the public IPv6 Google DNS nameservers will also be added (2001:4860:4860::8888 and 2001:4860:4860::8844).
|
||||
|
||||
> **Note**: If you need access to a host's localhost resolver, you must modify your DNS service on the host to listen on a non-localhost address that is reachable from within the container.
|
||||
|
||||
You might wonder what happens when the host machine's `/etc/resolv.conf` file changes. The `docker` daemon has a file change notifier active which will watch for changes to the host DNS configuration.
|
||||
|
||||
> **Note**: The file change notifier relies on the Linux kernel's inotify feature. Because this feature is currently incompatible with the overlay filesystem driver, a Docker daemon using "overlay" will not be able to take advantage of the `/etc/resolv.conf` auto-update feature.
|
||||
|
||||
When the host file changes, all stopped containers which have a matching `resolv.conf` to the host will be updated immediately to this newest host configuration. Containers which are running when the host configuration changes will need to stop and start to pick up the host changes due to lack of a facility to ensure atomic writes of the `resolv.conf` file while the container is running. If the container's `resolv.conf` has been edited since it was started with the default configuration, no replacement will be attempted as it would overwrite the changes performed by the container. If the options (`--dns`, `--dns-search`, or `--dns-opt`) have been used to modify the default host configuration, then the replacement with an updated host's `/etc/resolv.conf` will not happen as well.
|
||||
|
||||
> **Note**: For containers which were created prior to the implementation of the `/etc/resolv.conf` update feature in Docker 1.5.0: those containers will **not** receive updates when the host `resolv.conf` file changes. Only containers created with Docker 1.5.0 and above will utilize this auto-update feature.
|
||||
123
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/container-communication.md
generated
vendored
Normal file
@@ -0,0 +1,123 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
title = "Understand container communication"
|
||||
description = "Understand container communication"
|
||||
keywords = ["docker, container, communication, network"]
|
||||
[menu.main]
|
||||
parent = "smn_networking_def"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Understand container communication
|
||||
|
||||
The information in this section explains container communication within the
|
||||
Docker default bridge. This is a `bridge` network named `bridge` created
|
||||
automatically when you install Docker.
|
||||
|
||||
**Note**: The [Docker networks feature](../dockernetworks.md) allows you to create user-defined networks in addition to the default bridge network.
|
||||
|
||||
## Communicating to the outside world
|
||||
|
||||
Whether a container can talk to the world is governed by two factors. The first
|
||||
factor is whether the host machine is forwarding its IP packets. The second is
|
||||
whether the host's `iptables` allow this particular connection.
|
||||
|
||||
IP packet forwarding is governed by the `ip_forward` system parameter. Packets
|
||||
can only pass between containers if this parameter is `1`. Usually you will
|
||||
simply leave the Docker server at its default setting `--ip-forward=true` and
|
||||
Docker will go set `ip_forward` to `1` for you when the server starts up. If you
|
||||
set `--ip-forward=false` and your system's kernel has it enabled, the
|
||||
`--ip-forward=false` option has no effect. To check the setting on your kernel
|
||||
or to turn it on manually:
|
||||
```
|
||||
$ sysctl net.ipv4.conf.all.forwarding
|
||||
net.ipv4.conf.all.forwarding = 0
|
||||
$ sysctl net.ipv4.conf.all.forwarding=1
|
||||
$ sysctl net.ipv4.conf.all.forwarding
|
||||
net.ipv4.conf.all.forwarding = 1
|
||||
```
|
||||
|
||||
Many using Docker will want `ip_forward` to be on, to at least make
|
||||
communication _possible_ between containers and the wider world. May also be
|
||||
needed for inter-container communication if you are in a multiple bridge setup.
|
||||
|
||||
Docker will never make changes to your system `iptables` rules if you set
|
||||
`--iptables=false` when the daemon starts. Otherwise the Docker server will
|
||||
append forwarding rules to the `DOCKER` filter chain.
|
||||
|
||||
Docker will not delete or modify any pre-existing rules from the `DOCKER` filter
|
||||
chain. This allows the user to create in advance any rules required to further
|
||||
restrict access to the containers.
|
||||
|
||||
Docker's forward rules permit all external source IPs by default. To allow only
|
||||
a specific IP or network to access the containers, insert a negated rule at the
|
||||
top of the `DOCKER` filter chain. For example, to restrict external access such
|
||||
that _only_ source IP 8.8.8.8 can access the containers, the following rule
|
||||
could be added:
|
||||
|
||||
```
|
||||
$ iptables -I DOCKER -i ext_if ! -s 8.8.8.8 -j DROP
|
||||
```
|
||||
|
||||
## Communication between containers
|
||||
|
||||
Whether two containers can communicate is governed, at the operating system level, by two factors.
|
||||
|
||||
- Does the network topology even connect the containers' network interfaces? By default Docker will attach all containers to a single `docker0` bridge, providing a path for packets to travel between them. See the later sections of this document for other possible topologies.
|
||||
|
||||
- Do your `iptables` allow this particular connection? Docker will never make changes to your system `iptables` rules if you set `--iptables=false` when the daemon starts. Otherwise the Docker server will add a default rule to the `FORWARD` chain with a blanket `ACCEPT` policy if you retain the default `--icc=true`, or else will set the policy to `DROP` if `--icc=false`.
|
||||
|
||||
It is a strategic question whether to leave `--icc=true` or change it to
|
||||
`--icc=false` so that `iptables` will protect other containers -- and the main
|
||||
host -- from having arbitrary ports probed or accessed by a container that gets
|
||||
compromised.
|
||||
|
||||
If you choose the most secure setting of `--icc=false`, then how can containers
|
||||
communicate in those cases where you _want_ them to provide each other services?
|
||||
The answer is the `--link=CONTAINER_NAME_or_ID:ALIAS` option, which was
|
||||
mentioned in the previous section because of its effect upon name services. If
|
||||
the Docker daemon is running with both `--icc=false` and `--iptables=true`
|
||||
then, when it sees `docker run` invoked with the `--link=` option, the Docker
|
||||
server will insert a pair of `iptables` `ACCEPT` rules so that the new
|
||||
container can connect to the ports exposed by the other container -- the ports
|
||||
that it mentioned in the `EXPOSE` lines of its `Dockerfile`.
|
||||
|
||||
> **Note**: The value `CONTAINER_NAME` in `--link=` must either be an
|
||||
auto-assigned Docker name like `stupefied_pare` or else the name you assigned
|
||||
with `--name=` when you ran `docker run`. It cannot be a hostname, which Docker
|
||||
will not recognize in the context of the `--link=` option.
|
||||
|
||||
You can run the `iptables` command on your Docker host to see whether the `FORWARD` chain has a default policy of `ACCEPT` or `DROP`:
|
||||
|
||||
```
|
||||
# When --icc=false, you should see a DROP rule:
|
||||
|
||||
$ sudo iptables -L -n
|
||||
...
|
||||
Chain FORWARD (policy ACCEPT)
|
||||
target prot opt source destination
|
||||
DOCKER all -- 0.0.0.0/0 0.0.0.0/0
|
||||
DROP all -- 0.0.0.0/0 0.0.0.0/0
|
||||
...
|
||||
|
||||
# When a --link= has been created under --icc=false,
|
||||
# you should see port-specific ACCEPT rules overriding
|
||||
# the subsequent DROP policy for all other packets:
|
||||
|
||||
$ sudo iptables -L -n
|
||||
...
|
||||
Chain FORWARD (policy ACCEPT)
|
||||
target prot opt source destination
|
||||
DOCKER all -- 0.0.0.0/0 0.0.0.0/0
|
||||
DROP all -- 0.0.0.0/0 0.0.0.0/0
|
||||
|
||||
Chain DOCKER (1 references)
|
||||
target prot opt source destination
|
||||
ACCEPT tcp -- 172.17.0.2 172.17.0.3 tcp spt:80
|
||||
ACCEPT tcp -- 172.17.0.3 172.17.0.2 tcp dpt:80
|
||||
```
|
||||
|
||||
> **Note**: Docker is careful that its host-wide `iptables` rules fully expose
|
||||
containers to each other's raw IP addresses, so connections from one container
|
||||
to another should always appear to be originating from the first container's own
|
||||
IP address.
|
||||
62
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/custom-docker0.md
generated
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
title = "Customize the docker0 bridge"
|
||||
description = "Customizing docker0"
|
||||
keywords = ["docker, bridge, docker0, network"]
|
||||
[menu.main]
|
||||
parent = "smn_networking_def"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Customize the docker0 bridge
|
||||
|
||||
The information in this section explains how to customize the Docker default bridge. This is a `bridge` network named `bridge` created automatically when you install Docker.
|
||||
|
||||
**Note**: The [Docker networks feature](../dockernetworks.md) allows you to create user-defined networks in addition to the default bridge network.
|
||||
|
||||
By default, the Docker server creates and configures the host system's `docker0` interface as an _Ethernet bridge_ inside the Linux kernel that can pass packets back and forth between other physical or virtual network interfaces so that they behave as a single Ethernet network.
|
||||
|
||||
Docker configures `docker0` with an IP address, netmask and IP allocation range. The host machine can both receive and send packets to containers connected to the bridge, and gives it an MTU -- the _maximum transmission unit_ or largest packet length that the interface will allow -- of 1,500 bytes. These options are configurable at server startup:
|
||||
|
||||
- `--bip=CIDR` -- supply a specific IP address and netmask for the `docker0` bridge, using standard CIDR notation like `192.168.1.5/24`.
|
||||
|
||||
- `--fixed-cidr=CIDR` -- restrict the IP range from the `docker0` subnet, using the standard CIDR notation like `172.167.1.0/28`. This range must be an IPv4 range for fixed IPs (ex: 10.20.0.0/16) and must be a subset of the bridge IP range (`docker0` or set using `--bridge`). For example with `--fixed-cidr=192.168.1.0/25`, IPs for your containers will be chosen from the first half of `192.168.1.0/24` subnet.
|
||||
|
||||
- `--mtu=BYTES` -- override the maximum packet length on `docker0`.
|
||||
|
||||
Once you have one or more containers up and running, you can confirm that Docker has properly connected them to the `docker0` bridge by running the `brctl` command on the host machine and looking at the `interfaces` column of the output. Here is a host with two different containers connected:
|
||||
|
||||
```
|
||||
# Display bridge info
|
||||
|
||||
$ sudo brctl show
|
||||
bridge name bridge id STP enabled interfaces
|
||||
docker0 8000.3a1d7362b4ee no veth65f9
|
||||
vethdda6
|
||||
```
|
||||
|
||||
If the `brctl` command is not installed on your Docker host, then on Ubuntu you should be able to run `sudo apt-get install bridge-utils` to install it.
|
||||
|
||||
Finally, the `docker0` Ethernet bridge settings are used every time you create a new container. Docker selects a free IP address from the range available on the bridge each time you `docker run` a new container, and configures the container's `eth0` interface with that IP address and the bridge's netmask. The Docker host's own IP address on the bridge is used as the default gateway by which each container reaches the rest of the Internet.
|
||||
|
||||
```
|
||||
# The network, as seen from a container
|
||||
|
||||
$ docker run -i -t --rm base /bin/bash
|
||||
|
||||
$$ ip addr show eth0
|
||||
24: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
|
||||
link/ether 32:6f:e0:35:57:91 brd ff:ff:ff:ff:ff:ff
|
||||
inet 172.17.0.3/16 scope global eth0
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 fe80::306f:e0ff:fe35:5791/64 scope link
|
||||
valid_lft forever preferred_lft forever
|
||||
|
||||
$$ ip route
|
||||
default via 172.17.42.1 dev eth0
|
||||
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.3
|
||||
|
||||
$$ exit
|
||||
```
|
||||
|
||||
Remember that the Docker host will not be willing to forward container packets out on to the Internet unless its `ip_forward` system setting is `1` -- see the section on [Communicating to the outside world](container-communication.md#communicating-to-the-outside-world) for details.
|
||||
358
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/dockerlinks.md
generated
vendored
Normal file
@@ -0,0 +1,358 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
title = "Legacy container links"
|
||||
description = "Learn how to connect Docker containers together."
|
||||
keywords = ["Examples, Usage, user guide, links, linking, docker, documentation, examples, names, name, container naming, port, map, network port, network"]
|
||||
[menu.main]
|
||||
parent = "smn_networking_def"
|
||||
weight=-2
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Legacy container links
|
||||
|
||||
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.
|
||||
|
||||
Before the [Docker networks feature](../dockernetworks.md), you could use the
|
||||
Docker link feature to allow containers to discover each other and securely
|
||||
transfer information about one container to another container. With the
|
||||
introduction of the Docker networks feature, you can still create links but they
|
||||
behave differently between default `bridge` network and
|
||||
[user defined networks](../work-with-networks.md#linking-containers-in-user-defined-networks)
|
||||
|
||||
This section briefly discusses connecting via a network port and then goes into
|
||||
detail on container linking in default `bridge` network.
|
||||
|
||||
## Connect using network port mapping
|
||||
|
||||
In [the Using Docker section](../../containers/usingdocker.md), you created a
|
||||
container that ran a Python Flask application:
|
||||
|
||||
$ docker run -d -P training/webapp python app.py
|
||||
|
||||
> **Note:**
|
||||
> Containers have an internal network and an IP address
|
||||
> (as we saw when we used the `docker inspect` command to show the container's
|
||||
> IP address in the [Using Docker](../../containers/usingdocker.md) section).
|
||||
> Docker can have a variety of network configurations. You can see more
|
||||
> information on Docker networking [here](../index.md).
|
||||
|
||||
When that container was created, the `-P` flag was used to automatically map
|
||||
any network port inside it to a random high port within an *ephemeral port
|
||||
range* on your Docker host. Next, when `docker ps` was run, you saw that port
|
||||
5000 in the container was bound to port 49155 on the host.
|
||||
|
||||
$ docker ps nostalgic_morse
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse
|
||||
|
||||
You also saw how you can bind a container's ports to a specific port using
|
||||
the `-p` flag. Here port 80 of the host is mapped to port 5000 of the
|
||||
container:
|
||||
|
||||
$ docker run -d -p 80:5000 training/webapp python app.py
|
||||
|
||||
And you saw why this isn't such a great idea because it constrains you to
|
||||
only one container on that specific port.
|
||||
|
||||
Instead, you may specify a range of host ports to bind a container port to
|
||||
that is different than the default *ephemeral port range*:
|
||||
|
||||
$ docker run -d -p 8000-9000:5000 training/webapp python app.py
|
||||
|
||||
This would bind port 5000 in the container to a randomly available port
|
||||
between 8000 and 9000 on the host.
|
||||
|
||||
There are also a few other ways you can configure the `-p` flag. By
|
||||
default the `-p` flag will bind the specified port to all interfaces on
|
||||
the host machine. But you can also specify a binding to a specific
|
||||
interface, for example only to the `localhost`.
|
||||
|
||||
$ docker run -d -p 127.0.0.1:80:5000 training/webapp python app.py
|
||||
|
||||
This would bind port 5000 inside the container to port 80 on the
|
||||
`localhost` or `127.0.0.1` interface on the host machine.
|
||||
|
||||
Or, to bind port 5000 of the container to a dynamic port but only on the
|
||||
`localhost`, you could use:
|
||||
|
||||
$ docker run -d -p 127.0.0.1::5000 training/webapp python app.py
|
||||
|
||||
You can also bind UDP ports by adding a trailing `/udp`. For example:
|
||||
|
||||
$ docker run -d -p 127.0.0.1:80:5000/udp training/webapp python app.py
|
||||
|
||||
You also learned about the useful `docker port` shortcut which showed us the
|
||||
current port bindings. This is also useful for showing you specific port
|
||||
configurations. For example, if you've bound the container port to the
|
||||
`localhost` on the host machine, then the `docker port` output will reflect that.
|
||||
|
||||
$ docker port nostalgic_morse 5000
|
||||
127.0.0.1:49155
|
||||
|
||||
> **Note:**
|
||||
> The `-p` flag can be used multiple times to configure multiple ports.
|
||||
|
||||
## Connect with the linking system
|
||||
|
||||
> **Note**:
|
||||
> This section covers the legacy link feature in the default `bridge` network.
|
||||
> Please refer to [linking containers in user-defined networks]
|
||||
> (../work-with-networks.md#linking-containers-in-user-defined-networks)
|
||||
> for more information on links in user-defined networks.
|
||||
|
||||
Network port mappings are not the only way Docker containers can connect to one
|
||||
another. Docker also has a linking system that allows you to link multiple
|
||||
containers together and send connection information from one to another. When
|
||||
containers are linked, information about a source container can be sent to a
|
||||
recipient container. This allows the recipient to see selected data describing
|
||||
aspects of the source container.
|
||||
|
||||
### The importance of naming
|
||||
|
||||
To establish links, Docker relies on the names of your containers.
|
||||
You've already seen that each container you create has an automatically
|
||||
created name; indeed you've become familiar with our old friend
|
||||
`nostalgic_morse` during this guide. You can also name containers
|
||||
yourself. This naming provides two useful functions:
|
||||
|
||||
1. It can be useful to name containers that do specific functions in a way
|
||||
that makes it easier for you to remember them, for example naming a
|
||||
container containing a web application `web`.
|
||||
|
||||
2. It provides Docker with a reference point that allows it to refer to other
|
||||
containers, for example, you can specify to link the container `web` to container `db`.
|
||||
|
||||
You can name your container by using the `--name` flag, for example:
|
||||
|
||||
$ docker run -d -P --name web training/webapp python app.py
|
||||
|
||||
This launches a new container and uses the `--name` flag to
|
||||
name the container `web`. You can see the container's name using the
|
||||
`docker ps` command.
|
||||
|
||||
$ docker ps -l
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
aed84ee21bde training/webapp:latest python app.py 12 hours ago Up 2 seconds 0.0.0.0:49154->5000/tcp web
|
||||
|
||||
You can also use `docker inspect` to return the container's name.
|
||||
|
||||
|
||||
> **Note:**
|
||||
> Container names have to be unique. That means you can only call
|
||||
> one container `web`. If you want to re-use a container name you must delete
|
||||
> the old container (with `docker rm`) before you can create a new
|
||||
> container with the same name. As an alternative you can use the `--rm`
|
||||
> flag with the `docker run` command. This will delete the container
|
||||
> immediately after it is stopped.
|
||||
|
||||
## Communication across links
|
||||
|
||||
Links allow containers to discover each other and securely transfer information
|
||||
about one container to another container. When you set up a link, you create a
|
||||
conduit between a source container and a recipient container. The recipient can
|
||||
then access select data about the source. To create a link, you use the `--link`
|
||||
flag. First, create a new container, this time one containing a database.
|
||||
|
||||
$ docker run -d --name db training/postgres
|
||||
|
||||
This creates a new container called `db` from the `training/postgres`
|
||||
image, which contains a PostgreSQL database.
|
||||
|
||||
Now, you need to delete the `web` container you created previously so you can replace it
|
||||
with a linked one:
|
||||
|
||||
$ docker rm -f web
|
||||
|
||||
Now, create a new `web` container and link it with your `db` container.
|
||||
|
||||
$ docker run -d -P --name web --link db:db training/webapp python app.py
|
||||
|
||||
This will link the new `web` container with the `db` container you created
|
||||
earlier. The `--link` flag takes the form:
|
||||
|
||||
--link <name or id>:alias
|
||||
|
||||
Where `name` is the name of the container we're linking to and `alias` is an
|
||||
alias for the link name. You'll see how that alias gets used shortly.
|
||||
The `--link` flag also takes the form:
|
||||
|
||||
--link <name or id>
|
||||
|
||||
In which case the alias will match the name. You could have written the previous
|
||||
example as:
|
||||
|
||||
$ docker run -d -P --name web --link db training/webapp python app.py
|
||||
|
||||
Next, inspect your linked containers with `docker inspect`:
|
||||
|
||||
$ docker inspect -f "{{ .HostConfig.Links }}" web
|
||||
[/db:/web/db]
|
||||
|
||||
You can see that the `web` container is now linked to the `db` container
|
||||
`web/db`. Which allows it to access information about the `db` container.
|
||||
|
||||
So what does linking the containers actually do? You've learned that a link allows a
|
||||
source container to provide information about itself to a recipient container. In
|
||||
our example, the recipient, `web`, can access information about the source `db`. To do
|
||||
this, Docker creates a secure tunnel between the containers that doesn't need to
|
||||
expose any ports externally on the container; you'll note when we started the
|
||||
`db` container we did not use either the `-P` or `-p` flags. That's a big benefit of
|
||||
linking: we don't need to expose the source container, here the PostgreSQL database, to
|
||||
the network.
|
||||
|
||||
Docker exposes connectivity information for the source container to the
|
||||
recipient container in two ways:
|
||||
|
||||
* Environment variables,
|
||||
* Updating the `/etc/hosts` file.
|
||||
|
||||
### Environment variables
|
||||
|
||||
Docker creates several environment variables when you link containers. Docker
|
||||
automatically creates environment variables in the target container based on
|
||||
the `--link` parameters. It will also expose all environment variables
|
||||
originating from Docker from the source container. These include variables from:
|
||||
|
||||
* the `ENV` commands in the source container's Dockerfile
|
||||
* the `-e`, `--env` and `--env-file` options on the `docker run`
|
||||
command when the source container is started
|
||||
|
||||
These environment variables enable programmatic discovery from within the
|
||||
target container of information related to the source container.
|
||||
|
||||
> **Warning**:
|
||||
> It is important to understand that *all* environment variables originating
|
||||
> from Docker within a container are made available to *any* container
|
||||
> that links to it. This could have serious security implications if sensitive
|
||||
> data is stored in them.
|
||||
|
||||
Docker sets an `<alias>_NAME` environment variable for each target container
|
||||
listed in the `--link` parameter. For example, if a new container called
|
||||
`web` is linked to a database container called `db` via `--link db:webdb`,
|
||||
then Docker creates a `WEBDB_NAME=/web/webdb` variable in the `web` container.
|
||||
|
||||
Docker also defines a set of environment variables for each port exposed by the
|
||||
source container. Each variable has a unique prefix in the form:
|
||||
|
||||
`<name>_PORT_<port>_<protocol>`
|
||||
|
||||
The components in this prefix are:
|
||||
|
||||
* the alias `<name>` specified in the `--link` parameter (for example, `webdb`)
|
||||
* the `<port>` number exposed
|
||||
* a `<protocol>` which is either TCP or UDP
|
||||
|
||||
Docker uses this prefix format to define three distinct environment variables:
|
||||
|
||||
* The `prefix_ADDR` variable contains the IP Address from the URL, for
|
||||
example `WEBDB_PORT_5432_TCP_ADDR=172.17.0.82`.
|
||||
* The `prefix_PORT` variable contains just the port number from the URL for
|
||||
example `WEBDB_PORT_5432_TCP_PORT=5432`.
|
||||
* The `prefix_PROTO` variable contains just the protocol from the URL for
|
||||
example `WEBDB_PORT_5432_TCP_PROTO=tcp`.
|
||||
|
||||
If the container exposes multiple ports, an environment variable set is
|
||||
defined for each one. This means, for example, if a container exposes 4 ports
|
||||
that Docker creates 12 environment variables, 3 for each port.
|
||||
|
||||
Additionally, Docker creates an environment variable called `<alias>_PORT`.
|
||||
This variable contains the URL of the source container's first exposed port.
|
||||
The 'first' port is defined as the exposed port with the lowest number.
|
||||
For example, consider the `WEBDB_PORT=tcp://172.17.0.82:5432` variable. If
|
||||
that port is used for both tcp and udp, then the tcp one is specified.
|
||||
|
||||
Finally, Docker also exposes each Docker originated environment variable
|
||||
from the source container as an environment variable in the target. For each
|
||||
variable Docker creates an `<alias>_ENV_<name>` variable in the target
|
||||
container. The variable's value is set to the value Docker used when it
|
||||
started the source container.
|
||||
|
||||
Returning back to our database example, you can run the `env`
|
||||
command to list the specified container's environment variables.
|
||||
|
||||
```
|
||||
$ docker run --rm --name web2 --link db:db training/webapp env
|
||||
. . .
|
||||
DB_NAME=/web2/db
|
||||
DB_PORT=tcp://172.17.0.5:5432
|
||||
DB_PORT_5432_TCP=tcp://172.17.0.5:5432
|
||||
DB_PORT_5432_TCP_PROTO=tcp
|
||||
DB_PORT_5432_TCP_PORT=5432
|
||||
DB_PORT_5432_TCP_ADDR=172.17.0.5
|
||||
. . .
|
||||
```
|
||||
|
||||
You can see that Docker has created a series of environment variables with
|
||||
useful information about the source `db` container. Each variable is prefixed
|
||||
with
|
||||
`DB_`, which is populated from the `alias` you specified above. If the `alias`
|
||||
were `db1`, the variables would be prefixed with `DB1_`. You can use these
|
||||
environment variables to configure your applications to connect to the database
|
||||
on the `db` container. The connection will be secure and private; only the
|
||||
linked `web` container will be able to talk to the `db` container.
|
||||
|
||||
### Important notes on Docker environment variables
|
||||
|
||||
Unlike host entries in the [`/etc/hosts` file](#updating-the-etchosts-file),
|
||||
IP addresses stored in the environment variables are not automatically updated
|
||||
if the source container is restarted. We recommend using the host entries in
|
||||
`/etc/hosts` to resolve the IP address of linked containers.
|
||||
|
||||
These environment variables are only set for the first process in the
|
||||
container. Some daemons, such as `sshd`, will scrub them when spawning shells
|
||||
for connection.
|
||||
|
||||
### Updating the `/etc/hosts` file
|
||||
|
||||
In addition to the environment variables, Docker adds a host entry for the
|
||||
source container to the `/etc/hosts` file. Here's an entry for the `web`
|
||||
container:
|
||||
|
||||
$ docker run -t -i --rm --link db:webdb training/webapp /bin/bash
|
||||
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
|
||||
172.17.0.7 aed84ee21bde
|
||||
. . .
|
||||
172.17.0.5 webdb 6e5cdeb2d300 db
|
||||
|
||||
You can see two relevant host entries. The first is an entry for the `web`
|
||||
container that uses the Container ID as a host name. The second entry uses the
|
||||
link alias to reference the IP address of the `db` container. In addition to
|
||||
the alias you provide, the linked container's name--if unique from the alias
|
||||
provided to the `--link` parameter--and the linked container's hostname will
|
||||
also be added in `/etc/hosts` for the linked container's IP address. You can ping
|
||||
that host now via any of these entries:
|
||||
|
||||
root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping
|
||||
root@aed84ee21bde:/opt/webapp# ping webdb
|
||||
PING webdb (172.17.0.5): 48 data bytes
|
||||
56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms
|
||||
56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms
|
||||
56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms
|
||||
|
||||
> **Note:**
|
||||
> In the example, you'll note you had to install `ping` because it was not included
|
||||
> in the container initially.
|
||||
|
||||
Here, you used the `ping` command to ping the `db` container using its host entry,
|
||||
which resolves to `172.17.0.5`. You can use this host entry to configure an application
|
||||
to make use of your `db` container.
|
||||
|
||||
> **Note:**
|
||||
> You can link multiple recipient containers to a single source. For
|
||||
> example, you could have multiple (differently named) web containers attached to your
|
||||
>`db` container.
|
||||
|
||||
If you restart the source container, the linked containers `/etc/hosts` files
|
||||
will be automatically updated with the source container's new IP address,
|
||||
allowing linked communication to continue.
|
||||
|
||||
$ docker restart db
|
||||
db
|
||||
$ docker run -t -i --rm --link db:db training/webapp /bin/bash
|
||||
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
|
||||
172.17.0.7 aed84ee21bde
|
||||
. . .
|
||||
172.17.0.9 db
|
||||
|
||||
# Related information
|
||||
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/images/ipv6_basic_host_config.gliffy
generated
vendored
Normal file
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/images/ipv6_basic_host_config.svg
generated
vendored
Normal file
|
After Width: | Height: | Size: 30 KiB |
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/images/ipv6_ndp_proxying.gliffy
generated
vendored
Normal file
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/images/ipv6_ndp_proxying.svg
generated
vendored
Normal file
|
After Width: | Height: | Size: 66 KiB |
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/images/ipv6_routed_network_example.gliffy
generated
vendored
Normal file
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/images/ipv6_routed_network_example.svg
generated
vendored
Normal file
|
After Width: | Height: | Size: 96 KiB |
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/images/ipv6_slash64_subnet_config.gliffy
generated
vendored
Normal file
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/images/ipv6_slash64_subnet_config.svg
generated
vendored
Normal file
|
After Width: | Height: | Size: 74 KiB |
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/images/ipv6_switched_network_example.gliffy
generated
vendored
Normal file
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/images/ipv6_switched_network_example.svg
generated
vendored
Normal file
|
After Width: | Height: | Size: 175 KiB |
25
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/index.md
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
title = "Default bridge network"
|
||||
description = "Docker networking"
|
||||
keywords = ["network, networking, bridge, docker, documentation"]
|
||||
[menu.main]
|
||||
identifier="smn_networking_def"
|
||||
parent= "smn_networking"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Docker default bridge network
|
||||
|
||||
With the introduction of the Docker networks feature, you can create your own
|
||||
user-defined networks. The Docker default bridge is created when you install
|
||||
Docker Engine. It is a `bridge` network and is also named `bridge`. The topics
|
||||
in this section are related to interacting with that default bridge network.
|
||||
|
||||
- [Understand container communication](container-communication.md)
|
||||
- [Legacy container links](dockerlinks.md)
|
||||
- [Binding container ports to the host](binding.md)
|
||||
- [Build your own bridge](build-bridges.md)
|
||||
- [Configure container DNS](configure-dns.md)
|
||||
- [Customize the docker0 bridge](custom-docker0.md)
|
||||
- [IPv6 with Docker](ipv6.md)
|
||||
259
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/ipv6.md
generated
vendored
Normal file
@@ -0,0 +1,259 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
title = "IPv6 with Docker"
|
||||
description = "How do we connect docker containers within and across hosts ?"
|
||||
keywords = ["docker, network, IPv6"]
|
||||
[menu.main]
|
||||
parent = "smn_networking_def"
|
||||
weight = 3
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# IPv6 with Docker
|
||||
|
||||
The information in this section explains IPv6 with the Docker default bridge.
|
||||
This is a `bridge` network named `bridge` created automatically when you install
|
||||
Docker.
|
||||
|
||||
As we are [running out of IPv4
|
||||
addresses](http://en.wikipedia.org/wiki/IPv4_address_exhaustion) the IETF has
|
||||
standardized an IPv4 successor, [Internet Protocol Version
|
||||
6](http://en.wikipedia.org/wiki/IPv6) , in [RFC
|
||||
2460](https://www.ietf.org/rfc/rfc2460.txt). Both protocols, IPv4 and IPv6,
|
||||
reside on layer 3 of the [OSI model](http://en.wikipedia.org/wiki/OSI_model).
|
||||
|
||||
## How IPv6 works on Docker
|
||||
|
||||
By default, the Docker server configures the container network for IPv4 only.
|
||||
You can enable IPv4/IPv6 dualstack support by running the Docker daemon with the
|
||||
`--ipv6` flag. Docker will set up the bridge `docker0` with the IPv6 [link-local
|
||||
address](http://en.wikipedia.org/wiki/Link-local_address) `fe80::1`.
|
||||
|
||||
By default, containers that are created will only get a link-local IPv6 address.
|
||||
To assign globally routable IPv6 addresses to your containers you have to
|
||||
specify an IPv6 subnet to pick the addresses from. Set the IPv6 subnet via the
|
||||
`--fixed-cidr-v6` parameter when starting Docker daemon:
|
||||
|
||||
```
|
||||
docker daemon --ipv6 --fixed-cidr-v6="2001:db8:1::/64"
|
||||
```
|
||||
|
||||
The subnet for Docker containers should at least have a size of `/80`. This way
|
||||
an IPv6 address can end with the container's MAC address and you prevent NDP
|
||||
neighbor cache invalidation issues in the Docker layer.
|
||||
|
||||
With the `--fixed-cidr-v6` parameter set Docker will add a new route to the
|
||||
routing table. Further IPv6 routing will be enabled (you may prevent this by
|
||||
starting Docker daemon with `--ip-forward=false`):
|
||||
|
||||
```
|
||||
$ ip -6 route add 2001:db8:1::/64 dev docker0
|
||||
$ sysctl net.ipv6.conf.default.forwarding=1
|
||||
$ sysctl net.ipv6.conf.all.forwarding=1
|
||||
```
|
||||
|
||||
All traffic to the subnet `2001:db8:1::/64` will now be routed via the `docker0` interface.
|
||||
|
||||
Be aware that IPv6 forwarding may interfere with your existing IPv6
|
||||
configuration: If you are using Router Advertisements to get IPv6 settings for
|
||||
your host's interfaces you should set `accept_ra` to `2`. Otherwise IPv6 enabled
|
||||
forwarding will result in rejecting Router Advertisements. E.g., if you want to
|
||||
configure `eth0` via Router Advertisements you should set:
|
||||
|
||||
```
|
||||
$ sysctl net.ipv6.conf.eth0.accept_ra=2
|
||||
```
|
||||
|
||||

|
||||
|
||||
Every new container will get an IPv6 address from the defined subnet. Further a
|
||||
default route will be added on `eth0` in the container via the address specified
|
||||
by the daemon option `--default-gateway-v6` if present, otherwise via `fe80::1`:
|
||||
```
|
||||
docker run -it ubuntu bash -c "ip -6 addr show dev eth0; ip -6 route show"
|
||||
|
||||
15: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500
|
||||
inet6 2001:db8:1:0:0:242:ac11:3/64 scope global
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 fe80::42:acff:fe11:3/64 scope link
|
||||
valid_lft forever preferred_lft forever
|
||||
|
||||
2001:db8:1::/64 dev eth0 proto kernel metric 256
|
||||
fe80::/64 dev eth0 proto kernel metric 256
|
||||
default via fe80::1 dev eth0 metric 1024
|
||||
```
|
||||
|
||||
In this example the Docker container is assigned a link-local address with the
|
||||
network suffix `/64` (here: `fe80::42:acff:fe11:3/64`) and a globally routable
|
||||
IPv6 address (here: `2001:db8:1:0:0:242:ac11:3/64`). The container will create
|
||||
connections to addresses outside of the `2001:db8:1::/64` network via the
|
||||
link-local gateway at `fe80::1` on `eth0`.
|
||||
|
||||
Often servers or virtual machines get a `/64` IPv6 subnet assigned (e.g.
|
||||
`2001:db8:23:42::/64`). In this case you can split it up further and provide
|
||||
Docker a `/80` subnet while using a separate `/80` subnet for other applications
|
||||
on the host:
|
||||
|
||||

|
||||
|
||||
In this setup the subnet `2001:db8:23:42::/80` with a range from
|
||||
`2001:db8:23:42:0:0:0:0` to `2001:db8:23:42:0:ffff:ffff:ffff` is attached to
|
||||
`eth0`, with the host listening at `2001:db8:23:42::1`. The subnet
|
||||
`2001:db8:23:42:1::/80` with an address range from `2001:db8:23:42:1:0:0:0` to
|
||||
`2001:db8:23:42:1:ffff:ffff:ffff` is attached to `docker0` and will be used by
|
||||
containers.
|
||||
|
||||
### Using NDP proxying
|
||||
|
||||
If your Docker host is only part of an IPv6 subnet but has not got an IPv6
|
||||
subnet assigned you can use NDP proxying to connect your containers via IPv6 to
|
||||
the internet. For example your host has the IPv6 address `2001:db8::c001`, is
|
||||
part of the subnet `2001:db8::/64` and your IaaS provider allows you to
|
||||
configure the IPv6 addresses `2001:db8::c000` to `2001:db8::c00f`:
|
||||
|
||||
```
|
||||
$ ip -6 addr show
|
||||
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
|
||||
inet6 ::1/128 scope host
|
||||
valid_lft forever preferred_lft forever
|
||||
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
|
||||
inet6 2001:db8::c001/64 scope global
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 fe80::601:3fff:fea1:9c01/64 scope link
|
||||
valid_lft forever preferred_lft forever
|
||||
```
|
||||
|
||||
Let's split up the configurable address range into two subnets
|
||||
`2001:db8::c000/125` and `2001:db8::c008/125`. The first one can be used by the
|
||||
host itself, the latter by Docker:
|
||||
|
||||
```
|
||||
docker daemon --ipv6 --fixed-cidr-v6 2001:db8::c008/125
|
||||
```
|
||||
|
||||
You notice the Docker subnet is within the subnet managed by your router that is
|
||||
connected to `eth0`. This means all devices (containers) with the addresses from
|
||||
the Docker subnet are expected to be found within the router subnet. Therefore
|
||||
the router thinks it can talk to these containers directly.
|
||||
|
||||

|
||||
|
||||
As soon as the router wants to send an IPv6 packet to the first container it
|
||||
will transmit a neighbor solicitation request, asking, who has `2001:db8::c009`?
|
||||
But it will get no answer because no one on this subnet has this address. The
|
||||
container with this address is hidden behind the Docker host. The Docker host
|
||||
has to listen to neighbor solicitation requests for the container address and
|
||||
send a response that itself is the device that is responsible for the address.
|
||||
This is done by a Kernel feature called `NDP Proxy`. You can enable it by
|
||||
executing
|
||||
|
||||
```
|
||||
$ sysctl net.ipv6.conf.eth0.proxy_ndp=1
|
||||
```
|
||||
|
||||
Now you can add the container's IPv6 address to the NDP proxy table:
|
||||
|
||||
```
|
||||
$ ip -6 neigh add proxy 2001:db8::c009 dev eth0
|
||||
```
|
||||
|
||||
This command tells the Kernel to answer to incoming neighbor solicitation
|
||||
requests regarding the IPv6 address `2001:db8::c009` on the device `eth0`. As a
|
||||
consequence of this all traffic to this IPv6 address will go into the Docker
|
||||
host and it will forward it according to its routing table via the `docker0`
|
||||
device to the container network:
|
||||
|
||||
```
|
||||
$ ip -6 route show
|
||||
2001:db8::c008/125 dev docker0 metric 1
|
||||
2001:db8::/64 dev eth0 proto kernel metric 256
|
||||
```
|
||||
|
||||
You have to execute the `ip -6 neigh add proxy ...` command for every IPv6
|
||||
address in your Docker subnet. Unfortunately there is no functionality for
|
||||
adding a whole subnet by executing one command. An alternative approach would be
|
||||
to use an NDP proxy daemon such as
|
||||
[ndppd](https://github.com/DanielAdolfsson/ndppd).
|
||||
|
||||
## Docker IPv6 cluster
|
||||
|
||||
### Switched network environment
|
||||
Using routable IPv6 addresses allows you to realize communication between
|
||||
containers on different hosts. Let's have a look at a simple Docker IPv6 cluster
|
||||
example:
|
||||
|
||||

|
||||
|
||||
The Docker hosts are in the `2001:db8:0::/64` subnet. Host1 is configured to
|
||||
provide addresses from the `2001:db8:1::/64` subnet to its containers. It has
|
||||
three routes configured:
|
||||
|
||||
- Route all traffic to `2001:db8:0::/64` via `eth0`
|
||||
- Route all traffic to `2001:db8:1::/64` via `docker0`
|
||||
- Route all traffic to `2001:db8:2::/64` via Host2 with IP `2001:db8::2`
|
||||
|
||||
Host1 also acts as a router on OSI layer 3. When one of the network clients
|
||||
tries to contact a target that is specified in Host1's routing table Host1 will
|
||||
forward the traffic accordingly. It acts as a router for all networks it knows:
|
||||
`2001:db8::/64`, `2001:db8:1::/64` and `2001:db8:2::/64`.
|
||||
|
||||
On Host2 we have nearly the same configuration. Host2's containers will get IPv6
|
||||
addresses from `2001:db8:2::/64`. Host2 has three routes configured:
|
||||
|
||||
- Route all traffic to `2001:db8:0::/64` via `eth0`
|
||||
- Route all traffic to `2001:db8:2::/64` via `docker0`
|
||||
- Route all traffic to `2001:db8:1::/64` via Host1 with IP `2001:db8:0::1`
|
||||
|
||||
The difference to Host1 is that the network `2001:db8:2::/64` is directly
|
||||
attached to the host via its `docker0` interface whereas it reaches
|
||||
`2001:db8:1::/64` via Host1's IPv6 address `2001:db8::1`.
|
||||
|
||||
This way every container is able to contact every other container. The
|
||||
containers `Container1-*` share the same subnet and contact each other directly.
|
||||
The traffic between `Container1-*` and `Container2-*` will be routed via Host1
|
||||
and Host2 because those containers do not share the same subnet.
|
||||
|
||||
In a switched environment every host has to know all routes to every subnet.
|
||||
You always have to update the hosts' routing tables once you add or remove a
|
||||
host to the cluster.
|
||||
|
||||
Every configuration in the diagram that is shown below the dashed line is
|
||||
handled by Docker: The `docker0` bridge IP address configuration, the route to
|
||||
the Docker subnet on the host, the container IP addresses and the routes on the
|
||||
containers. The configuration above the line is up to the user and can be
|
||||
adapted to the individual environment.
|
||||
|
||||
### Routed network environment
|
||||
In a routed network environment you replace the layer 2 switch with a layer 3
|
||||
router. Now the hosts just have to know their default gateway (the router) and
|
||||
the route to their own containers (managed by Docker). The router holds all
|
||||
routing information about the Docker subnets. When you add or remove a host to
|
||||
this environment you just have to update the routing table in the router - not
|
||||
on every host.
|
||||
|
||||

|
||||
|
||||
In this scenario containers of the same host can communicate directly with each
|
||||
other. The traffic between containers on different hosts will be routed via
|
||||
their hosts and the router. For example packet from `Container1-1` to
|
||||
`Container2-1` will be routed through `Host1`, `Router` and `Host2` until it
|
||||
arrives at `Container2-1`.
|
||||
|
||||
To keep the IPv6 addresses short in this example a `/48` network is assigned to
|
||||
every host. The hosts use a `/64` subnet of this for its own services and one
|
||||
for Docker. When adding a third host you would add a route for the subnet
|
||||
`2001:db8:3::/48` in the router and configure Docker on Host3 with
|
||||
`--fixed-cidr-v6=2001:db8:3:1::/64`.
|
||||
|
||||
Remember the subnet for Docker containers should at least have a size of `/80`.
|
||||
This way an IPv6 address can end with the container's MAC address and you
|
||||
prevent NDP neighbor cache invalidation issues in the Docker layer. So if you
|
||||
have a `/64` for your whole environment use `/78` subnets for the hosts and
|
||||
`/80` for the containers. This way you can use 4096 hosts with 16 `/80` subnets
|
||||
each.
|
||||
|
||||
Every configuration in the diagram that is visualized below the dashed line is
|
||||
handled by Docker: The `docker0` bridge IP address configuration, the route to
|
||||
the Docker subnet on the host, the container IP addresses and the routes on the
|
||||
containers. The configuration above the line is up to the user and can be
|
||||
adapted to the individual environment.
|
||||
141
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/options.md
generated
vendored
Normal file
@@ -0,0 +1,141 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
draft=true
|
||||
title = "Tools and Examples"
|
||||
keywords = ["docker, bridge, docker0, network"]
|
||||
[menu.main]
|
||||
parent = "smn_networking_def"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
<!--[metadata]>
|
||||
We may want to add it back in later under another form. Labeled DRAFT for now. Won't be built.
|
||||
<![end-metadata]-->
|
||||
|
||||
# Quick guide to the options
|
||||
Here is a quick list of the networking-related Docker command-line options, in case it helps you find the section below that you are looking for.
|
||||
|
||||
Some networking command-line options can only be supplied to the Docker server when it starts up, and cannot be changed once it is running:
|
||||
- `-b BRIDGE` or `--bridge=BRIDGE` -- see
|
||||
|
||||
[Building your own bridge](#bridge-building)
|
||||
|
||||
- `--bip=CIDR` -- see
|
||||
|
||||
[Customizing docker0](#docker0)
|
||||
|
||||
- `--default-gateway=IP_ADDRESS` -- see
|
||||
|
||||
[How Docker networks a container](#container-networking)
|
||||
|
||||
- `--default-gateway-v6=IP_ADDRESS` -- see
|
||||
|
||||
[IPv6](#ipv6)
|
||||
|
||||
- `--fixed-cidr` -- see
|
||||
|
||||
[Customizing docker0](#docker0)
|
||||
|
||||
- `--fixed-cidr-v6` -- see
|
||||
|
||||
[IPv6](#ipv6)
|
||||
|
||||
- `-H SOCKET...` or `--host=SOCKET...` --
|
||||
|
||||
This might sound like it would affect container networking,
|
||||
|
||||
but it actually faces in the other direction:
|
||||
|
||||
it tells the Docker server over what channels
|
||||
|
||||
it should be willing to receive commands
|
||||
|
||||
like "run container" and "stop container."
|
||||
|
||||
- `--icc=true|false` -- see
|
||||
|
||||
[Communication between containers](#between-containers)
|
||||
|
||||
- `--ip=IP_ADDRESS` -- see
|
||||
|
||||
[Binding container ports](#binding-ports)
|
||||
|
||||
- `--ipv6=true|false` -- see
|
||||
|
||||
[IPv6](#ipv6)
|
||||
|
||||
- `--ip-forward=true|false` -- see
|
||||
|
||||
[Communication between containers and the wider world](#the-world)
|
||||
|
||||
- `--iptables=true|false` -- see
|
||||
|
||||
[Communication between containers](#between-containers)
|
||||
|
||||
- `--mtu=BYTES` -- see
|
||||
|
||||
[Customizing docker0](#docker0)
|
||||
|
||||
- `--userland-proxy=true|false` -- see
|
||||
|
||||
[Binding container ports](#binding-ports)
|
||||
|
||||
There are three networking options that can be supplied either at startup or when `docker run` is invoked. When provided at startup, set the default value that `docker run` will later use if the options are not specified:
|
||||
- `--dns=IP_ADDRESS...` -- see
|
||||
|
||||
[Configuring DNS](#dns)
|
||||
|
||||
- `--dns-search=DOMAIN...` -- see
|
||||
|
||||
[Configuring DNS](#dns)
|
||||
|
||||
- `--dns-opt=OPTION...` -- see
|
||||
|
||||
[Configuring DNS](#dns)
|
||||
|
||||
Finally, several networking options can only be provided when calling `docker run` because they specify something specific to one container:
|
||||
- `-h HOSTNAME` or `--hostname=HOSTNAME` -- see
|
||||
|
||||
[Configuring DNS](#dns) and
|
||||
|
||||
[How Docker networks a container](#container-networking)
|
||||
|
||||
- `--link=CONTAINER_NAME_or_ID:ALIAS` -- see
|
||||
|
||||
[Configuring DNS](#dns) and
|
||||
|
||||
[Communication between containers](#between-containers)
|
||||
|
||||
- `--net=bridge|none|container:NAME_or_ID|host` -- see
|
||||
|
||||
[How Docker networks a container](#container-networking)
|
||||
|
||||
- `--mac-address=MACADDRESS...` -- see
|
||||
|
||||
[How Docker networks a container](#container-networking)
|
||||
|
||||
- `-p SPEC` or `--publish=SPEC` -- see
|
||||
|
||||
[Binding container ports](#binding-ports)
|
||||
|
||||
- `-P` or `--publish-all=true|false` -- see
|
||||
|
||||
[Binding container ports](#binding-ports)
|
||||
|
||||
To supply networking options to the Docker server at startup, use the `DOCKER_OPTS` variable in the Docker upstart configuration file. For Ubuntu, edit the variable in `/etc/default/docker` or `/etc/sysconfig/docker` for CentOS.
|
||||
|
||||
The following example illustrates how to configure Docker on Ubuntu to recognize a newly built bridge.
|
||||
|
||||
Edit the `/etc/default/docker` file:
|
||||
|
||||
```
|
||||
$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
|
||||
```
|
||||
|
||||
Then restart the Docker server.
|
||||
|
||||
```
|
||||
$ sudo service docker start
|
||||
```
|
||||
|
||||
For additional information on bridges, see [building your own bridge](#building-your-own-bridge) later on this page.
|
||||
28
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/saveme.md
generated
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
draft=true
|
||||
title = "Saved text"
|
||||
keywords = ["docker, bridge, docker0, network"]
|
||||
[menu.main]
|
||||
parent = "smn_networking_def"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
<!--[metadata]>
|
||||
This content was extracted from the original introduction. We may want to add it back in later under another form. Labeled DRAFT for now. Won't be built.
|
||||
<![end-metadata]-->
|
||||
|
||||
|
||||
## A Brief introduction to networking and docker
|
||||
When Docker starts, it creates a virtual interface named `docker0` on the host machine. It randomly chooses an address and subnet from the private range defined by [RFC 1918](http://tools.ietf.org/html/rfc1918) that are not in use on the host machine, and assigns it to `docker0`. Docker made the choice `172.17.42.1/16` when I started it a few minutes ago, for example -- a 16-bit netmask providing 65,534 addresses for the host machine and its containers. The MAC address is generated using the IP address allocated to the container to avoid ARP collisions, using a range from `02:42:ac:11:00:00` to `02:42:ac:11:ff:ff`.
|
||||
|
||||
> **Note:** This document discusses advanced networking configuration and options for Docker. In most cases you won't need this information. If you're looking to get started with a simpler explanation of Docker networking and an introduction to the concept of container linking see the [Docker User Guide](dockerlinks.md).
|
||||
|
||||
But `docker0` is no ordinary interface. It is a virtual _Ethernet bridge_ that automatically forwards packets between any other network interfaces that are attached to it. This lets containers communicate both with the host machine and with each other. Every time Docker creates a container, it creates a pair of "peer" interfaces that are like opposite ends of a pipe -- a packet sent on one will be received on the other. It gives one of the peers to the container to become its `eth0` interface and keeps the other peer, with a unique name like `vethAQI2QT`, out in the namespace of the host machine. By binding every `veth*` interface to the `docker0` bridge, Docker creates a virtual subnet shared between the host machine and every Docker container.
|
||||
|
||||
The remaining sections of this document explain all of the ways that you can use Docker options and -- in advanced cases -- raw Linux networking commands to tweak, supplement, or entirely replace Docker's default networking configuration.
|
||||
|
||||
## Editing networking config files
|
||||
Starting with Docker v.1.2.0, you can now edit `/etc/hosts`, `/etc/hostname` and `/etc/resolve.conf` in a running container. This is useful if you need to install bind or other services that might override one of those files.
|
||||
|
||||
Note, however, that changes to these files will not be saved by `docker commit`, nor will they be saved during `docker run`. That means they won't be saved in the image, nor will they persist when a container is restarted; they will only "stick" in a running container.
|
||||
83
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/default_network/tools.md
generated
vendored
Normal file
@@ -0,0 +1,83 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
draft=true
|
||||
title = "Tools and Examples"
|
||||
keywords = ["docker, bridge, docker0, network"]
|
||||
[menu.main]
|
||||
parent = "smn_networking_def"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
<!--[metadata]>
|
||||
Dave Tucker instructed remove this. We may want to add it back in later under another form. Labeled DRAFT for now. Won't be built.
|
||||
<![end-metadata]-->
|
||||
|
||||
# Tools and examples
|
||||
Before diving into the following sections on custom network topologies, you might be interested in glancing at a few external tools or examples of the same kinds of configuration. Here are two:
|
||||
- Jérôme Petazzoni has created a `pipework` shell script to help you
|
||||
|
||||
connect together containers in arbitrarily complex scenarios:
|
||||
|
||||
[https://github.com/jpetazzo/pipework](https://github.com/jpetazzo/pipework)
|
||||
|
||||
- Brandon Rhodes has created a whole network topology of Docker
|
||||
|
||||
containers for the next edition of Foundations of Python Network
|
||||
|
||||
Programming that includes routing, NAT'd firewalls, and servers that
|
||||
|
||||
offer HTTP, SMTP, POP, IMAP, Telnet, SSH, and FTP:
|
||||
|
||||
[https://github.com/brandon-rhodes/fopnp/tree/m/playground](https://github.com/brandon-rhodes/fopnp/tree/m/playground)
|
||||
|
||||
Both tools use networking commands very much like the ones you saw in the previous section, and will see in the following sections.
|
||||
|
||||
# Building a point-to-point connection
|
||||
<a name="point-to-point"></a>
|
||||
|
||||
By default, Docker attaches all containers to the virtual subnet implemented by `docker0`. You can create containers that are each connected to some different virtual subnet by creating your own bridge as shown in [Building your own bridge](#bridge-building), starting each container with `docker run --net=none`, and then attaching the containers to your bridge with the shell commands shown in [How Docker networks a container](#container-networking).
|
||||
|
||||
But sometimes you want two particular containers to be able to communicate directly without the added complexity of both being bound to a host-wide Ethernet bridge.
|
||||
|
||||
The solution is simple: when you create your pair of peer interfaces, simply throw _both_ of them into containers, and configure them as classic point-to-point links. The two containers will then be able to communicate directly (provided you manage to tell each container the other's IP address, of course). You might adjust the instructions of the previous section to go something like this:
|
||||
|
||||
```
|
||||
# Start up two containers in two terminal windows
|
||||
|
||||
$ docker run -i -t --rm --net=none base /bin/bash
|
||||
root@1f1f4c1f931a:/#
|
||||
|
||||
$ docker run -i -t --rm --net=none base /bin/bash
|
||||
root@12e343489d2f:/#
|
||||
|
||||
# Learn the container process IDs
|
||||
# and create their namespace entries
|
||||
|
||||
$ docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
|
||||
2989
|
||||
$ docker inspect -f '{{.State.Pid}}' 12e343489d2f
|
||||
3004
|
||||
$ sudo mkdir -p /var/run/netns
|
||||
$ sudo ln -s /proc/2989/ns/net /var/run/netns/2989
|
||||
$ sudo ln -s /proc/3004/ns/net /var/run/netns/3004
|
||||
|
||||
# Create the "peer" interfaces and hand them out
|
||||
|
||||
$ sudo ip link add A type veth peer name B
|
||||
|
||||
$ sudo ip link set A netns 2989
|
||||
$ sudo ip netns exec 2989 ip addr add 10.1.1.1/32 dev A
|
||||
$ sudo ip netns exec 2989 ip link set A up
|
||||
$ sudo ip netns exec 2989 ip route add 10.1.1.2/32 dev A
|
||||
|
||||
$ sudo ip link set B netns 3004
|
||||
$ sudo ip netns exec 3004 ip addr add 10.1.1.2/32 dev B
|
||||
$ sudo ip netns exec 3004 ip link set B up
|
||||
$ sudo ip netns exec 3004 ip route add 10.1.1.1/32 dev B
|
||||
```
|
||||
|
||||
The two containers should now be able to ping each other and make connections successfully. Point-to-point links like this do not depend on a subnet nor a netmask, but on the bare assertion made by `ip route` that some other single IP address is connected to a particular network interface.
|
||||
|
||||
Note that point-to-point links can be safely combined with other kinds of network connectivity -- there is no need to start the containers with `--net=none` if you want point-to-point links to be an addition to the container's normal networking instead of a replacement.
|
||||
|
||||
A final permutation of this pattern is to create the point-to-point link between the Docker host and one container, which would allow the host to communicate with that one container on some single IP address and thus communicate "out-of-band" of the bridge that connects the other, more usual containers. But unless you have very specific networking needs that drive you to such a solution, it is probably far preferable to use `--icc=false` to lock down inter-container communication, as we explored earlier.
|
||||
522
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/dockernetworks.md
generated
vendored
Normal file
@@ -0,0 +1,522 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
title = "Docker container networking"
|
||||
description = "How do we connect docker containers within and across hosts ?"
|
||||
keywords = ["Examples, Usage, network, docker, documentation, user guide, multihost, cluster"]
|
||||
[menu.main]
|
||||
parent = "smn_networking"
|
||||
weight = -5
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Understand Docker container networks
|
||||
|
||||
To build web applications that act in concert but do so securely, use the Docker
|
||||
networks feature. Networks, by definition, provide complete isolation for
|
||||
containers. So, it is important to have control over the networks your
|
||||
applications run on. Docker container networks give you that control.
|
||||
|
||||
This section provides an overview of the default networking behavior that Docker
|
||||
Engine delivers natively. It describes the type of networks created by default
|
||||
and how to create your own, user--defined networks. It also describes the
|
||||
resources required to create networks on a single host or across a cluster of
|
||||
hosts.
|
||||
|
||||
## Default Networks
|
||||
|
||||
When you install Docker, it creates three networks automatically. You can list
|
||||
these networks using the `docker network ls` command:
|
||||
|
||||
```
|
||||
$ docker network ls
|
||||
NETWORK ID NAME DRIVER
|
||||
7fca4eb8c647 bridge bridge
|
||||
9f904ee27bf5 none null
|
||||
cf03ee007fb4 host host
|
||||
```
|
||||
|
||||
Historically, these three networks are part of Docker's implementation. When
|
||||
you run a container you can use the `--net` flag to specify which network you
|
||||
want to run a container on. These three networks are still available to you.
|
||||
|
||||
The `bridge` network represents the `docker0` network present in all Docker
|
||||
installations. Unless you specify otherwise with the `docker run
|
||||
--net=<NETWORK>` option, the Docker daemon connects containers to this network
|
||||
by default. You can see this bridge as part of a host's network stack by using
|
||||
the `ifconfig` command on the host.
|
||||
|
||||
```
|
||||
ubuntu@ip-172-31-36-118:~$ ifconfig
|
||||
docker0 Link encap:Ethernet HWaddr 02:42:47:bc:3a:eb
|
||||
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
|
||||
inet6 addr: fe80::42:47ff:febc:3aeb/64 Scope:Link
|
||||
UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
|
||||
RX packets:17 errors:0 dropped:0 overruns:0 frame:0
|
||||
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
|
||||
collisions:0 txqueuelen:0
|
||||
RX bytes:1100 (1.1 KB) TX bytes:648 (648.0 B)
|
||||
```
|
||||
|
||||
The `none` network adds a container to a container-specific network stack. That container lacks a network interface. Attaching to such a container and looking at it's stack you see this:
|
||||
|
||||
```
|
||||
ubuntu@ip-172-31-36-118:~$ docker attach nonenetcontainer
|
||||
|
||||
/ # cat /etc/hosts
|
||||
127.0.0.1 localhost
|
||||
::1 localhost ip6-localhost ip6-loopback
|
||||
fe00::0 ip6-localnet
|
||||
ff00::0 ip6-mcastprefix
|
||||
ff02::1 ip6-allnodes
|
||||
ff02::2 ip6-allrouters
|
||||
/ # ifconfig
|
||||
lo Link encap:Local Loopback
|
||||
inet addr:127.0.0.1 Mask:255.0.0.0
|
||||
inet6 addr: ::1/128 Scope:Host
|
||||
UP LOOPBACK RUNNING MTU:65536 Metric:1
|
||||
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
|
||||
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
|
||||
collisions:0 txqueuelen:0
|
||||
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
|
||||
|
||||
/ #
|
||||
```
|
||||
>**Note**: You can detach from the container and leave it running with `CTRL-p CTRL-q`.
|
||||
|
||||
The `host` network adds a container on the hosts network stack. You'll find the
|
||||
network configuration inside the container is identical to the host.
|
||||
|
||||
With the exception of the the `bridge` network, you really don't need to
|
||||
interact with these default networks. While you can list and inspect them, you
|
||||
cannot remove them. They are required by your Docker installation. However, you
|
||||
can add your own user-defined networks and these you can remove when you no
|
||||
longer need them. Before you learn more about creating your own networks, it is
|
||||
worth looking at the `default` network a bit.
|
||||
|
||||
|
||||
### The default bridge network in detail
|
||||
The default bridge network is present on all Docker hosts. The `docker network inspect`
|
||||
|
||||
```
|
||||
$ docker network inspect bridge
|
||||
[
|
||||
{
|
||||
"Name": "bridge",
|
||||
"Id": "f7ab26d71dbd6f557852c7156ae0574bbf62c42f539b50c8ebde0f728a253b6f",
|
||||
"Scope": "local",
|
||||
"Driver": "bridge",
|
||||
"IPAM": {
|
||||
"Driver": "default",
|
||||
"Config": [
|
||||
{
|
||||
"Subnet": "172.17.0.1/16",
|
||||
"Gateway": "172.17.0.1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Containers": {},
|
||||
"Options": {
|
||||
"com.docker.network.bridge.default_bridge": "true",
|
||||
"com.docker.network.bridge.enable_icc": "true",
|
||||
"com.docker.network.bridge.enable_ip_masquerade": "true",
|
||||
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
|
||||
"com.docker.network.bridge.name": "docker0",
|
||||
"com.docker.network.driver.mtu": "9001"
|
||||
}
|
||||
}
|
||||
]
|
||||
```
|
||||
The Engine automatically creates a `Subnet` and `Gateway` to the network.
|
||||
The `docker run` command automatically adds new containers to this network.
|
||||
|
||||
```
|
||||
$ docker run -itd --name=container1 busybox
|
||||
3386a527aa08b37ea9232cbcace2d2458d49f44bb05a6b775fba7ddd40d8f92c
|
||||
|
||||
$ docker run -itd --name=container2 busybox
|
||||
94447ca479852d29aeddca75c28f7104df3c3196d7b6d83061879e339946805c
|
||||
```
|
||||
|
||||
Inspecting the `bridge` network again after starting two containers shows both newly launched containers in the network. Their ids show up in the container
|
||||
|
||||
```
|
||||
$ docker network inspect bridge
|
||||
{[
|
||||
{
|
||||
"Name": "bridge",
|
||||
"Id": "f7ab26d71dbd6f557852c7156ae0574bbf62c42f539b50c8ebde0f728a253b6f",
|
||||
"Scope": "local",
|
||||
"Driver": "bridge",
|
||||
"IPAM": {
|
||||
"Driver": "default",
|
||||
"Config": [
|
||||
{
|
||||
"Subnet": "172.17.0.1/16",
|
||||
"Gateway": "172.17.0.1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Containers": {
|
||||
"3386a527aa08b37ea9232cbcace2d2458d49f44bb05a6b775fba7ddd40d8f92c": {
|
||||
"EndpointID": "647c12443e91faf0fd508b6edfe59c30b642abb60dfab890b4bdccee38750bc1",
|
||||
"MacAddress": "02:42:ac:11:00:02",
|
||||
"IPv4Address": "172.17.0.2/16",
|
||||
"IPv6Address": ""
|
||||
},
|
||||
"94447ca479852d29aeddca75c28f7104df3c3196d7b6d83061879e339946805c": {
|
||||
"EndpointID": "b047d090f446ac49747d3c37d63e4307be745876db7f0ceef7b311cbba615f48",
|
||||
"MacAddress": "02:42:ac:11:00:03",
|
||||
"IPv4Address": "172.17.0.3/16",
|
||||
"IPv6Address": ""
|
||||
}
|
||||
},
|
||||
"Options": {
|
||||
"com.docker.network.bridge.default_bridge": "true",
|
||||
"com.docker.network.bridge.enable_icc": "true",
|
||||
"com.docker.network.bridge.enable_ip_masquerade": "true",
|
||||
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
|
||||
"com.docker.network.bridge.name": "docker0",
|
||||
"com.docker.network.driver.mtu": "9001"
|
||||
}
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
The `docker network inspect` command above shows all the connected containers and their network resources on a given network. Containers in this default network are able to communicate with each other using IP addresses. Docker does not support automatic service discovery on the default bridge network. If you want to communicate with container names in this default bridge network, you must connect the containers via the legacy `docker run --link` option.
|
||||
|
||||
You can `attach` to a running `container` and investigate its configuration:
|
||||
|
||||
```
|
||||
$ docker attach container1
|
||||
|
||||
/ # ifconfig
|
||||
ifconfig
|
||||
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
|
||||
inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
|
||||
inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
|
||||
UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
|
||||
RX packets:16 errors:0 dropped:0 overruns:0 frame:0
|
||||
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
|
||||
collisions:0 txqueuelen:0
|
||||
RX bytes:1296 (1.2 KiB) TX bytes:648 (648.0 B)
|
||||
|
||||
lo Link encap:Local Loopback
|
||||
inet addr:127.0.0.1 Mask:255.0.0.0
|
||||
inet6 addr: ::1/128 Scope:Host
|
||||
UP LOOPBACK RUNNING MTU:65536 Metric:1
|
||||
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
|
||||
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
|
||||
collisions:0 txqueuelen:0
|
||||
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
|
||||
```
|
||||
|
||||
Then use `ping` for about 3 seconds to test the connectivity of the containers on this `bridge` network.
|
||||
|
||||
```
|
||||
/ # ping -w3 172.17.0.3
|
||||
PING 172.17.0.3 (172.17.0.3): 56 data bytes
|
||||
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.096 ms
|
||||
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.074 ms
|
||||
|
||||
--- 172.17.0.3 ping statistics ---
|
||||
3 packets transmitted, 3 packets received, 0% packet loss
|
||||
round-trip min/avg/max = 0.074/0.083/0.096 ms
|
||||
```
|
||||
|
||||
Finally, use the `cat` command to check the `container1` network configuration:
|
||||
|
||||
```
|
||||
/ # cat /etc/hosts
|
||||
172.17.0.2 3386a527aa08
|
||||
127.0.0.1 localhost
|
||||
::1 localhost ip6-localhost ip6-loopback
|
||||
fe00::0 ip6-localnet
|
||||
ff00::0 ip6-mcastprefix
|
||||
ff02::1 ip6-allnodes
|
||||
ff02::2 ip6-allrouters
|
||||
```
|
||||
To detach from a `container1` and leave it running use `CTRL-p CTRL-q`.Then, attach to `container2` and repeat these three commands.
|
||||
|
||||
```
|
||||
$ docker attach container2
|
||||
|
||||
/ # ifconfig
|
||||
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03
|
||||
inet addr:172.17.0.3 Bcast:0.0.0.0 Mask:255.255.0.0
|
||||
inet6 addr: fe80::42:acff:fe11:3/64 Scope:Link
|
||||
UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
|
||||
RX packets:15 errors:0 dropped:0 overruns:0 frame:0
|
||||
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
|
||||
collisions:0 txqueuelen:0
|
||||
RX bytes:1166 (1.1 KiB) TX bytes:1026 (1.0 KiB)
|
||||
|
||||
lo Link encap:Local Loopback
|
||||
inet addr:127.0.0.1 Mask:255.0.0.0
|
||||
inet6 addr: ::1/128 Scope:Host
|
||||
UP LOOPBACK RUNNING MTU:65536 Metric:1
|
||||
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
|
||||
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
|
||||
collisions:0 txqueuelen:0
|
||||
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
|
||||
|
||||
/ # ping -w3 172.17.0.2
|
||||
PING 172.17.0.2 (172.17.0.2): 56 data bytes
|
||||
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.067 ms
|
||||
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.075 ms
|
||||
64 bytes from 172.17.0.2: seq=2 ttl=64 time=0.072 ms
|
||||
|
||||
--- 172.17.0.2 ping statistics ---
|
||||
3 packets transmitted, 3 packets received, 0% packet loss
|
||||
round-trip min/avg/max = 0.067/0.071/0.075 ms
|
||||
/ # cat /etc/hosts
|
||||
172.17.0.3 94447ca47985
|
||||
127.0.0.1 localhost
|
||||
::1 localhost ip6-localhost ip6-loopback
|
||||
fe00::0 ip6-localnet
|
||||
ff00::0 ip6-mcastprefix
|
||||
ff02::1 ip6-allnodes
|
||||
ff02::2 ip6-allrouters
|
||||
```
|
||||
|
||||
The default `docker0` bridge network supports the use of port mapping and `docker run --link` to allow communications between containers in the `docker0` network. These techniques are cumbersome to set up and prone to error. While they are still available to you as techniques, it is better to avoid them and define your own bridge networks instead.
|
||||
|
||||
## User-defined networks
|
||||
|
||||
You can create your own user-defined networks that better isolate containers.
|
||||
Docker provides some default **network drivers** for creating these
|
||||
networks. You can create a new **bridge network** or **overlay network**. You
|
||||
can also create a **network plugin** or **remote network** written to your own
|
||||
specifications.
|
||||
|
||||
You can create multiple networks. You can add containers to more than one
|
||||
network. Containers can only communicate within networks but not across
|
||||
networks. A container attached to two networks can communicate with member
|
||||
containers in either network.
|
||||
|
||||
The next few sections describe each of Docker's built-in network drivers in
|
||||
greater detail.
|
||||
|
||||
### A bridge network
|
||||
|
||||
The easiest user-defined network to create is a `bridge` network. This network
|
||||
is similar to the historical, default `docker0` network. There are some added
|
||||
features and some old features that aren't available.
|
||||
|
||||
```
|
||||
$ docker network create --driver bridge isolated_nw
|
||||
1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b
|
||||
|
||||
$ docker network inspect isolated_nw
|
||||
[
|
||||
{
|
||||
"Name": "isolated_nw",
|
||||
"Id": "1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b",
|
||||
"Scope": "local",
|
||||
"Driver": "bridge",
|
||||
"IPAM": {
|
||||
"Driver": "default",
|
||||
"Config": [
|
||||
{
|
||||
"Subnet": "172.21.0.0/16",
|
||||
"Gateway": "172.21.0.1/16"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Containers": {},
|
||||
"Options": {}
|
||||
}
|
||||
]
|
||||
|
||||
$ docker network ls
|
||||
NETWORK ID NAME DRIVER
|
||||
9f904ee27bf5 none null
|
||||
cf03ee007fb4 host host
|
||||
7fca4eb8c647 bridge bridge
|
||||
c5ee82f76de3 isolated_nw bridge
|
||||
|
||||
```
|
||||
|
||||
After you create the network, you can launch containers on it using the `docker run --net=<NETWORK>` option.
|
||||
|
||||
```
|
||||
$ docker run --net=isolated_nw -itd --name=container3 busybox
|
||||
8c1a0a5be480921d669a073393ade66a3fc49933f08bcc5515b37b8144f6d47c
|
||||
|
||||
$ docker network inspect isolated_nw
|
||||
[
|
||||
{
|
||||
"Name": "isolated_nw",
|
||||
"Id": "1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b",
|
||||
"Scope": "local",
|
||||
"Driver": "bridge",
|
||||
"IPAM": {
|
||||
"Driver": "default",
|
||||
"Config": [
|
||||
{}
|
||||
]
|
||||
},
|
||||
"Containers": {
|
||||
"8c1a0a5be480921d669a073393ade66a3fc49933f08bcc5515b37b8144f6d47c": {
|
||||
"EndpointID": "93b2db4a9b9a997beb912d28bcfc117f7b0eb924ff91d48cfa251d473e6a9b08",
|
||||
"MacAddress": "02:42:ac:15:00:02",
|
||||
"IPv4Address": "172.21.0.2/16",
|
||||
"IPv6Address": ""
|
||||
}
|
||||
},
|
||||
"Options": {}
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
The containers you launch into this network must reside on the same Docker host.
|
||||
Each container in the network can immediately communicate with other containers
|
||||
in the network. Though, the network itself isolates the containers from external
|
||||
networks.
|
||||
|
||||

|
||||
|
||||
Within a user-defined bridge network, linking is not supported. You can
|
||||
expose and publish container ports on containers in this network. This is useful
|
||||
if you want to make a portion of the `bridge` network available to an outside
|
||||
network.
|
||||
|
||||

|
||||
|
||||
A bridge network is useful in cases where you want to run a relatively small
|
||||
network on a single host. You can, however, create significantly larger networks
|
||||
by creating an `overlay` network.
|
||||
|
||||
|
||||
### An overlay network
|
||||
|
||||
Docker's `overlay` network driver supports multi-host networking natively
|
||||
out-of-the-box. This support is accomplished with the help of `libnetwork`, a
|
||||
built-in VXLAN-based overlay network driver, and Docker's `libkv` library.
|
||||
|
||||
The `overlay` network requires a valid key-value store service. Currently,
|
||||
Docker's `libkv` supports Consul, Etcd, and ZooKeeper (Distributed store). Before
|
||||
creating a network you must install and configure your chosen key-value store
|
||||
service. The Docker hosts that you intend to network and the service must be
|
||||
able to communicate.
|
||||
|
||||

|
||||
|
||||
Each host in the network must run a Docker Engine instance. The easiest way to
|
||||
provision the hosts are with Docker Machine.
|
||||
|
||||

|
||||
|
||||
You should open the following ports between each of your hosts.
|
||||
|
||||
| Protocol | Port | Description |
|
||||
|----------|------|-----------------------|
|
||||
| udp | 4789 | Data plane (VXLAN) |
|
||||
| tcp/udp | 7946 | Control plane |
|
||||
|
||||
Your key-value store service may require additional ports.
|
||||
Check your vendor's documentation and open any required ports.
|
||||
|
||||
Once you have several machines provisioned, you can use Docker Swarm to quickly
|
||||
form them into a swarm which includes a discovery service as well.
|
||||
|
||||
To create an overlay network, you configure options on the `daemon` on each
|
||||
Docker Engine for use with `overlay` network. There are two options to set:
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Option</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><pre>--cluster-store=PROVIDER://URL</pre></td>
|
||||
<td>Describes the location of the KV service.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><pre>--cluster-advertise=HOST_IP|HOST_IFACE:PORT</pre></td>
|
||||
<td>The IP address or interface of the HOST used for clustering.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><pre>--cluster-store-opt=KEY-VALUE OPTIONS</pre></td>
|
||||
<td>Options such as TLS certificate or tuning discovery Timers</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
Create an `overlay` network on one of the machines in the Swarm.
|
||||
|
||||
$ docker network create --driver overlay my-multi-host-network
|
||||
|
||||
This results in a single network spanning multiple hosts. An `overlay` network
|
||||
provides complete isolation for the containers.
|
||||
|
||||

|
||||
|
||||
Then, on each host, launch containers making sure to specify the network name.
|
||||
|
||||
$ docker run -itd --net=my-multi-host-network busybox
|
||||
|
||||
Once connected, each container has access to all the containers in the network
|
||||
regardless of which Docker host the container was launched on.
|
||||
|
||||

|
||||
|
||||
If you would like to try this for yourself, see the [Getting started for
|
||||
overlay](get-started-overlay.md).
|
||||
|
||||
### Custom network plugin
|
||||
|
||||
If you like, you can write your own network driver plugin. A network
|
||||
driver plugin makes use of Docker's plugin infrastructure. In this
|
||||
infrastructure, a plugin is a process running on the same Docker host as the
|
||||
Docker `daemon`.
|
||||
|
||||
Network plugins follow the same restrictions and installation rules as other
|
||||
plugins. All plugins make use of the plugin API. They have a lifecycle that
|
||||
encompasses installation, starting, stopping and activation.
|
||||
|
||||
Once you have created and installed a custom network driver, you use it like the
|
||||
built-in network drivers. For example:
|
||||
|
||||
$ docker network create --driver weave mynet
|
||||
|
||||
You can inspect it, add containers too and from it, and so forth. Of course,
|
||||
different plugins may make use of different technologies or frameworks. Custom
|
||||
networks can include features not present in Docker's default networks. For more
|
||||
information on writing plugins, see [Extending Docker](../../extend/index.md) and
|
||||
[Writing a network driver plugin](../../extend/plugins_network.md).
|
||||
|
||||
### Docker embedded DNS server
|
||||
|
||||
Docker daemon runs an embedded DNS server to provide automatic service discovery
|
||||
for containers connected to user defined networks. Name resolution requests from
|
||||
the containers are handled first by the embedded DNS server. If the embedded DNS
|
||||
server is unable to resolve the request it will be forwarded to any external DNS
|
||||
servers configured for the container. To facilitate this when the container is
|
||||
created, only the embedded DNS server reachable at `127.0.0.11` will be listed
|
||||
in the container's `resolv.conf` file. More information on embedded DNS server on
|
||||
user-defined networks can be found in the [embedded DNS server in user-defined networks]
|
||||
(configure-dns.md)
|
||||
|
||||
## Links
|
||||
|
||||
Before the Docker network feature, you could use the Docker link feature to
|
||||
allow containers to discover each other. With the introduction of Docker networks,
|
||||
containers can be discovered by its name automatically. But you can still create
|
||||
links but they behave differently when used in the default `docker0` bridge network
|
||||
compared to user-defined networks. For more information, please refer to
|
||||
[Legacy Links](default_network/dockerlinks.md) for link feature in default `bridge` network
|
||||
and the [linking containers in user-defined networks](work-with-networks.md#linking-containers-in-user-defined-networks) for links
|
||||
functionality in user-defined networks.
|
||||
|
||||
## Related information
|
||||
|
||||
- [Work with network commands](work-with-networks.md)
|
||||
- [Get started with multi-host networking](get-started-overlay.md)
|
||||
- [Managing Data in Containers](../containers/dockervolumes.md)
|
||||
- [Docker Machine overview](https://docs.docker.com/machine)
|
||||
- [Docker Swarm overview](https://docs.docker.com/swarm)
|
||||
- [Investigate the LibNetwork project](https://github.com/docker/libnetwork)
|
||||
326
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/get-started-overlay.md
generated
vendored
Normal file
@@ -0,0 +1,326 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
title = "Get started with multi-host networking"
|
||||
description = "Use overlay for multi-host networking"
|
||||
keywords = ["Examples, Usage, network, docker, documentation, user guide, multihost, cluster"]
|
||||
[menu.main]
|
||||
parent = "smn_networking"
|
||||
weight=-3
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Get started with multi-host networking
|
||||
|
||||
This article uses an example to explain the basics of creating a multi-host
|
||||
network. Docker Engine supports multi-host networking out-of-the-box through the
|
||||
`overlay` network driver. Unlike `bridge` networks, overlay networks require
|
||||
some pre-existing conditions before you can create one. These conditions are:
|
||||
|
||||
* Access to a key-value store. Docker supports Consul, Etcd, and ZooKeeper (Distributed store) key-value stores.
|
||||
* A cluster of hosts with connectivity to the key-value store.
|
||||
* A properly configured Engine `daemon` on each host in the cluster.
|
||||
|
||||
Though Docker Machine and Docker Swarm are not mandatory to experience Docker
|
||||
multi-host networking, this example uses them to illustrate how they are
|
||||
integrated. You'll use Machine to create both the key-value store
|
||||
server and the host cluster. This example creates a Swarm cluster.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Before you begin, make sure you have a system on your network with the latest
|
||||
version of Docker Engine and Docker Machine installed. The example also relies
|
||||
on VirtualBox. If you installed on a Mac or Windows with Docker Toolbox, you
|
||||
have all of these installed already.
|
||||
|
||||
If you have not already done so, make sure you upgrade Docker Engine and Docker
|
||||
Machine to the latest versions.
|
||||
|
||||
|
||||
## Step 1: Set up a key-value store
|
||||
|
||||
An overlay network requires a key-value store. The key-value store holds
|
||||
information about the network state which includes discovery, networks,
|
||||
endpoints, IP addresses, and more. Docker supports Consul, Etcd, and ZooKeeper
|
||||
key-value stores. This example uses Consul.
|
||||
|
||||
1. Log into a system prepared with the prerequisite Docker Engine, Docker Machine, and VirtualBox software.
|
||||
|
||||
2. Provision a VirtualBox machine called `mh-keystore`.
|
||||
|
||||
$ docker-machine create -d virtualbox mh-keystore
|
||||
|
||||
When you provision a new machine, the process adds Docker Engine to the
|
||||
host. This means rather than installing Consul manually, you can create an
|
||||
instance using the [consul image from Docker
|
||||
Hub](https://hub.docker.com/r/progrium/consul/). You'll do this in the next step.
|
||||
|
||||
3. Start a `progrium/consul` container running on the `mh-keystore` machine.
|
||||
|
||||
$ docker $(docker-machine config mh-keystore) run -d \
|
||||
-p "8500:8500" \
|
||||
-h "consul" \
|
||||
progrium/consul -server -bootstrap
|
||||
|
||||
A bash expansion `$(docker-machine config mh-keystore)` is used to pass the
|
||||
connection configuration to the `docker run` command. The client starts a
|
||||
`progrium/consul` image running in the `mh-keystore` machine. The server is
|
||||
called `consul` and is listening on port `8500`.
|
||||
|
||||
4. Set your local environment to the `mh-keystore` machine.
|
||||
|
||||
$ eval "$(docker-machine env mh-keystore)"
|
||||
|
||||
5. Run the `docker ps` command to see the `consul` container.
|
||||
|
||||
$ docker ps
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
4d51392253b3 progrium/consul "/bin/start -server -" 25 minutes ago Up 25 minutes 53/tcp, 53/udp, 8300-8302/tcp, 0.0.0.0:8500->8500/tcp, 8400/tcp, 8301-8302/udp admiring_panini
|
||||
|
||||
Keep your terminal open and move onto the next step.
|
||||
|
||||
|
||||
## Step 2: Create a Swarm cluster
|
||||
|
||||
In this step, you use `docker-machine` to provision the hosts for your network.
|
||||
At this point, you won't actually create the network. You'll create several
|
||||
machines in VirtualBox. One of the machines will act as the Swarm master;
|
||||
you'll create that first. As you create each host, you'll pass the Engine on
|
||||
that machine options that are needed by the `overlay` network driver.
|
||||
|
||||
1. Create a Swarm master.
|
||||
|
||||
$ docker-machine create \
|
||||
-d virtualbox \
|
||||
--swarm --swarm-master \
|
||||
--swarm-discovery="consul://$(docker-machine ip mh-keystore):8500" \
|
||||
--engine-opt="cluster-store=consul://$(docker-machine ip mh-keystore):8500" \
|
||||
--engine-opt="cluster-advertise=eth1:2376" \
|
||||
mhs-demo0
|
||||
|
||||
At creation time, you supply the Engine `daemon` with the ` --cluster-store` option. This option tells the Engine the location of the key-value store for the `overlay` network. The bash expansion `$(docker-machine ip mh-keystore)` resolves to the IP address of the Consul server you created in "STEP 1". The `--cluster-advertise` option advertises the machine on the network.
|
||||
|
||||
2. Create another host and add it to the Swarm cluster.
|
||||
|
||||
$ docker-machine create -d virtualbox \
|
||||
--swarm \
|
||||
--swarm-discovery="consul://$(docker-machine ip mh-keystore):8500" \
|
||||
--engine-opt="cluster-store=consul://$(docker-machine ip mh-keystore):8500" \
|
||||
--engine-opt="cluster-advertise=eth1:2376" \
|
||||
mhs-demo1
|
||||
|
||||
3. List your machines to confirm they are all up and running.
|
||||
|
||||
$ docker-machine ls
|
||||
NAME ACTIVE DRIVER STATE URL SWARM
|
||||
default - virtualbox Running tcp://192.168.99.100:2376
|
||||
mh-keystore * virtualbox Running tcp://192.168.99.103:2376
|
||||
mhs-demo0 - virtualbox Running tcp://192.168.99.104:2376 mhs-demo0 (master)
|
||||
mhs-demo1 - virtualbox Running tcp://192.168.99.105:2376 mhs-demo0
|
||||
|
||||
At this point you have a set of hosts running on your network. You are ready to create a multi-host network for containers using these hosts.
|
||||
|
||||
Leave your terminal open and go onto the next step.
|
||||
|
||||
## Step 3: Create the overlay Network
|
||||
|
||||
To create an overlay network
|
||||
|
||||
1. Set your docker environment to the Swarm master.
|
||||
|
||||
$ eval $(docker-machine env --swarm mhs-demo0)
|
||||
|
||||
Using the `--swarm` flag with `docker-machine` restricts the `docker` commands to Swarm information alone.
|
||||
|
||||
2. Use the `docker info` command to view the Swarm.
|
||||
|
||||
$ docker info
|
||||
Containers: 3
|
||||
Images: 2
|
||||
Role: primary
|
||||
Strategy: spread
|
||||
Filters: affinity, health, constraint, port, dependency
|
||||
Nodes: 2
|
||||
mhs-demo0: 192.168.99.104:2376
|
||||
└ Containers: 2
|
||||
└ Reserved CPUs: 0 / 1
|
||||
└ Reserved Memory: 0 B / 1.021 GiB
|
||||
└ Labels: executiondriver=native-0.2, kernelversion=4.1.10-boot2docker, operatingsystem=Boot2Docker 1.9.0-rc1 (TCL 6.4); master : 4187d2c - Wed Oct 14 14:00:28 UTC 2015, provider=virtualbox, storagedriver=aufs
|
||||
mhs-demo1: 192.168.99.105:2376
|
||||
└ Containers: 1
|
||||
└ Reserved CPUs: 0 / 1
|
||||
└ Reserved Memory: 0 B / 1.021 GiB
|
||||
└ Labels: executiondriver=native-0.2, kernelversion=4.1.10-boot2docker, operatingsystem=Boot2Docker 1.9.0-rc1 (TCL 6.4); master : 4187d2c - Wed Oct 14 14:00:28 UTC 2015, provider=virtualbox, storagedriver=aufs
|
||||
CPUs: 2
|
||||
Total Memory: 2.043 GiB
|
||||
Name: 30438ece0915
|
||||
|
||||
From this information, you can see that you are running three containers and two images on the Master.
|
||||
|
||||
3. Create your `overlay` network.
|
||||
|
||||
$ docker network create --driver overlay --subnet=10.0.9.0/24 my-net
|
||||
|
||||
You only need to create the network on a single host in the cluster. In this case, you used the Swarm master but you could easily have run it on any host in the cluster.
|
||||
|
||||
> **Note** : It is highly recommended to use the `--subnet` option when creating
|
||||
> a network. If the `--subnet` is not specified, the docker daemon automatically
|
||||
> chooses and assigns a subnet for the network and it could overlap with another subnet
|
||||
> in your infrastructure that is not managed by docker. Such overlaps can cause
|
||||
> connectivity issues or failures when containers are connected to that network.
|
||||
|
||||
4. Check that the network is running:
|
||||
|
||||
$ docker network ls
|
||||
NETWORK ID NAME DRIVER
|
||||
412c2496d0eb mhs-demo1/host host
|
||||
dd51763e6dd2 mhs-demo0/bridge bridge
|
||||
6b07d0be843f my-net overlay
|
||||
b4234109bd9b mhs-demo0/none null
|
||||
1aeead6dd890 mhs-demo0/host host
|
||||
d0bb78cbe7bd mhs-demo1/bridge bridge
|
||||
1c0eb8f69ebb mhs-demo1/none null
|
||||
|
||||
As you are in the Swarm master environment, you see all the networks on all
|
||||
the Swarm agents: the default networks on each engine and the single overlay
|
||||
network. Notice that each `NETWORK ID` is unique.
|
||||
|
||||
5. Switch to each Swarm agent in turn and list the networks.
|
||||
|
||||
$ eval $(docker-machine env mhs-demo0)
|
||||
$ docker network ls
|
||||
NETWORK ID NAME DRIVER
|
||||
6b07d0be843f my-net overlay
|
||||
dd51763e6dd2 bridge bridge
|
||||
b4234109bd9b none null
|
||||
1aeead6dd890 host host
|
||||
$ eval $(docker-machine env mhs-demo1)
|
||||
$ docker network ls
|
||||
NETWORK ID NAME DRIVER
|
||||
d0bb78cbe7bd bridge bridge
|
||||
1c0eb8f69ebb none null
|
||||
412c2496d0eb host host
|
||||
6b07d0be843f my-net overlay
|
||||
|
||||
Both agents report they have the `my-net` network with the `6b07d0be843f` ID.
|
||||
You now have a multi-host container network running!
|
||||
|
||||
## Step 4: Run an application on your Network
|
||||
|
||||
Once your network is created, you can start a container on any of the hosts and it automatically is part of the network.
|
||||
|
||||
1. Point your environment to the Swarm master.
|
||||
|
||||
$ eval $(docker-machine env --swarm mhs-demo0)
|
||||
|
||||
2. Start an Nginx web server on the `mhs-demo0` instance.
|
||||
|
||||
$ docker run -itd --name=web --net=my-net --env="constraint:node==mhs-demo0" nginx
|
||||
|
||||
4. Run a BusyBox instance on the `mhs-demo1` instance and get the contents of the Nginx server's home page.
|
||||
|
||||
$ docker run -it --rm --net=my-net --env="constraint:node==mhs-demo1" busybox wget -O- http://web
|
||||
Unable to find image 'busybox:latest' locally
|
||||
latest: Pulling from library/busybox
|
||||
ab2b8a86ca6c: Pull complete
|
||||
2c5ac3f849df: Pull complete
|
||||
Digest: sha256:5551dbdfc48d66734d0f01cafee0952cb6e8eeecd1e2492240bf2fd9640c2279
|
||||
Status: Downloaded newer image for busybox:latest
|
||||
Connecting to web (10.0.0.2:80)
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Welcome to nginx!</title>
|
||||
<style>
|
||||
body {
|
||||
width: 35em;
|
||||
margin: 0 auto;
|
||||
font-family: Tahoma, Verdana, Arial, sans-serif;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Welcome to nginx!</h1>
|
||||
<p>If you see this page, the nginx web server is successfully installed and
|
||||
working. Further configuration is required.</p>
|
||||
|
||||
<p>For online documentation and support please refer to
|
||||
<a href="http://nginx.org/">nginx.org</a>.<br/>
|
||||
Commercial support is available at
|
||||
<a href="http://nginx.com/">nginx.com</a>.</p>
|
||||
|
||||
<p><em>Thank you for using nginx.</em></p>
|
||||
</body>
|
||||
</html>
|
||||
- 100% |*******************************| 612 0:00:00 ETA
|
||||
|
||||
## Step 5: Check external connectivity
|
||||
|
||||
As you've seen, Docker's built-in overlay network driver provides out-of-the-box
|
||||
connectivity between the containers on multiple hosts within the same network.
|
||||
Additionally, containers connected to the multi-host network are automatically
|
||||
connected to the `docker_gwbridge` network. This network allows the containers
|
||||
to have external connectivity outside of their cluster.
|
||||
|
||||
1. Change your environment to the Swarm agent.
|
||||
|
||||
$ eval $(docker-machine env mhs-demo1)
|
||||
|
||||
2. View the `docker_gwbridge` network, by listing the networks.
|
||||
|
||||
$ docker network ls
|
||||
NETWORK ID NAME DRIVER
|
||||
6b07d0be843f my-net overlay
|
||||
dd51763e6dd2 bridge bridge
|
||||
b4234109bd9b none null
|
||||
1aeead6dd890 host host
|
||||
e1dbd5dff8be docker_gwbridge bridge
|
||||
|
||||
3. Repeat steps 1 and 2 on the Swarm master.
|
||||
|
||||
$ eval $(docker-machine env mhs-demo0)
|
||||
$ docker network ls
|
||||
NETWORK ID NAME DRIVER
|
||||
6b07d0be843f my-net overlay
|
||||
d0bb78cbe7bd bridge bridge
|
||||
1c0eb8f69ebb none null
|
||||
412c2496d0eb host host
|
||||
97102a22e8d2 docker_gwbridge bridge
|
||||
|
||||
2. Check the Nginx container's network interfaces.
|
||||
|
||||
$ docker exec web ip addr
|
||||
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
|
||||
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
||||
inet 127.0.0.1/8 scope host lo
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 ::1/128 scope host
|
||||
valid_lft forever preferred_lft forever
|
||||
22: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
|
||||
link/ether 02:42:0a:00:09:03 brd ff:ff:ff:ff:ff:ff
|
||||
inet 10.0.9.3/24 scope global eth0
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 fe80::42:aff:fe00:903/64 scope link
|
||||
valid_lft forever preferred_lft forever
|
||||
24: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
|
||||
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
|
||||
inet 172.18.0.2/16 scope global eth1
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 fe80::42:acff:fe12:2/64 scope link
|
||||
valid_lft forever preferred_lft forever
|
||||
|
||||
The `eth0` interface represents the container interface that is connected to
|
||||
the `my-net` overlay network. While the `eth1` interface represents the
|
||||
container interface that is connected to the `docker_gwbridge` network.
|
||||
|
||||
## Step 6: Extra Credit with Docker Compose
|
||||
|
||||
Please refer to the Networking feature introduced in [Compose V2 format]
|
||||
(https://docs.docker.com/compose/networking/) and execute the
|
||||
multi-host networking scenario in the Swarm cluster used above.
|
||||
|
||||
## Related information
|
||||
|
||||
* [Understand Docker container networks](dockernetworks.md)
|
||||
* [Work with network commands](work-with-networks.md)
|
||||
* [Docker Swarm overview](https://docs.docker.com/swarm)
|
||||
* [Docker Machine overview](https://docs.docker.com/machine)
|
||||
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/bridge_network.gliffy
generated
vendored
Normal file
BIN
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/bridge_network.png
generated
vendored
Normal file
|
After Width: | Height: | Size: 16 KiB |
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/bridge_network.svg
generated
vendored
Normal file
|
After Width: | Height: | Size: 23 KiB |
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/engine_on_net.gliffy
generated
vendored
Normal file
BIN
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/engine_on_net.png
generated
vendored
Normal file
|
After Width: | Height: | Size: 14 KiB |
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/engine_on_net.svg
generated
vendored
Normal file
|
After Width: | Height: | Size: 36 KiB |
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/key_value.gliffy
generated
vendored
Normal file
BIN
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/key_value.png
generated
vendored
Normal file
|
After Width: | Height: | Size: 13 KiB |
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/key_value.svg
generated
vendored
Normal file
|
After Width: | Height: | Size: 26 KiB |
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/network_access.gliffy
generated
vendored
Normal file
BIN
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/network_access.png
generated
vendored
Normal file
|
After Width: | Height: | Size: 30 KiB |
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/network_access.svg
generated
vendored
Normal file
|
After Width: | Height: | Size: 43 KiB |
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/overlay-network-final.gliffy
generated
vendored
Normal file
BIN
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/overlay-network-final.png
generated
vendored
Normal file
|
After Width: | Height: | Size: 27 KiB |
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/overlay-network-final.svg
generated
vendored
Normal file
|
After Width: | Height: | Size: 53 KiB |
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/overlay_network.gliffy
generated
vendored
Normal file
BIN
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/overlay_network.png
generated
vendored
Normal file
|
After Width: | Height: | Size: 23 KiB |
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/overlay_network.svg
generated
vendored
Normal file
|
After Width: | Height: | Size: 44 KiB |
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/working.gliffy
generated
vendored
Normal file
BIN
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/working.png
generated
vendored
Normal file
|
After Width: | Height: | Size: 18 KiB |
1
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/images/working.svg
generated
vendored
Normal file
|
After Width: | Height: | Size: 19 KiB |
21
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/index.md
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
title = "Network configuration"
|
||||
description = "Docker networking feature is introduced"
|
||||
keywords = ["network, networking, bridge, docker, documentation"]
|
||||
[menu.main]
|
||||
identifier="smn_networking"
|
||||
parent= "engine_guide"
|
||||
weight=7
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Docker networks feature overview
|
||||
|
||||
This sections explains how to use the Docker networks feature. This feature allows users to define their own networks and connect containers to them. Using this feature you can create a network on a single host or a network that spans across multiple hosts.
|
||||
|
||||
- [Understand Docker container networks](dockernetworks.md)
|
||||
- [Work with network commands](work-with-networks.md)
|
||||
- [Get started with multi-host networking](get-started-overlay.md)
|
||||
|
||||
If you are already familiar with Docker's default bridge network, `docker0` that network continues to be supported. It is created automatically in every installation. The default bridge network is also named `bridge`. To see a list of topics related to that network, read the articles listed in the [Docker default bridge network](default_network/index.md).
|
||||
856
vendor/github.com/hyperhq/hypercli/docs/userguide/networking/work-with-networks.md
generated
vendored
Normal file
@@ -0,0 +1,856 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
title = "Work with network commands"
|
||||
description = "How to work with docker networks"
|
||||
keywords = ["commands, Usage, network, docker, cluster"]
|
||||
[menu.main]
|
||||
parent = "smn_networking"
|
||||
weight=-4
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Work with network commands
|
||||
|
||||
This article provides examples of the network subcommands you can use to interact with Docker networks and the containers in them. The commands are available through the Docker Engine CLI. These commands are:
|
||||
|
||||
* `docker network create`
|
||||
* `docker network connect`
|
||||
* `docker network ls`
|
||||
* `docker network rm`
|
||||
* `docker network disconnect`
|
||||
* `docker network inspect`
|
||||
|
||||
While not required, it is a good idea to read [Understanding Docker
|
||||
network](dockernetworks.md) before trying the examples in this section. The
|
||||
examples for the rely on a `bridge` network so that you can try them
|
||||
immediately. If you would prefer to experiment with an `overlay` network see
|
||||
the [Getting started with multi-host networks](get-started-overlay.md) instead.
|
||||
|
||||
## Create networks
|
||||
|
||||
Docker Engine creates a `bridge` network automatically when you install Engine.
|
||||
This network corresponds to the `docker0` bridge that Engine has traditionally
|
||||
relied on. In addition to this network, you can create your own `bridge` or `overlay` network.
|
||||
|
||||
A `bridge` network resides on a single host running an instance of Docker Engine. An `overlay` network can span multiple hosts running their own engines. If you run `docker network create` and supply only a network name, it creates a bridge network for you.
|
||||
|
||||
```bash
|
||||
$ docker network create simple-network
|
||||
69568e6336d8c96bbf57869030919f7c69524f71183b44d80948bd3927c87f6a
|
||||
$ docker network inspect simple-network
|
||||
[
|
||||
{
|
||||
"Name": "simple-network",
|
||||
"Id": "69568e6336d8c96bbf57869030919f7c69524f71183b44d80948bd3927c87f6a",
|
||||
"Scope": "local",
|
||||
"Driver": "bridge",
|
||||
"IPAM": {
|
||||
"Driver": "default",
|
||||
"Config": [
|
||||
{
|
||||
"Subnet": "172.22.0.0/16",
|
||||
"Gateway": "172.22.0.1/16"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Containers": {},
|
||||
"Options": {}
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
Unlike `bridge` networks, `overlay` networks require some pre-existing conditions
|
||||
before you can create one. These conditions are:
|
||||
|
||||
* Access to a key-value store. Engine supports Consul Etcd, and ZooKeeper (Distributed store) key-value stores.
|
||||
* A cluster of hosts with connectivity to the key-value store.
|
||||
* A properly configured Engine `daemon` on each host in the swarm.
|
||||
|
||||
The `docker daemon` options that support the `overlay` network are:
|
||||
|
||||
* `--cluster-store`
|
||||
* `--cluster-store-opt`
|
||||
* `--cluster-advertise`
|
||||
|
||||
It is also a good idea, though not required, that you install Docker Swarm
|
||||
to manage the cluster. Swarm provides sophisticated discovery and server
|
||||
management that can assist your implementation.
|
||||
|
||||
When you create a network, Engine creates a non-overlapping subnetwork for the
|
||||
network by default. You can override this default and specify a subnetwork
|
||||
directly using the the `--subnet` option. On a `bridge` network you can only
|
||||
specify a single subnet. An `overlay` network supports multiple subnets.
|
||||
|
||||
> **Note** : It is highly recommended to use the `--subnet` option while creating
|
||||
> a network. If the `--subnet` is not specified, the docker daemon automatically
|
||||
> chooses and assigns a subnet for the network and it could overlap with another subnet
|
||||
> in your infrastructure that is not managed by docker. Such overlaps can cause
|
||||
> connectivity issues or failures when containers are connected to that network.
|
||||
|
||||
In addition to the `--subnetwork` option, you also specify the `--gateway` `--ip-range` and `--aux-address` options.
|
||||
|
||||
```bash
|
||||
$ docker network create -d overlay
|
||||
--subnet=192.168.0.0/16 --subnet=192.170.0.0/16
|
||||
--gateway=192.168.0.100 --gateway=192.170.0.100
|
||||
--ip-range=192.168.1.0/24
|
||||
--aux-address a=192.168.1.5 --aux-address b=192.168.1.6
|
||||
--aux-address a=192.170.1.5 --aux-address b=192.170.1.6
|
||||
my-multihost-network
|
||||
```
|
||||
|
||||
Be sure that your subnetworks do not overlap. If they do, the network create fails and Engine returns an error.
|
||||
|
||||
When creating a custom network, the default network driver (i.e. `bridge`) has additional options that can be passed.
|
||||
The following are those options and the equivalent docker daemon flags used for docker0 bridge:
|
||||
|
||||
| Option | Equivalent | Description |
|
||||
|--------------------------------------------------|-------------|-------------------------------------------------------|
|
||||
| `com.docker.network.bridge.name` | - | bridge name to be used when creating the Linux bridge |
|
||||
| `com.docker.network.bridge.enable_ip_masquerade` | `--ip-masq` | Enable IP masquerading |
|
||||
| `com.docker.network.bridge.enable_icc` | `--icc` | Enable or Disable Inter Container Connectivity |
|
||||
| `com.docker.network.bridge.host_binding_ipv4` | `--ip` | Default IP when binding container ports |
|
||||
| `com.docker.network.mtu` | `--mtu` | Set the containers network MTU |
|
||||
| `com.docker.network.enable_ipv6` | `--ipv6` | Enable IPv6 networking |
|
||||
|
||||
For example, now let's use `-o` or `--opt` options to specify an IP address binding when publishing ports:
|
||||
|
||||
```bash
|
||||
$ docker network create -o "com.docker.network.bridge.host_binding_ipv4"="172.23.0.1" my-network
|
||||
b1a086897963e6a2e7fc6868962e55e746bee8ad0c97b54a5831054b5f62672a
|
||||
$ docker network inspect my-network
|
||||
[
|
||||
{
|
||||
"Name": "my-network",
|
||||
"Id": "b1a086897963e6a2e7fc6868962e55e746bee8ad0c97b54a5831054b5f62672a",
|
||||
"Scope": "local",
|
||||
"Driver": "bridge",
|
||||
"IPAM": {
|
||||
"Driver": "default",
|
||||
"Options": {},
|
||||
"Config": [
|
||||
{
|
||||
"Subnet": "172.23.0.0/16",
|
||||
"Gateway": "172.23.0.1/16"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Containers": {},
|
||||
"Options": {
|
||||
"com.docker.network.bridge.host_binding_ipv4": "172.23.0.1"
|
||||
}
|
||||
}
|
||||
]
|
||||
$ docker run -d -P --name redis --net my-network redis
|
||||
bafb0c808c53104b2c90346f284bda33a69beadcab4fc83ab8f2c5a4410cd129
|
||||
$ docker ps
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
bafb0c808c53 redis "/entrypoint.sh redis" 4 seconds ago Up 3 seconds 172.23.0.1:32770->6379/tcp redis
|
||||
```
|
||||
|
||||
## Connect containers
|
||||
|
||||
You can connect containers dynamically to one or more networks. These networks
|
||||
can be backed the same or different network drivers. Once connected, the
|
||||
containers can communicate using another container's IP address or name.
|
||||
|
||||
For `overlay` networks or custom plugins that support multi-host
|
||||
connectivity, containers connected to the same multi-host network but launched
|
||||
from different hosts can also communicate in this way.
|
||||
|
||||
Create two containers for this example:
|
||||
|
||||
```bash
|
||||
$ docker run -itd --name=container1 busybox
|
||||
18c062ef45ac0c026ee48a83afa39d25635ee5f02b58de4abc8f467bcaa28731
|
||||
|
||||
$ docker run -itd --name=container2 busybox
|
||||
498eaaaf328e1018042c04b2de04036fc04719a6e39a097a4f4866043a2c2152
|
||||
```
|
||||
|
||||
Then create an isolated, `bridge` network to test with.
|
||||
|
||||
```bash
|
||||
$ docker network create -d bridge --subnet 172.25.0.0/16 isolated_nw
|
||||
06a62f1c73c4e3107c0f555b7a5f163309827bfbbf999840166065a8f35455a8
|
||||
```
|
||||
|
||||
Connect `container2` to the network and then `inspect` the network to verify the connection:
|
||||
|
||||
```
|
||||
$ docker network connect isolated_nw container2
|
||||
$ docker network inspect isolated_nw
|
||||
[
|
||||
{
|
||||
"Name": "isolated_nw",
|
||||
"Id": "06a62f1c73c4e3107c0f555b7a5f163309827bfbbf999840166065a8f35455a8",
|
||||
"Scope": "local",
|
||||
"Driver": "bridge",
|
||||
"IPAM": {
|
||||
"Driver": "default",
|
||||
"Config": [
|
||||
{
|
||||
"Subnet": "172.21.0.0/16",
|
||||
"Gateway": "172.21.0.1/16"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Containers": {
|
||||
"90e1f3ec71caf82ae776a827e0712a68a110a3f175954e5bd4222fd142ac9428": {
|
||||
"Name": "container2",
|
||||
"EndpointID": "11cedac1810e864d6b1589d92da12af66203879ab89f4ccd8c8fdaa9b1c48b1d",
|
||||
"MacAddress": "02:42:ac:19:00:02",
|
||||
"IPv4Address": "172.25.0.2/16",
|
||||
"IPv6Address": ""
|
||||
}
|
||||
},
|
||||
"Options": {}
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
You can see that the Engine automatically assigns an IP address to `container2`.
|
||||
Given we specified a `--subnet` when creating the network, Engine picked
|
||||
an address from that same subnet. Now, start a third container and connect it to
|
||||
the network on launch using the `docker run` command's `--net` option:
|
||||
|
||||
```bash
|
||||
$ docker run --net=isolated_nw --ip=172.25.3.3 -itd --name=container3 busybox
|
||||
467a7863c3f0277ef8e661b38427737f28099b61fa55622d6c30fb288d88c551
|
||||
```
|
||||
|
||||
As you can see you were able to specify the ip address for your container.
|
||||
As long as the network to which the container is connecting was created with
|
||||
a user specified subnet, you will be able to select the IPv4 and/or IPv6 address(es)
|
||||
for your container when executing `docker run` and `docker network connect` commands.
|
||||
The selected IP address is part of the container networking configuration and will be
|
||||
preserved across container reload. The feature is only available on user defined networks,
|
||||
because they guarantee their subnets configuration does not change across daemon reload.
|
||||
|
||||
Now, inspect the network resources used by `container3`.
|
||||
|
||||
```bash
|
||||
$ docker inspect --format='{{json .NetworkSettings.Networks}}' container3
|
||||
{"isolated_nw":{"IPAMConfig":{"IPv4Address":"172.25.3.3"},"NetworkID":"1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b",
|
||||
"EndpointID":"dffc7ec2915af58cc827d995e6ebdc897342be0420123277103c40ae35579103","Gateway":"172.25.0.1","IPAddress":"172.25.3.3","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:19:03:03"}}
|
||||
```
|
||||
Repeat this command for `container2`. If you have Python installed, you can pretty print the output.
|
||||
|
||||
```bash
|
||||
$ docker inspect --format='{{json .NetworkSettings.Networks}}' container2 | python -m json.tool
|
||||
{
|
||||
"bridge": {
|
||||
"NetworkID":"7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812",
|
||||
"EndpointID": "0099f9efb5a3727f6a554f176b1e96fca34cae773da68b3b6a26d046c12cb365",
|
||||
"Gateway": "172.17.0.1",
|
||||
"GlobalIPv6Address": "",
|
||||
"GlobalIPv6PrefixLen": 0,
|
||||
"IPAMConfig": null,
|
||||
"IPAddress": "172.17.0.3",
|
||||
"IPPrefixLen": 16,
|
||||
"IPv6Gateway": "",
|
||||
"MacAddress": "02:42:ac:11:00:03"
|
||||
},
|
||||
"isolated_nw": {
|
||||
"NetworkID":"1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b",
|
||||
"EndpointID": "11cedac1810e864d6b1589d92da12af66203879ab89f4ccd8c8fdaa9b1c48b1d",
|
||||
"Gateway": "172.25.0.1",
|
||||
"GlobalIPv6Address": "",
|
||||
"GlobalIPv6PrefixLen": 0,
|
||||
"IPAMConfig": null,
|
||||
"IPAddress": "172.25.0.2",
|
||||
"IPPrefixLen": 16,
|
||||
"IPv6Gateway": "",
|
||||
"MacAddress": "02:42:ac:19:00:02"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
You should find `container2` belongs to two networks. The `bridge` network
|
||||
which it joined by default when you launched it and the `isolated_nw` which you
|
||||
later connected it to.
|
||||
|
||||

|
||||
|
||||
In the case of `container3`, you connected it through `docker run` to the
|
||||
`isolated_nw` so that container is not connected to `bridge`.
|
||||
|
||||
Use the `docker attach` command to connect to the running `container2` and
|
||||
examine its networking stack:
|
||||
|
||||
```bash
|
||||
$ docker attach container2
|
||||
```
|
||||
|
||||
If you look a the container's network stack you should see two Ethernet interfaces, one for the default bridge network and one for the `isolated_nw` network.
|
||||
|
||||
```bash
|
||||
/ # ifconfig
|
||||
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03
|
||||
inet addr:172.17.0.3 Bcast:0.0.0.0 Mask:255.255.0.0
|
||||
inet6 addr: fe80::42:acff:fe11:3/64 Scope:Link
|
||||
UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
|
||||
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
|
||||
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
|
||||
collisions:0 txqueuelen:0
|
||||
RX bytes:648 (648.0 B) TX bytes:648 (648.0 B)
|
||||
|
||||
eth1 Link encap:Ethernet HWaddr 02:42:AC:15:00:02
|
||||
inet addr:172.25.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
|
||||
inet6 addr: fe80::42:acff:fe19:2/64 Scope:Link
|
||||
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
|
||||
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
|
||||
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
|
||||
collisions:0 txqueuelen:0
|
||||
RX bytes:648 (648.0 B) TX bytes:648 (648.0 B)
|
||||
|
||||
lo Link encap:Local Loopback
|
||||
inet addr:127.0.0.1 Mask:255.0.0.0
|
||||
inet6 addr: ::1/128 Scope:Host
|
||||
UP LOOPBACK RUNNING MTU:65536 Metric:1
|
||||
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
|
||||
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
|
||||
collisions:0 txqueuelen:0
|
||||
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
|
||||
|
||||
On the `isolated_nw` which was user defined, the Docker embedded DNS server enables name resolution for other containers in the network. Inside of `container2` it is possible to ping `container3` by name.
|
||||
|
||||
```bash
|
||||
/ # ping -w 4 container3
|
||||
PING container3 (172.25.3.3): 56 data bytes
|
||||
64 bytes from 172.25.3.3: seq=0 ttl=64 time=0.070 ms
|
||||
64 bytes from 172.25.3.3: seq=1 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.25.3.3: seq=2 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.25.3.3: seq=3 ttl=64 time=0.097 ms
|
||||
|
||||
--- container3 ping statistics ---
|
||||
4 packets transmitted, 4 packets received, 0% packet loss
|
||||
round-trip min/avg/max = 0.070/0.081/0.097 ms
|
||||
```
|
||||
|
||||
This isn't the case for the default `bridge` network. Both `container2` and `container1` are connected to the default bridge network. Docker does not support automatic service discovery on this network. For this reason, pinging `container1` by name fails as you would expect based on the `/etc/hosts` file:
|
||||
|
||||
```bash
|
||||
/ # ping -w 4 container1
|
||||
ping: bad address 'container1'
|
||||
```
|
||||
|
||||
A ping using the `container1` IP address does succeed though:
|
||||
|
||||
```bash
|
||||
/ # ping -w 4 172.17.0.2
|
||||
PING 172.17.0.2 (172.17.0.2): 56 data bytes
|
||||
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.095 ms
|
||||
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.075 ms
|
||||
64 bytes from 172.17.0.2: seq=2 ttl=64 time=0.072 ms
|
||||
64 bytes from 172.17.0.2: seq=3 ttl=64 time=0.101 ms
|
||||
|
||||
--- 172.17.0.2 ping statistics ---
|
||||
4 packets transmitted, 4 packets received, 0% packet loss
|
||||
round-trip min/avg/max = 0.072/0.085/0.101 ms
|
||||
```
|
||||
|
||||
If you wanted you could connect `container1` to `container2` with the `docker
|
||||
run --link` command and that would enable the two containers to interact by name
|
||||
as well as IP.
|
||||
|
||||
Detach from a `container2` and leave it running using `CTRL-p CTRL-q`.
|
||||
|
||||
In this example, `container2` is attached to both networks and so can talk to
|
||||
`container1` and `container3`. But `container3` and `container1` are not in the
|
||||
same network and cannot communicate. Test, this now by attaching to
|
||||
`container3` and attempting to ping `container1` by IP address.
|
||||
|
||||
```bash
|
||||
$ docker attach container3
|
||||
/ # ping 172.17.0.2
|
||||
PING 172.17.0.2 (172.17.0.2): 56 data bytes
|
||||
^C
|
||||
--- 172.17.0.2 ping statistics ---
|
||||
10 packets transmitted, 0 packets received, 100% packet loss
|
||||
|
||||
```
|
||||
|
||||
You can connect both running and non-running containers to a network. However,
|
||||
`docker network inspect` only displays information on running containers.
|
||||
|
||||
### Linking containers in user-defined networks
|
||||
|
||||
In the above example, container_2 was able to resolve container_3's name automatically
|
||||
in the user defined network `isolated_nw`, but the name resolution did not succeed
|
||||
automatically in the default `bridge` network. This is expected in order to maintain
|
||||
backward compatibility with [legacy link](default_network/dockerlinks.md).
|
||||
|
||||
The `legacy link` provided 4 major functionalities to the default `bridge` network.
|
||||
|
||||
* name resolution
|
||||
* name alias for the linked container using `--link=CONTAINER-NAME:ALIAS`
|
||||
* secured container connectivity (in isolation via `--icc=false`)
|
||||
* environment variable injection
|
||||
|
||||
Comparing the above 4 functionalities with the non-default user-defined networks such as
|
||||
`isolated_nw` in this example, without any additional config, `docker network` provides
|
||||
|
||||
* automatic name resolution using DNS
|
||||
* automatic secured isolated environment for the containers in a network
|
||||
* ability to dynamically attach and detach to multiple networks
|
||||
* supports the `--link` option to provide name alias for the linked container
|
||||
|
||||
Continuing with the above example, create another container `container_4` in `isolated_nw`
|
||||
with `--link` to provide additional name resolution using alias for other containers in
|
||||
the same network.
|
||||
|
||||
```bash
|
||||
$ docker run --net=isolated_nw -itd --name=container4 --link container5:c5 busybox
|
||||
01b5df970834b77a9eadbaff39051f237957bd35c4c56f11193e0594cfd5117c
|
||||
```
|
||||
|
||||
With the help of `--link` container4 will be able to reach container5 using the
|
||||
aliased name `c5` as well.
|
||||
|
||||
Please note that while creating container4, we linked to a container named `container5`
|
||||
which is not created yet. That is one of the differences in behavior between the
|
||||
`legacy link` in default `bridge` network and the new `link` functionality in user defined
|
||||
networks. The `legacy link` is static in nature and it hard-binds the container with the
|
||||
alias and it doesnt tolerate linked container restarts. While the new `link` functionality
|
||||
in user defined networks are dynamic in nature and supports linked container restarts
|
||||
including tolerating ip-address changes on the linked container.
|
||||
|
||||
Now let us launch another container named `container5` linking container4 to c4.
|
||||
|
||||
```bash
|
||||
$ docker run --net=isolated_nw -itd --name=container5 --link container4:c4 busybox
|
||||
72eccf2208336f31e9e33ba327734125af00d1e1d2657878e2ee8154fbb23c7a
|
||||
```
|
||||
|
||||
As expected, container4 will be able to reach container5 by both its container name and
|
||||
its alias c5 and container5 will be able to reach container4 by its container name and
|
||||
its alias c4.
|
||||
|
||||
```bash
|
||||
$ docker attach container4
|
||||
/ # ping -w 4 c5
|
||||
PING c5 (172.25.0.5): 56 data bytes
|
||||
64 bytes from 172.25.0.5: seq=0 ttl=64 time=0.070 ms
|
||||
64 bytes from 172.25.0.5: seq=1 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.25.0.5: seq=2 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.25.0.5: seq=3 ttl=64 time=0.097 ms
|
||||
|
||||
--- c5 ping statistics ---
|
||||
4 packets transmitted, 4 packets received, 0% packet loss
|
||||
round-trip min/avg/max = 0.070/0.081/0.097 ms
|
||||
|
||||
/ # ping -w 4 container5
|
||||
PING container5 (172.25.0.5): 56 data bytes
|
||||
64 bytes from 172.25.0.5: seq=0 ttl=64 time=0.070 ms
|
||||
64 bytes from 172.25.0.5: seq=1 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.25.0.5: seq=2 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.25.0.5: seq=3 ttl=64 time=0.097 ms
|
||||
|
||||
--- container5 ping statistics ---
|
||||
4 packets transmitted, 4 packets received, 0% packet loss
|
||||
round-trip min/avg/max = 0.070/0.081/0.097 ms
|
||||
```
|
||||
|
||||
```bash
|
||||
$ docker attach container5
|
||||
/ # ping -w 4 c4
|
||||
PING c4 (172.25.0.4): 56 data bytes
|
||||
64 bytes from 172.25.0.4: seq=0 ttl=64 time=0.065 ms
|
||||
64 bytes from 172.25.0.4: seq=1 ttl=64 time=0.070 ms
|
||||
64 bytes from 172.25.0.4: seq=2 ttl=64 time=0.067 ms
|
||||
64 bytes from 172.25.0.4: seq=3 ttl=64 time=0.082 ms
|
||||
|
||||
--- c4 ping statistics ---
|
||||
4 packets transmitted, 4 packets received, 0% packet loss
|
||||
round-trip min/avg/max = 0.065/0.070/0.082 ms
|
||||
|
||||
/ # ping -w 4 container4
|
||||
PING container4 (172.25.0.4): 56 data bytes
|
||||
64 bytes from 172.25.0.4: seq=0 ttl=64 time=0.065 ms
|
||||
64 bytes from 172.25.0.4: seq=1 ttl=64 time=0.070 ms
|
||||
64 bytes from 172.25.0.4: seq=2 ttl=64 time=0.067 ms
|
||||
64 bytes from 172.25.0.4: seq=3 ttl=64 time=0.082 ms
|
||||
|
||||
--- container4 ping statistics ---
|
||||
4 packets transmitted, 4 packets received, 0% packet loss
|
||||
round-trip min/avg/max = 0.065/0.070/0.082 ms
|
||||
```
|
||||
|
||||
Similar to the legacy link functionality the new link alias is localized to a container
|
||||
and the aliased name has no meaning outside of the container using the `--link`.
|
||||
|
||||
Also, it is important to note that if a container belongs to multiple networks, the
|
||||
linked alias is scoped within a given network. Hence the containers can be linked to
|
||||
different aliases in different networks.
|
||||
|
||||
Extending the example, let us create another network named `local_alias`
|
||||
|
||||
```bash
|
||||
$ docker network create -d bridge --subnet 172.26.0.0/24 local_alias
|
||||
76b7dc932e037589e6553f59f76008e5b76fa069638cd39776b890607f567aaa
|
||||
```
|
||||
|
||||
let us connect container4 and container5 to the new network `local_alias`
|
||||
|
||||
```
|
||||
$ docker network connect --link container5:foo local_alias container4
|
||||
$ docker network connect --link container4:bar local_alias container5
|
||||
```
|
||||
|
||||
```bash
|
||||
$ docker attach container4
|
||||
|
||||
/ # ping -w 4 foo
|
||||
PING foo (172.26.0.3): 56 data bytes
|
||||
64 bytes from 172.26.0.3: seq=0 ttl=64 time=0.070 ms
|
||||
64 bytes from 172.26.0.3: seq=1 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.26.0.3: seq=2 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.26.0.3: seq=3 ttl=64 time=0.097 ms
|
||||
|
||||
--- foo ping statistics ---
|
||||
4 packets transmitted, 4 packets received, 0% packet loss
|
||||
round-trip min/avg/max = 0.070/0.081/0.097 ms
|
||||
|
||||
/ # ping -w 4 c5
|
||||
PING c5 (172.25.0.5): 56 data bytes
|
||||
64 bytes from 172.25.0.5: seq=0 ttl=64 time=0.070 ms
|
||||
64 bytes from 172.25.0.5: seq=1 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.25.0.5: seq=2 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.25.0.5: seq=3 ttl=64 time=0.097 ms
|
||||
|
||||
--- c5 ping statistics ---
|
||||
4 packets transmitted, 4 packets received, 0% packet loss
|
||||
round-trip min/avg/max = 0.070/0.081/0.097 ms
|
||||
```
|
||||
|
||||
Note that the ping succeeds for both the aliases but on different networks.
|
||||
Let us conclude this section by disconnecting container5 from the `isolated_nw`
|
||||
and observe the results
|
||||
|
||||
```
|
||||
$ docker network disconnect isolated_nw container5
|
||||
|
||||
$ docker attach container4
|
||||
|
||||
/ # ping -w 4 c5
|
||||
ping: bad address 'c5'
|
||||
|
||||
/ # ping -w 4 foo
|
||||
PING foo (172.26.0.3): 56 data bytes
|
||||
64 bytes from 172.26.0.3: seq=0 ttl=64 time=0.070 ms
|
||||
64 bytes from 172.26.0.3: seq=1 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.26.0.3: seq=2 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.26.0.3: seq=3 ttl=64 time=0.097 ms
|
||||
|
||||
--- foo ping statistics ---
|
||||
4 packets transmitted, 4 packets received, 0% packet loss
|
||||
round-trip min/avg/max = 0.070/0.081/0.097 ms
|
||||
|
||||
```
|
||||
|
||||
In conclusion, the new link functionality in user defined networks provides all the
|
||||
benefits of legacy links while avoiding most of the well-known issues with `legacy links`.
|
||||
|
||||
One notable missing functionality compared to `legacy links` is the injection of
|
||||
environment variables. Though very useful, environment variable injection is static
|
||||
in nature and must be injected when the container is started. One cannot inject
|
||||
environment variables into a running container without significant effort and hence
|
||||
it is not compatible with `docker network` which provides a dynamic way to connect/
|
||||
disconnect containers to/from a network.
|
||||
|
||||
### Network-scoped alias
|
||||
|
||||
While `links` provide private name resolution that is localized within a container,
|
||||
the network-scoped alias provides a way for a container to be discovered by an
|
||||
alternate name by any other container within the scope of a particular network.
|
||||
Unlike the `link` alias, which is defined by the consumer of a service, the
|
||||
network-scoped alias is defined by the container that is offering the service
|
||||
to the network.
|
||||
|
||||
Continuing with the above example, create another container in `isolated_nw` with a
|
||||
network alias.
|
||||
|
||||
```bash
|
||||
$ docker run --net=isolated_nw -itd --name=container6 --net-alias app busybox
|
||||
8ebe6767c1e0361f27433090060b33200aac054a68476c3be87ef4005eb1df17
|
||||
```
|
||||
|
||||
```bash
|
||||
$ docker attach container4
|
||||
/ # ping -w 4 app
|
||||
PING app (172.25.0.6): 56 data bytes
|
||||
64 bytes from 172.25.0.6: seq=0 ttl=64 time=0.070 ms
|
||||
64 bytes from 172.25.0.6: seq=1 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.25.0.6: seq=2 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.25.0.6: seq=3 ttl=64 time=0.097 ms
|
||||
|
||||
--- app ping statistics ---
|
||||
4 packets transmitted, 4 packets received, 0% packet loss
|
||||
round-trip min/avg/max = 0.070/0.081/0.097 ms
|
||||
|
||||
/ # ping -w 4 container6
|
||||
PING container5 (172.25.0.6): 56 data bytes
|
||||
64 bytes from 172.25.0.6: seq=0 ttl=64 time=0.070 ms
|
||||
64 bytes from 172.25.0.6: seq=1 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.25.0.6: seq=2 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.25.0.6: seq=3 ttl=64 time=0.097 ms
|
||||
|
||||
--- container6 ping statistics ---
|
||||
4 packets transmitted, 4 packets received, 0% packet loss
|
||||
round-trip min/avg/max = 0.070/0.081/0.097 ms
|
||||
```
|
||||
|
||||
Now let us connect `container6` to the `local_alias` network with a different network-scoped
|
||||
alias.
|
||||
|
||||
```
|
||||
$ docker network connect --alias scoped-app local_alias container6
|
||||
```
|
||||
|
||||
`container6` in this example now is aliased as `app` in network `isolated_nw` and
|
||||
as `scoped-app` in network `local_alias`.
|
||||
|
||||
Let's try to reach these aliases from `container4` (which is connected to both these networks)
|
||||
and `container5` (which is connected only to `isolated_nw`).
|
||||
|
||||
```bash
|
||||
$ docker attach container4
|
||||
|
||||
/ # ping -w 4 scoped-app
|
||||
PING foo (172.26.0.5): 56 data bytes
|
||||
64 bytes from 172.26.0.5: seq=0 ttl=64 time=0.070 ms
|
||||
64 bytes from 172.26.0.5: seq=1 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.26.0.5: seq=2 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.26.0.5: seq=3 ttl=64 time=0.097 ms
|
||||
|
||||
--- foo ping statistics ---
|
||||
4 packets transmitted, 4 packets received, 0% packet loss
|
||||
round-trip min/avg/max = 0.070/0.081/0.097 ms
|
||||
|
||||
$ docker attach container5
|
||||
|
||||
/ # ping -w 4 scoped-app
|
||||
ping: bad address 'scoped-app'
|
||||
|
||||
```
|
||||
|
||||
As you can see, the alias is scoped to the network it is defined on and hence only
|
||||
those containers that are connected to that network can access the alias.
|
||||
|
||||
In addition to the above features, multiple containers can share the same network-scoped
|
||||
alias within the same network. For example, let's launch `container7` in `isolated_nw` with
|
||||
the same alias as `container6`
|
||||
|
||||
```bash
|
||||
$ docker run --net=isolated_nw -itd --name=container7 --net-alias app busybox
|
||||
3138c678c123b8799f4c7cc6a0cecc595acbdfa8bf81f621834103cd4f504554
|
||||
```
|
||||
|
||||
When multiple containers share the same alias, name resolution to that alias will happen
|
||||
to one of the containers (typically the first container that is aliased). When the container
|
||||
that backs the alias goes down or disconnected from the network, the next container that
|
||||
backs the alias will be resolved.
|
||||
|
||||
Let us ping the alias `app` from `container4` and bring down `container6` to verify that
|
||||
`container7` is resolving the `app` alias.
|
||||
|
||||
```bash
|
||||
$ docker attach container4
|
||||
/ # ping -w 4 app
|
||||
PING app (172.25.0.6): 56 data bytes
|
||||
64 bytes from 172.25.0.6: seq=0 ttl=64 time=0.070 ms
|
||||
64 bytes from 172.25.0.6: seq=1 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.25.0.6: seq=2 ttl=64 time=0.080 ms
|
||||
64 bytes from 172.25.0.6: seq=3 ttl=64 time=0.097 ms
|
||||
|
||||
--- app ping statistics ---
|
||||
4 packets transmitted, 4 packets received, 0% packet loss
|
||||
round-trip min/avg/max = 0.070/0.081/0.097 ms
|
||||
|
||||
$ docker stop container6
|
||||
|
||||
$ docker attach container4
|
||||
/ # ping -w 4 app
|
||||
PING app (172.25.0.7): 56 data bytes
|
||||
64 bytes from 172.25.0.7: seq=0 ttl=64 time=0.095 ms
|
||||
64 bytes from 172.25.0.7: seq=1 ttl=64 time=0.075 ms
|
||||
64 bytes from 172.25.0.7: seq=2 ttl=64 time=0.072 ms
|
||||
64 bytes from 172.25.0.7: seq=3 ttl=64 time=0.101 ms
|
||||
|
||||
--- app ping statistics ---
|
||||
4 packets transmitted, 4 packets received, 0% packet loss
|
||||
round-trip min/avg/max = 0.072/0.085/0.101 ms
|
||||
|
||||
```
|
||||
|
||||
## Disconnecting containers
|
||||
|
||||
You can disconnect a container from a network using the `docker network
|
||||
disconnect` command.
|
||||
|
||||
```
|
||||
$ docker network disconnect isolated_nw container2
|
||||
|
||||
docker inspect --format='{{json .NetworkSettings.Networks}}' container2 | python -m json.tool
|
||||
{
|
||||
"bridge": {
|
||||
"NetworkID":"7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812",
|
||||
"EndpointID": "9e4575f7f61c0f9d69317b7a4b92eefc133347836dd83ef65deffa16b9985dc0",
|
||||
"Gateway": "172.17.0.1",
|
||||
"GlobalIPv6Address": "",
|
||||
"GlobalIPv6PrefixLen": 0,
|
||||
"IPAddress": "172.17.0.3",
|
||||
"IPPrefixLen": 16,
|
||||
"IPv6Gateway": "",
|
||||
"MacAddress": "02:42:ac:11:00:03"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$ docker network inspect isolated_nw
|
||||
[
|
||||
{
|
||||
"Name": "isolated_nw",
|
||||
"Id": "06a62f1c73c4e3107c0f555b7a5f163309827bfbbf999840166065a8f35455a8",
|
||||
"Scope": "local",
|
||||
"Driver": "bridge",
|
||||
"IPAM": {
|
||||
"Driver": "default",
|
||||
"Config": [
|
||||
{
|
||||
"Subnet": "172.21.0.0/16",
|
||||
"Gateway": "172.21.0.1/16"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Containers": {
|
||||
"467a7863c3f0277ef8e661b38427737f28099b61fa55622d6c30fb288d88c551": {
|
||||
"Name": "container3",
|
||||
"EndpointID": "dffc7ec2915af58cc827d995e6ebdc897342be0420123277103c40ae35579103",
|
||||
"MacAddress": "02:42:ac:19:03:03",
|
||||
"IPv4Address": "172.25.3.3/16",
|
||||
"IPv6Address": ""
|
||||
}
|
||||
},
|
||||
"Options": {}
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
Once a container is disconnected from a network, it cannot communicate with
|
||||
other containers connected to that network. In this example, `container2` can no longer talk to `container3` on the `isolated_nw` network.
|
||||
|
||||
```
|
||||
$ docker attach container2
|
||||
|
||||
/ # ifconfig
|
||||
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03
|
||||
inet addr:172.17.0.3 Bcast:0.0.0.0 Mask:255.255.0.0
|
||||
inet6 addr: fe80::42:acff:fe11:3/64 Scope:Link
|
||||
UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
|
||||
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
|
||||
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
|
||||
collisions:0 txqueuelen:0
|
||||
RX bytes:648 (648.0 B) TX bytes:648 (648.0 B)
|
||||
|
||||
lo Link encap:Local Loopback
|
||||
inet addr:127.0.0.1 Mask:255.0.0.0
|
||||
inet6 addr: ::1/128 Scope:Host
|
||||
UP LOOPBACK RUNNING MTU:65536 Metric:1
|
||||
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
|
||||
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
|
||||
collisions:0 txqueuelen:0
|
||||
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
|
||||
|
||||
/ # ping container3
|
||||
PING container3 (172.25.3.3): 56 data bytes
|
||||
^C
|
||||
--- container3 ping statistics ---
|
||||
2 packets transmitted, 0 packets received, 100% packet loss
|
||||
```
|
||||
|
||||
The `container2` still has full connectivity to the bridge network
|
||||
|
||||
```bash
|
||||
/ # ping container1
|
||||
PING container1 (172.17.0.2): 56 data bytes
|
||||
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.119 ms
|
||||
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.174 ms
|
||||
^C
|
||||
--- container1 ping statistics ---
|
||||
2 packets transmitted, 2 packets received, 0% packet loss
|
||||
round-trip min/avg/max = 0.119/0.146/0.174 ms
|
||||
/ #
|
||||
```
|
||||
|
||||
There are certain scenarios such as ungraceful docker daemon restarts in multi-host network,
|
||||
where the daemon is unable to cleanup stale connectivity endpoints. Such stale endpoints
|
||||
may cause an error `container already connected to network` when a new container is
|
||||
connected to that network with the same name as the stale endpoint. In order to cleanup
|
||||
these stale endpoints, first remove the container and force disconnect
|
||||
(`docker network disconnect -f`) the endpoint from the network. Once the endpoint is
|
||||
cleaned up, the container can be connected to the network.
|
||||
|
||||
```
|
||||
$ docker run -d --name redis_db --net multihost redis
|
||||
ERROR: Cannot start container bc0b19c089978f7845633027aa3435624ca3d12dd4f4f764b61eac4c0610f32e: container already connected to network multihost
|
||||
|
||||
$ docker rm -f redis_db
|
||||
$ docker network disconnect -f multihost redis_db
|
||||
|
||||
$ docker run -d --name redis_db --net multihost redis
|
||||
7d986da974aeea5e9f7aca7e510bdb216d58682faa83a9040c2f2adc0544795a
|
||||
```
|
||||
|
||||
## Remove a network
|
||||
|
||||
When all the containers in a network are stopped or disconnected, you can remove a network.
|
||||
|
||||
```bash
|
||||
$ docker network disconnect isolated_nw container3
|
||||
```
|
||||
|
||||
```bash
|
||||
docker network inspect isolated_nw
|
||||
[
|
||||
{
|
||||
"Name": "isolated_nw",
|
||||
"Id": "06a62f1c73c4e3107c0f555b7a5f163309827bfbbf999840166065a8f35455a8",
|
||||
"Scope": "local",
|
||||
"Driver": "bridge",
|
||||
"IPAM": {
|
||||
"Driver": "default",
|
||||
"Config": [
|
||||
{
|
||||
"Subnet": "172.21.0.0/16",
|
||||
"Gateway": "172.21.0.1/16"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Containers": {},
|
||||
"Options": {}
|
||||
}
|
||||
]
|
||||
|
||||
$ docker network rm isolated_nw
|
||||
```
|
||||
|
||||
List all your networks to verify the `isolated_nw` was removed:
|
||||
|
||||
```
|
||||
$ docker network ls
|
||||
NETWORK ID NAME DRIVER
|
||||
72314fa53006 host host
|
||||
f7ab26d71dbd bridge bridge
|
||||
0f32e83e61ac none null
|
||||
```
|
||||
|
||||
## Related information
|
||||
|
||||
* [network create](../../reference/commandline/network_create.md)
|
||||
* [network inspect](../../reference/commandline/network_inspect.md)
|
||||
* [network connect](../../reference/commandline/network_connect.md)
|
||||
* [network disconnect](../../reference/commandline/network_disconnect.md)
|
||||
* [network ls](../../reference/commandline/network_ls.md)
|
||||
* [network rm](../../reference/commandline/network_rm.md)
|
||||