-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request moby#3051 from pariviere/2490-docs-network
Network documentation page
- Loading branch information
Showing
2 changed files
with
148 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,147 @@ | ||
:title: Docker networking | ||
:description: Docker networking | ||
:keywords: network, networking, bridge, docker, documentation | ||
|
||
|
||
Networking | ||
========== | ||
|
||
Docker uses Linux bridge capabilities to provide network connectivity | ||
to containers. The ``docker0`` bridge interface is managed by Docker itself | ||
for this purpose. Thus, when the Docker daemon starts it : | ||
|
||
- creates the ``docker0`` bridge if not present | ||
- searches for an IP address range which doesn't overlap with an existing route | ||
- picks an IP in the selected range | ||
- assigns this IP to the ``docker0`` bridge | ||
|
||
|
||
.. code-block:: bash | ||
# List host bridges | ||
$ sudo brctl show | ||
bridge name bridge id STP enabled interfaces | ||
docker0 8000.000000000000 no | ||
# Show docker0 IP address | ||
$ sudo ifconfig docker0 | ||
docker0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx | ||
inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0 | ||
At runtime, a :ref:`specific kind of virtual interface<vethxxxx-device>` is | ||
given to each containers which is then bonded to the ``docker0`` bridge. | ||
Each containers also receives a dedicated IP address from the same range | ||
as ``docker0``. The ``docker0`` IP address is then used as the default | ||
gateway for the containers. | ||
|
||
.. code-block:: bash | ||
# Run a container | ||
$ sudo docker run -t -i -d base /bin/bash | ||
52f811c5d3d69edddefc75aff5a4525fc8ba8bcfa1818132f9dc7d4f7c7e78b4 | ||
$ sudo brctl show | ||
bridge name bridge id STP enabled interfaces | ||
docker0 8000.fef213db5a66 no vethQCDY1N | ||
Above, ``docker0`` acts as a bridge for the ``vethQCDY1N`` interface which is dedicated | ||
to the 52f811c5d3d6 container. | ||
|
||
|
||
How to use a specific IP address range | ||
--------------------------------------- | ||
Docker will try hard to find an IP range which is not used by the host. | ||
Even if it works for most cases, it's not bullet-proof and sometimes you need | ||
to have more control over the IP addressing scheme. | ||
|
||
For this purpose, Docker allows you to manage the ``docker0`` bridge or | ||
your own one using the ``-b=<bridgename>`` parameter. | ||
|
||
In this scenario: | ||
|
||
- ensure Docker is stopped | ||
- create your own bridge (``bridge0`` for example) | ||
- assign a specific IP to this bridge | ||
- start Docker with the ``-b=bridge0`` parameter | ||
|
||
|
||
.. code-block:: bash | ||
# Stop Docker | ||
$ sudo service docker stop | ||
# Clean docker0 bridge and | ||
# add your very own bridge0 | ||
$ sudo ifconfig docker0 down | ||
$ sudo brctl addbr bridge0 | ||
$ sudo ifconfig bridge0 192.168.227.1 netmask 255.255.255.0 | ||
# Edit your Docker startup file | ||
$ echo "DOCKER_OPTS=\"-b=bridge0\"" /etc/default/docker | ||
# Start Docker | ||
$ sudo service docker start | ||
# Ensure bridge0 IP is not changed by Docker | ||
$ sudo ifconfig bridge0 | ||
bridge0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx | ||
inet addr:192.168.227.1 Bcast:192.168.227.255 Mask:255.255.255.0 | ||
# Run a container | ||
$ docker run -i -t base /bin/bash | ||
# Container IP in the 192.168.227/24 range | ||
root@261c272cd7d5:/# ifconfig eth0 | ||
eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx | ||
inet addr:192.168.227.5 Bcast:192.168.227.255 Mask:255.255.255.0 | ||
# bridge0 IP as the default gateway | ||
root@261c272cd7d5:/# route -n | ||
Kernel IP routing table | ||
Destination Gateway Genmask Flags Metric Ref Use Iface | ||
0.0.0.0 192.168.227.1 0.0.0.0 UG 0 0 0 eth0 | ||
192.168.227.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 | ||
# hits CTRL+P then CTRL+Q to detach | ||
# Display bridge info | ||
$ sudo brctl show | ||
bridge name bridge id STP enabled interfaces | ||
bridge0 8000.fe7c2e0faebd no vethAQI2QT | ||
Container intercommunication | ||
------------------------------- | ||
Containers can communicate with each other according to the ``icc`` parameter | ||
value of the Docker daemon. | ||
|
||
- The default, ``-icc=true`` allows containers to communicate with each other. | ||
- ``-icc=false`` means containers are isolated from each other. | ||
|
||
Under the hood, ``iptables`` is used by Docker to either accept or drop communication | ||
between containers. | ||
|
||
|
||
.. _vethxxxx-device: | ||
|
||
What's about the vethXXXX device? | ||
----------------------------------- | ||
Well. Things get complicated here. | ||
|
||
The ``vethXXXX`` interface is the host side of a point-to-point link between the | ||
host and the corresponding container, the other side of the link being | ||
materialized by the container's ``eth0`` interface. This pair (host ``vethXXX`` and | ||
container ``eth0``) are connected like a tube. Everything that comes in one side will | ||
come out the other side. | ||
|
||
All the plumbing is delegated to Linux network capabilities (check the ip link | ||
command) and the namespaces infrastructure. | ||
|
||
|
||
I want more | ||
------------ | ||
Jérôme Petazzoni has create ``pipework`` to connect together containers in | ||
arbitrarily complex scenarios : https://github.com/jpetazzo/pipework |