github.com/slene/docker@v1.8.0-rc1/docs/articles/networking.md (about) 1 <!--[metadata]> 2 +++ 3 title = "Network configuration" 4 description = "Docker networking" 5 keywords = ["network, networking, bridge, docker, documentation"] 6 [menu.main] 7 parent= "smn_administrate" 8 +++ 9 <![end-metadata]--> 10 11 # Network configuration 12 13 ## Summary 14 15 When Docker starts, it creates a virtual interface named `docker0` on 16 the host machine. It randomly chooses an address and subnet from the 17 private range defined by [RFC 1918](http://tools.ietf.org/html/rfc1918) 18 that are not in use on the host machine, and assigns it to `docker0`. 19 Docker made the choice `172.17.42.1/16` when I started it a few minutes 20 ago, for example — a 16-bit netmask providing 65,534 addresses for the 21 host machine and its containers. The MAC address is generated using the 22 IP address allocated to the container to avoid ARP collisions, using a 23 range from `02:42:ac:11:00:00` to `02:42:ac:11:ff:ff`. 24 25 > **Note:** 26 > This document discusses advanced networking configuration 27 > and options for Docker. In most cases you won't need this information. 28 > If you're looking to get started with a simpler explanation of Docker 29 > networking and an introduction to the concept of container linking see 30 > the [Docker User Guide](/userguide/dockerlinks/). 31 32 But `docker0` is no ordinary interface. It is a virtual *Ethernet 33 bridge* that automatically forwards packets between any other network 34 interfaces that are attached to it. This lets containers communicate 35 both with the host machine and with each other. Every time Docker 36 creates a container, it creates a pair of “peer” interfaces that are 37 like opposite ends of a pipe — a packet sent on one will be received on 38 the other. It gives one of the peers to the container to become its 39 `eth0` interface and keeps the other peer, with a unique name like 40 `vethAQI2QT`, out in the namespace of the host machine. By binding 41 every `veth*` interface to the `docker0` bridge, Docker creates a 42 virtual subnet shared between the host machine and every Docker 43 container. 44 45 The remaining sections of this document explain all of the ways that you 46 can use Docker options and — in advanced cases — raw Linux networking 47 commands to tweak, supplement, or entirely replace Docker's default 48 networking configuration. 49 50 ## Quick guide to the options 51 52 Here is a quick list of the networking-related Docker command-line 53 options, in case it helps you find the section below that you are 54 looking for. 55 56 Some networking command-line options can only be supplied to the Docker 57 server when it starts up, and cannot be changed once it is running: 58 59 * `-b BRIDGE` or `--bridge=BRIDGE` — see 60 [Building your own bridge](#bridge-building) 61 62 * `--bip=CIDR` — see 63 [Customizing docker0](#docker0) 64 65 * `--default-gateway=IP_ADDRESS` — see 66 [How Docker networks a container](#container-networking) 67 68 * `--default-gateway-v6=IP_ADDRESS` — see 69 [IPv6](#ipv6) 70 71 * `--fixed-cidr` — see 72 [Customizing docker0](#docker0) 73 74 * `--fixed-cidr-v6` — see 75 [IPv6](#ipv6) 76 77 * `-H SOCKET...` or `--host=SOCKET...` — 78 This might sound like it would affect container networking, 79 but it actually faces in the other direction: 80 it tells the Docker server over what channels 81 it should be willing to receive commands 82 like “run container” and “stop container.” 83 84 * `--icc=true|false` — see 85 [Communication between containers](#between-containers) 86 87 * `--ip=IP_ADDRESS` — see 88 [Binding container ports](#binding-ports) 89 90 * `--ipv6=true|false` — see 91 [IPv6](#ipv6) 92 93 * `--ip-forward=true|false` — see 94 [Communication between containers and the wider world](#the-world) 95 96 * `--iptables=true|false` — see 97 [Communication between containers](#between-containers) 98 99 * `--mtu=BYTES` — see 100 [Customizing docker0](#docker0) 101 102 * `--userland-proxy=true|false` — see 103 [Binding container ports](#binding-ports) 104 105 There are two networking options that can be supplied either at startup 106 or when `docker run` is invoked. When provided at startup, set the 107 default value that `docker run` will later use if the options are not 108 specified: 109 110 * `--dns=IP_ADDRESS...` — see 111 [Configuring DNS](#dns) 112 113 * `--dns-search=DOMAIN...` — see 114 [Configuring DNS](#dns) 115 116 Finally, several networking options can only be provided when calling 117 `docker run` because they specify something specific to one container: 118 119 * `-h HOSTNAME` or `--hostname=HOSTNAME` — see 120 [Configuring DNS](#dns) and 121 [How Docker networks a container](#container-networking) 122 123 * `--link=CONTAINER_NAME_or_ID:ALIAS` — see 124 [Configuring DNS](#dns) and 125 [Communication between containers](#between-containers) 126 127 * `--net=bridge|none|container:NAME_or_ID|host` — see 128 [How Docker networks a container](#container-networking) 129 130 * `--mac-address=MACADDRESS...` — see 131 [How Docker networks a container](#container-networking) 132 133 * `-p SPEC` or `--publish=SPEC` — see 134 [Binding container ports](#binding-ports) 135 136 * `-P` or `--publish-all=true|false` — see 137 [Binding container ports](#binding-ports) 138 139 To supply networking options to the Docker server at startup, use the 140 `DOCKER_OPTS` variable in the Docker upstart configuration file. For Ubuntu, edit the 141 variable in `/etc/default/docker` or `/etc/sysconfig/docker` for CentOS. 142 143 The following example illustrates how to configure Docker on Ubuntu to recognize a 144 newly built bridge. 145 146 Edit the `/etc/default/docker` file: 147 148 $ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker 149 150 Then restart the Docker server. 151 152 $ sudo service docker start 153 154 For additional information on bridges, see [building your own 155 bridge](#building-your-own-bridge) later on this page. 156 157 The following sections tackle all of the above topics in an order that we can move roughly from simplest to most complex. 158 159 ## Configuring DNS 160 161 <a name="dns"></a> 162 163 How can Docker supply each container with a hostname and DNS 164 configuration, without having to build a custom image with the hostname 165 written inside? Its trick is to overlay three crucial `/etc` files 166 inside the container with virtual files where it can write fresh 167 information. You can see this by running `mount` inside a container: 168 169 $$ mount 170 ... 171 /dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ... 172 /dev/disk/by-uuid/1fec...ebdf on /etc/hosts type ext4 ... 173 /dev/disk/by-uuid/1fec...ebdf on /etc/resolv.conf type ext4 ... 174 ... 175 176 This arrangement allows Docker to do clever things like keep 177 `resolv.conf` up to date across all containers when the host machine 178 receives new configuration over DHCP later. The exact details of how 179 Docker maintains these files inside the container can change from one 180 Docker version to the next, so you should leave the files themselves 181 alone and use the following Docker options instead. 182 183 Four different options affect container domain name services. 184 185 * `-h HOSTNAME` or `--hostname=HOSTNAME` — sets the hostname by which 186 the container knows itself. This is written into `/etc/hostname`, 187 into `/etc/hosts` as the name of the container's host-facing IP 188 address, and is the name that `/bin/bash` inside the container will 189 display inside its prompt. But the hostname is not easy to see from 190 outside the container. It will not appear in `docker ps` nor in the 191 `/etc/hosts` file of any other container. 192 193 * `--link=CONTAINER_NAME_or_ID:ALIAS` — using this option as you `run` a 194 container gives the new container's `/etc/hosts` an extra entry 195 named `ALIAS` that points to the IP address of the container identified by 196 `CONTAINER_NAME_or_ID`. This lets processes inside the new container 197 connect to the hostname `ALIAS` without having to know its IP. The 198 `--link=` option is discussed in more detail below, in the section 199 [Communication between containers](#between-containers). Because 200 Docker may assign a different IP address to the linked containers 201 on restart, Docker updates the `ALIAS` entry in the `/etc/hosts` file 202 of the recipient containers. 203 204 * `--dns=IP_ADDRESS...` — sets the IP addresses added as `server` 205 lines to the container's `/etc/resolv.conf` file. Processes in the 206 container, when confronted with a hostname not in `/etc/hosts`, will 207 connect to these IP addresses on port 53 looking for name resolution 208 services. 209 210 * `--dns-search=DOMAIN...` — sets the domain names that are searched 211 when a bare unqualified hostname is used inside of the container, by 212 writing `search` lines into the container's `/etc/resolv.conf`. 213 When a container process attempts to access `host` and the search 214 domain `example.com` is set, for instance, the DNS logic will not 215 only look up `host` but also `host.example.com`. 216 Use `--dns-search=.` if you don't wish to set the search domain. 217 218 Regarding DNS settings, in the absence of either the `--dns=IP_ADDRESS...` 219 or the `--dns-search=DOMAIN...` option, Docker makes each container's 220 `/etc/resolv.conf` look like the `/etc/resolv.conf` of the host machine (where 221 the `docker` daemon runs). When creating the container's `/etc/resolv.conf`, 222 the daemon filters out all localhost IP address `nameserver` entries from 223 the host's original file. 224 225 Filtering is necessary because all localhost addresses on the host are 226 unreachable from the container's network. After this filtering, if there 227 are no more `nameserver` entries left in the container's `/etc/resolv.conf` 228 file, the daemon adds public Google DNS nameservers 229 (8.8.8.8 and 8.8.4.4) to the container's DNS configuration. If IPv6 is 230 enabled on the daemon, the public IPv6 Google DNS nameservers will also 231 be added (2001:4860:4860::8888 and 2001:4860:4860::8844). 232 233 > **Note**: 234 > If you need access to a host's localhost resolver, you must modify your 235 > DNS service on the host to listen on a non-localhost address that is 236 > reachable from within the container. 237 238 You might wonder what happens when the host machine's 239 `/etc/resolv.conf` file changes. The `docker` daemon has a file change 240 notifier active which will watch for changes to the host DNS configuration. 241 242 > **Note**: 243 > The file change notifier relies on the Linux kernel's inotify feature. 244 > Because this feature is currently incompatible with the overlay filesystem 245 > driver, a Docker daemon using "overlay" will not be able to take advantage 246 > of the `/etc/resolv.conf` auto-update feature. 247 248 When the host file changes, all stopped containers which have a matching 249 `resolv.conf` to the host will be updated immediately to this newest host 250 configuration. Containers which are running when the host configuration 251 changes will need to stop and start to pick up the host changes due to lack 252 of a facility to ensure atomic writes of the `resolv.conf` file while the 253 container is running. If the container's `resolv.conf` has been edited since 254 it was started with the default configuration, no replacement will be 255 attempted as it would overwrite the changes performed by the container. 256 If the options (`--dns` or `--dns-search`) have been used to modify the 257 default host configuration, then the replacement with an updated host's 258 `/etc/resolv.conf` will not happen as well. 259 260 > **Note**: 261 > For containers which were created prior to the implementation of 262 > the `/etc/resolv.conf` update feature in Docker 1.5.0: those 263 > containers will **not** receive updates when the host `resolv.conf` 264 > file changes. Only containers created with Docker 1.5.0 and above 265 > will utilize this auto-update feature. 266 267 ## Communication between containers and the wider world 268 269 <a name="the-world"></a> 270 271 Whether a container can talk to the world is governed by two factors. 272 273 1. Is the host machine willing to forward IP packets? This is governed 274 by the `ip_forward` system parameter. Packets can only pass between 275 containers if this parameter is `1`. Usually you will simply leave 276 the Docker server at its default setting `--ip-forward=true` and 277 Docker will go set `ip_forward` to `1` for you when the server 278 starts up. If you set `--ip-forward=false` and your system's kernel 279 has it enabled, the `--ip-forward=false` option has no effect. 280 To check the setting on your kernel or to turn it on manually: 281 282 $ sysctl net.ipv4.conf.all.forwarding 283 net.ipv4.conf.all.forwarding = 0 284 $ sysctl net.ipv4.conf.all.forwarding=1 285 $ sysctl net.ipv4.conf.all.forwarding 286 net.ipv4.conf.all.forwarding = 1 287 288 Many using Docker will want `ip_forward` to be on, to at 289 least make communication *possible* between containers and 290 the wider world. 291 292 May also be needed for inter-container communication if you are 293 in a multiple bridge setup. 294 295 2. Do your `iptables` allow this particular connection? Docker will 296 never make changes to your system `iptables` rules if you set 297 `--iptables=false` when the daemon starts. Otherwise the Docker 298 server will append forwarding rules to the `DOCKER` filter chain. 299 300 Docker will not delete or modify any pre-existing rules from the `DOCKER` 301 filter chain. This allows the user to create in advance any rules required 302 to further restrict access to the containers. 303 304 Docker's forward rules permit all external source IPs by default. To allow 305 only a specific IP or network to access the containers, insert a negated 306 rule at the top of the `DOCKER` filter chain. For example, to restrict 307 external access such that *only* source IP 8.8.8.8 can access the 308 containers, the following rule could be added: 309 310 $ iptables -I DOCKER -i ext_if ! -s 8.8.8.8 -j DROP 311 312 ## Communication between containers 313 314 <a name="between-containers"></a> 315 316 Whether two containers can communicate is governed, at the operating 317 system level, by two factors. 318 319 1. Does the network topology even connect the containers' network 320 interfaces? By default Docker will attach all containers to a 321 single `docker0` bridge, providing a path for packets to travel 322 between them. See the later sections of this document for other 323 possible topologies. 324 325 2. Do your `iptables` allow this particular connection? Docker will never 326 make changes to your system `iptables` rules if you set 327 `--iptables=false` when the daemon starts. Otherwise the Docker server 328 will add a default rule to the `FORWARD` chain with a blanket `ACCEPT` 329 policy if you retain the default `--icc=true`, or else will set the 330 policy to `DROP` if `--icc=false`. 331 332 It is a strategic question whether to leave `--icc=true` or change it to 333 `--icc=false` so that 334 `iptables` will protect other containers — and the main host — from 335 having arbitrary ports probed or accessed by a container that gets 336 compromised. 337 338 If you choose the most secure setting of `--icc=false`, then how can 339 containers communicate in those cases where you *want* them to provide 340 each other services? 341 342 The answer is the `--link=CONTAINER_NAME_or_ID:ALIAS` option, which was 343 mentioned in the previous section because of its effect upon name 344 services. If the Docker daemon is running with both `--icc=false` and 345 `--iptables=true` then, when it sees `docker run` invoked with the 346 `--link=` option, the Docker server will insert a pair of `iptables` 347 `ACCEPT` rules so that the new container can connect to the ports 348 exposed by the other container — the ports that it mentioned in the 349 `EXPOSE` lines of its `Dockerfile`. Docker has more documentation on 350 this subject — see the [linking Docker containers](/userguide/dockerlinks) 351 page for further details. 352 353 > **Note**: 354 > The value `CONTAINER_NAME` in `--link=` must either be an 355 > auto-assigned Docker name like `stupefied_pare` or else the name you 356 > assigned with `--name=` when you ran `docker run`. It cannot be a 357 > hostname, which Docker will not recognize in the context of the 358 > `--link=` option. 359 360 You can run the `iptables` command on your Docker host to see whether 361 the `FORWARD` chain has a default policy of `ACCEPT` or `DROP`: 362 363 # When --icc=false, you should see a DROP rule: 364 365 $ sudo iptables -L -n 366 ... 367 Chain FORWARD (policy ACCEPT) 368 target prot opt source destination 369 DOCKER all -- 0.0.0.0/0 0.0.0.0/0 370 DROP all -- 0.0.0.0/0 0.0.0.0/0 371 ... 372 373 # When a --link= has been created under --icc=false, 374 # you should see port-specific ACCEPT rules overriding 375 # the subsequent DROP policy for all other packets: 376 377 $ sudo iptables -L -n 378 ... 379 Chain FORWARD (policy ACCEPT) 380 target prot opt source destination 381 DOCKER all -- 0.0.0.0/0 0.0.0.0/0 382 DROP all -- 0.0.0.0/0 0.0.0.0/0 383 384 Chain DOCKER (1 references) 385 target prot opt source destination 386 ACCEPT tcp -- 172.17.0.2 172.17.0.3 tcp spt:80 387 ACCEPT tcp -- 172.17.0.3 172.17.0.2 tcp dpt:80 388 389 > **Note**: 390 > Docker is careful that its host-wide `iptables` rules fully expose 391 > containers to each other's raw IP addresses, so connections from one 392 > container to another should always appear to be originating from the 393 > first container's own IP address. 394 395 ## Binding container ports to the host 396 397 <a name="binding-ports"></a> 398 399 By default Docker containers can make connections to the outside world, 400 but the outside world cannot connect to containers. Each outgoing 401 connection will appear to originate from one of the host machine's own 402 IP addresses thanks to an `iptables` masquerading rule on the host 403 machine that the Docker server creates when it starts: 404 405 # You can see that the Docker server creates a 406 # masquerade rule that let containers connect 407 # to IP addresses in the outside world: 408 409 $ sudo iptables -t nat -L -n 410 ... 411 Chain POSTROUTING (policy ACCEPT) 412 target prot opt source destination 413 MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0 414 ... 415 416 But if you want containers to accept incoming connections, you will need 417 to provide special options when invoking `docker run`. These options 418 are covered in more detail in the [Docker User Guide](/userguide/dockerlinks) 419 page. There are two approaches. 420 421 First, you can supply `-P` or `--publish-all=true|false` to `docker run` which 422 is a blanket operation that identifies every port with an `EXPOSE` line in the 423 image's `Dockerfile` or `--expose <port>` commandline flag and maps it to a 424 host port somewhere within an *ephemeral port range*. The `docker port` command 425 then needs to be used to inspect created mapping. The *ephemeral port range* is 426 configured by `/proc/sys/net/ipv4/ip_local_port_range` kernel parameter, 427 typically ranging from 32768 to 61000. 428 429 Mapping can be specified explicitly using `-p SPEC` or `--publish=SPEC` option. 430 It allows you to particularize which port on docker server - which can be any 431 port at all, not just one within the *ephemeral port range* — you want mapped 432 to which port in the container. 433 434 Either way, you should be able to peek at what Docker has accomplished 435 in your network stack by examining your NAT tables. 436 437 # What your NAT rules might look like when Docker 438 # is finished setting up a -P forward: 439 440 $ iptables -t nat -L -n 441 ... 442 Chain DOCKER (2 references) 443 target prot opt source destination 444 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:172.17.0.2:80 445 446 # What your NAT rules might look like when Docker 447 # is finished setting up a -p 80:80 forward: 448 449 Chain DOCKER (2 references) 450 target prot opt source destination 451 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80 452 453 You can see that Docker has exposed these container ports on `0.0.0.0`, 454 the wildcard IP address that will match any possible incoming port on 455 the host machine. If you want to be more restrictive and only allow 456 container services to be contacted through a specific external interface 457 on the host machine, you have two choices. When you invoke `docker run` 458 you can use either `-p IP:host_port:container_port` or `-p IP::port` to 459 specify the external interface for one particular binding. 460 461 Or if you always want Docker port forwards to bind to one specific IP 462 address, you can edit your system-wide Docker server settings and add the 463 option `--ip=IP_ADDRESS`. Remember to restart your Docker server after 464 editing this setting. 465 466 > **Note**: 467 > With hairpin NAT enabled (`--userland-proxy=false`), containers port exposure 468 > is achieved purely through iptables rules, and no attempt to bind the exposed 469 > port is ever made. This means that nothing prevents shadowing a previously 470 > listening service outside of Docker through exposing the same port for a 471 > container. In such conflicting situation, Docker created iptables rules will 472 > take precedence and route to the container. 473 474 The `--userland-proxy` parameter, true by default, provides a userland 475 implementation for inter-container and outside-to-container communication. When 476 disabled, Docker uses both an additional `MASQUERADE` iptable rule and the 477 `net.ipv4.route_localnet` kernel parameter which allow the host machine to 478 connect to a local container exposed port through the commonly used loopback 479 address: this alternative is preferred for performance reason. 480 481 Again, this topic is covered without all of these low-level networking 482 details in the [Docker User Guide](/userguide/dockerlinks/) document if you 483 would like to use that as your port redirection reference instead. 484 485 ## IPv6 486 487 <a name="ipv6"></a> 488 489 As we are [running out of IPv4 addresses](http://en.wikipedia.org/wiki/IPv4_address_exhaustion) 490 the IETF has standardized an IPv4 successor, [Internet Protocol Version 6](http://en.wikipedia.org/wiki/IPv6) 491 , in [RFC 2460](https://www.ietf.org/rfc/rfc2460.txt). Both protocols, IPv4 and 492 IPv6, reside on layer 3 of the [OSI model](http://en.wikipedia.org/wiki/OSI_model). 493 494 495 ### IPv6 with Docker 496 By default, the Docker server configures the container network for IPv4 only. 497 You can enable IPv4/IPv6 dualstack support by running the Docker daemon with the 498 `--ipv6` flag. Docker will set up the bridge `docker0` with the IPv6 499 [link-local address](http://en.wikipedia.org/wiki/Link-local_address) `fe80::1`. 500 501 By default, containers that are created will only get a link-local IPv6 address. 502 To assign globally routable IPv6 addresses to your containers you have to 503 specify an IPv6 subnet to pick the addresses from. Set the IPv6 subnet via the 504 `--fixed-cidr-v6` parameter when starting Docker daemon: 505 506 docker daemon --ipv6 --fixed-cidr-v6="2001:db8:1::/64" 507 508 The subnet for Docker containers should at least have a size of `/80`. This way 509 an IPv6 address can end with the container's MAC address and you prevent NDP 510 neighbor cache invalidation issues in the Docker layer. 511 512 With the `--fixed-cidr-v6` parameter set Docker will add a new route to the 513 routing table. Further IPv6 routing will be enabled (you may prevent this by 514 starting Docker daemon with `--ip-forward=false`): 515 516 $ ip -6 route add 2001:db8:1::/64 dev docker0 517 $ sysctl net.ipv6.conf.default.forwarding=1 518 $ sysctl net.ipv6.conf.all.forwarding=1 519 520 All traffic to the subnet `2001:db8:1::/64` will now be routed 521 via the `docker0` interface. 522 523 Be aware that IPv6 forwarding may interfere with your existing IPv6 524 configuration: If you are using Router Advertisements to get IPv6 settings for 525 your host's interfaces you should set `accept_ra` to `2`. Otherwise IPv6 526 enabled forwarding will result in rejecting Router Advertisements. E.g., if you 527 want to configure `eth0` via Router Advertisements you should set: 528 529 $ sysctl net.ipv6.conf.eth0.accept_ra=2 530 531 ![](/article-img/ipv6_basic_host_config.svg) 532 533 Every new container will get an IPv6 address from the defined subnet. Further 534 a default route will be added on `eth0` in the container via the address 535 specified by the daemon option `--default-gateway-v6` if present, otherwise 536 via `fe80::1`: 537 538 docker run -it ubuntu bash -c "ip -6 addr show dev eth0; ip -6 route show" 539 540 15: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 541 inet6 2001:db8:1:0:0:242:ac11:3/64 scope global 542 valid_lft forever preferred_lft forever 543 inet6 fe80::42:acff:fe11:3/64 scope link 544 valid_lft forever preferred_lft forever 545 546 2001:db8:1::/64 dev eth0 proto kernel metric 256 547 fe80::/64 dev eth0 proto kernel metric 256 548 default via fe80::1 dev eth0 metric 1024 549 550 In this example the Docker container is assigned a link-local address with the 551 network suffix `/64` (here: `fe80::42:acff:fe11:3/64`) and a globally routable 552 IPv6 address (here: `2001:db8:1:0:0:242:ac11:3/64`). The container will create 553 connections to addresses outside of the `2001:db8:1::/64` network via the 554 link-local gateway at `fe80::1` on `eth0`. 555 556 Often servers or virtual machines get a `/64` IPv6 subnet assigned (e.g. 557 `2001:db8:23:42::/64`). In this case you can split it up further and provide 558 Docker a `/80` subnet while using a separate `/80` subnet for other 559 applications on the host: 560 561 ![](/article-img/ipv6_slash64_subnet_config.svg) 562 563 In this setup the subnet `2001:db8:23:42::/80` with a range from `2001:db8:23:42:0:0:0:0` 564 to `2001:db8:23:42:0:ffff:ffff:ffff` is attached to `eth0`, with the host listening 565 at `2001:db8:23:42::1`. The subnet `2001:db8:23:42:1::/80` with an address range from 566 `2001:db8:23:42:1:0:0:0` to `2001:db8:23:42:1:ffff:ffff:ffff` is attached to 567 `docker0` and will be used by containers. 568 569 #### Using NDP proxying 570 571 If your Docker host is only part of an IPv6 subnet but has not got an IPv6 572 subnet assigned you can use NDP proxying to connect your containers via IPv6 to 573 the internet. 574 For example your host has the IPv6 address `2001:db8::c001`, is part of the 575 subnet `2001:db8::/64` and your IaaS provider allows you to configure the IPv6 576 addresses `2001:db8::c000` to `2001:db8::c00f`: 577 578 $ ip -6 addr show 579 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 580 inet6 ::1/128 scope host 581 valid_lft forever preferred_lft forever 582 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000 583 inet6 2001:db8::c001/64 scope global 584 valid_lft forever preferred_lft forever 585 inet6 fe80::601:3fff:fea1:9c01/64 scope link 586 valid_lft forever preferred_lft forever 587 588 Let's split up the configurable address range into two subnets 589 `2001:db8::c000/125` and `2001:db8::c008/125`. The first one can be used by the 590 host itself, the latter by Docker: 591 592 docker daemon --ipv6 --fixed-cidr-v6 2001:db8::c008/125 593 594 You notice the Docker subnet is within the subnet managed by your router that 595 is connected to `eth0`. This means all devices (containers) with the addresses 596 from the Docker subnet are expected to be found within the router subnet. 597 Therefore the router thinks it can talk to these containers directly. 598 599 ![](/article-img/ipv6_ndp_proxying.svg) 600 601 As soon as the router wants to send an IPv6 packet to the first container it 602 will transmit a neighbor solicitation request, asking, who has 603 `2001:db8::c009`? But it will get no answer because no one on this subnet has 604 this address. The container with this address is hidden behind the Docker host. 605 The Docker host has to listen to neighbor solicitation requests for the container 606 address and send a response that itself is the device that is responsible for 607 the address. This is done by a Kernel feature called `NDP Proxy`. You can 608 enable it by executing 609 610 $ sysctl net.ipv6.conf.eth0.proxy_ndp=1 611 612 Now you can add the container's IPv6 address to the NDP proxy table: 613 614 $ ip -6 neigh add proxy 2001:db8::c009 dev eth0 615 616 This command tells the Kernel to answer to incoming neighbor solicitation requests 617 regarding the IPv6 address `2001:db8::c009` on the device `eth0`. As a 618 consequence of this all traffic to this IPv6 address will go into the Docker 619 host and it will forward it according to its routing table via the `docker0` 620 device to the container network: 621 622 $ ip -6 route show 623 2001:db8::c008/125 dev docker0 metric 1 624 2001:db8::/64 dev eth0 proto kernel metric 256 625 626 You have to execute the `ip -6 neigh add proxy ...` command for every IPv6 627 address in your Docker subnet. Unfortunately there is no functionality for 628 adding a whole subnet by executing one command. An alternative approach would be to 629 use an NDP proxy daemon such as [ndppd](https://github.com/DanielAdolfsson/ndppd). 630 631 ### Docker IPv6 cluster 632 633 #### Switched network environment 634 Using routable IPv6 addresses allows you to realize communication between 635 containers on different hosts. Let's have a look at a simple Docker IPv6 cluster 636 example: 637 638 ![](/article-img/ipv6_switched_network_example.svg) 639 640 The Docker hosts are in the `2001:db8:0::/64` subnet. Host1 is configured 641 to provide addresses from the `2001:db8:1::/64` subnet to its containers. It 642 has three routes configured: 643 644 - Route all traffic to `2001:db8:0::/64` via `eth0` 645 - Route all traffic to `2001:db8:1::/64` via `docker0` 646 - Route all traffic to `2001:db8:2::/64` via Host2 with IP `2001:db8::2` 647 648 Host1 also acts as a router on OSI layer 3. When one of the network clients 649 tries to contact a target that is specified in Host1's routing table Host1 will 650 forward the traffic accordingly. It acts as a router for all networks it knows: 651 `2001:db8::/64`, `2001:db8:1::/64` and `2001:db8:2::/64`. 652 653 On Host2 we have nearly the same configuration. Host2's containers will get 654 IPv6 addresses from `2001:db8:2::/64`. Host2 has three routes configured: 655 656 - Route all traffic to `2001:db8:0::/64` via `eth0` 657 - Route all traffic to `2001:db8:2::/64` via `docker0` 658 - Route all traffic to `2001:db8:1::/64` via Host1 with IP `2001:db8:0::1` 659 660 The difference to Host1 is that the network `2001:db8:2::/64` is directly 661 attached to the host via its `docker0` interface whereas it reaches 662 `2001:db8:1::/64` via Host1's IPv6 address `2001:db8::1`. 663 664 This way every container is able to contact every other container. The 665 containers `Container1-*` share the same subnet and contact each other directly. 666 The traffic between `Container1-*` and `Container2-*` will be routed via Host1 667 and Host2 because those containers do not share the same subnet. 668 669 In a switched environment every host has to know all routes to every subnet. You 670 always have to update the hosts' routing tables once you add or remove a host 671 to the cluster. 672 673 Every configuration in the diagram that is shown below the dashed line is 674 handled by Docker: The `docker0` bridge IP address configuration, the route to 675 the Docker subnet on the host, the container IP addresses and the routes on the 676 containers. The configuration above the line is up to the user and can be 677 adapted to the individual environment. 678 679 #### Routed network environment 680 681 In a routed network environment you replace the layer 2 switch with a layer 3 682 router. Now the hosts just have to know their default gateway (the router) and 683 the route to their own containers (managed by Docker). The router holds all 684 routing information about the Docker subnets. When you add or remove a host to 685 this environment you just have to update the routing table in the router - not 686 on every host. 687 688 ![](/article-img/ipv6_routed_network_example.svg) 689 690 In this scenario containers of the same host can communicate directly with each 691 other. The traffic between containers on different hosts will be routed via 692 their hosts and the router. For example packet from `Container1-1` to 693 `Container2-1` will be routed through `Host1`, `Router` and `Host2` until it 694 arrives at `Container2-1`. 695 696 To keep the IPv6 addresses short in this example a `/48` network is assigned to 697 every host. The hosts use a `/64` subnet of this for its own services and one 698 for Docker. When adding a third host you would add a route for the subnet 699 `2001:db8:3::/48` in the router and configure Docker on Host3 with 700 `--fixed-cidr-v6=2001:db8:3:1::/64`. 701 702 Remember the subnet for Docker containers should at least have a size of `/80`. 703 This way an IPv6 address can end with the container's MAC address and you 704 prevent NDP neighbor cache invalidation issues in the Docker layer. So if you 705 have a `/64` for your whole environment use `/78` subnets for the hosts and 706 `/80` for the containers. This way you can use 4096 hosts with 16 `/80` subnets 707 each. 708 709 Every configuration in the diagram that is visualized below the dashed line is 710 handled by Docker: The `docker0` bridge IP address configuration, the route to 711 the Docker subnet on the host, the container IP addresses and the routes on the 712 containers. The configuration above the line is up to the user and can be 713 adapted to the individual environment. 714 715 ## Customizing docker0 716 717 <a name="docker0"></a> 718 719 By default, the Docker server creates and configures the host system's 720 `docker0` interface as an *Ethernet bridge* inside the Linux kernel that 721 can pass packets back and forth between other physical or virtual 722 network interfaces so that they behave as a single Ethernet network. 723 724 Docker configures `docker0` with an IP address, netmask and IP 725 allocation range. The host machine can both receive and send packets to 726 containers connected to the bridge, and gives it an MTU — the *maximum 727 transmission unit* or largest packet length that the interface will 728 allow — of either 1,500 bytes or else a more specific value copied from 729 the Docker host's interface that supports its default route. These 730 options are configurable at server startup: 731 732 * `--bip=CIDR` — supply a specific IP address and netmask for the 733 `docker0` bridge, using standard CIDR notation like 734 `192.168.1.5/24`. 735 736 * `--fixed-cidr=CIDR` — restrict the IP range from the `docker0` subnet, 737 using the standard CIDR notation like `172.167.1.0/28`. This range must 738 be and IPv4 range for fixed IPs (ex: 10.20.0.0/16) and must be a subset 739 of the bridge IP range (`docker0` or set using `--bridge`). For example 740 with `--fixed-cidr=192.168.1.0/25`, IPs for your containers will be chosen 741 from the first half of `192.168.1.0/24` subnet. 742 743 * `--mtu=BYTES` — override the maximum packet length on `docker0`. 744 745 746 Once you have one or more containers up and running, you can confirm 747 that Docker has properly connected them to the `docker0` bridge by 748 running the `brctl` command on the host machine and looking at the 749 `interfaces` column of the output. Here is a host with two different 750 containers connected: 751 752 # Display bridge info 753 754 $ sudo brctl show 755 bridge name bridge id STP enabled interfaces 756 docker0 8000.3a1d7362b4ee no veth65f9 757 vethdda6 758 759 If the `brctl` command is not installed on your Docker host, then on 760 Ubuntu you should be able to run `sudo apt-get install bridge-utils` to 761 install it. 762 763 Finally, the `docker0` Ethernet bridge settings are used every time you 764 create a new container. Docker selects a free IP address from the range 765 available on the bridge each time you `docker run` a new container, and 766 configures the container's `eth0` interface with that IP address and the 767 bridge's netmask. The Docker host's own IP address on the bridge is 768 used as the default gateway by which each container reaches the rest of 769 the Internet. 770 771 # The network, as seen from a container 772 773 $ docker run -i -t --rm base /bin/bash 774 775 $$ ip addr show eth0 776 24: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 777 link/ether 32:6f:e0:35:57:91 brd ff:ff:ff:ff:ff:ff 778 inet 172.17.0.3/16 scope global eth0 779 valid_lft forever preferred_lft forever 780 inet6 fe80::306f:e0ff:fe35:5791/64 scope link 781 valid_lft forever preferred_lft forever 782 783 $$ ip route 784 default via 172.17.42.1 dev eth0 785 172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.3 786 787 $$ exit 788 789 Remember that the Docker host will not be willing to forward container 790 packets out on to the Internet unless its `ip_forward` system setting is 791 `1` — see the section above on [Communication between 792 containers](#between-containers) for details. 793 794 ## Building your own bridge 795 796 <a name="bridge-building"></a> 797 798 If you want to take Docker out of the business of creating its own 799 Ethernet bridge entirely, you can set up your own bridge before starting 800 Docker and use `-b BRIDGE` or `--bridge=BRIDGE` to tell Docker to use 801 your bridge instead. If you already have Docker up and running with its 802 old `docker0` still configured, you will probably want to begin by 803 stopping the service and removing the interface: 804 805 # Stopping Docker and removing docker0 806 807 $ sudo service docker stop 808 $ sudo ip link set dev docker0 down 809 $ sudo brctl delbr docker0 810 $ sudo iptables -t nat -F POSTROUTING 811 812 Then, before starting the Docker service, create your own bridge and 813 give it whatever configuration you want. Here we will create a simple 814 enough bridge that we really could just have used the options in the 815 previous section to customize `docker0`, but it will be enough to 816 illustrate the technique. 817 818 # Create our own bridge 819 820 $ sudo brctl addbr bridge0 821 $ sudo ip addr add 192.168.5.1/24 dev bridge0 822 $ sudo ip link set dev bridge0 up 823 824 # Confirming that our bridge is up and running 825 826 $ ip addr show bridge0 827 4: bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default 828 link/ether 66:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff 829 inet 192.168.5.1/24 scope global bridge0 830 valid_lft forever preferred_lft forever 831 832 # Tell Docker about it and restart (on Ubuntu) 833 834 $ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker 835 $ sudo service docker start 836 837 # Confirming new outgoing NAT masquerade is set up 838 839 $ sudo iptables -t nat -L -n 840 ... 841 Chain POSTROUTING (policy ACCEPT) 842 target prot opt source destination 843 MASQUERADE all -- 192.168.5.0/24 0.0.0.0/0 844 845 846 The result should be that the Docker server starts successfully and is 847 now prepared to bind containers to the new bridge. After pausing to 848 verify the bridge's configuration, try creating a container — you will 849 see that its IP address is in your new IP address range, which Docker 850 will have auto-detected. 851 852 Just as we learned in the previous section, you can use the `brctl show` 853 command to see Docker add and remove interfaces from the bridge as you 854 start and stop containers, and can run `ip addr` and `ip route` inside a 855 container to see that it has been given an address in the bridge's IP 856 address range and has been told to use the Docker host's IP address on 857 the bridge as its default gateway to the rest of the Internet. 858 859 ## How Docker networks a container 860 861 <a name="container-networking"></a> 862 863 While Docker is under active development and continues to tweak and 864 improve its network configuration logic, the shell commands in this 865 section are rough equivalents to the steps that Docker takes when 866 configuring networking for each new container. 867 868 Let's review a few basics. 869 870 To communicate using the Internet Protocol (IP), a machine needs access 871 to at least one network interface at which packets can be sent and 872 received, and a routing table that defines the range of IP addresses 873 reachable through that interface. Network interfaces do not have to be 874 physical devices. In fact, the `lo` loopback interface available on 875 every Linux machine (and inside each Docker container) is entirely 876 virtual — the Linux kernel simply copies loopback packets directly from 877 the sender's memory into the receiver's memory. 878 879 Docker uses special virtual interfaces to let containers communicate 880 with the host machine — pairs of virtual interfaces called “peers” that 881 are linked inside of the host machine's kernel so that packets can 882 travel between them. They are simple to create, as we will see in a 883 moment. 884 885 The steps with which Docker configures a container are: 886 887 1. Create a pair of peer virtual interfaces. 888 889 2. Give one of them a unique name like `veth65f9`, keep it inside of 890 the main Docker host, and bind it to `docker0` or whatever bridge 891 Docker is supposed to be using. 892 893 3. Toss the other interface over the wall into the new container (which 894 will already have been provided with an `lo` interface) and rename 895 it to the much prettier name `eth0` since, inside of the container's 896 separate and unique network interface namespace, there are no 897 physical interfaces with which this name could collide. 898 899 4. Set the interface's MAC address according to the `--mac-address` 900 parameter or generate a random one. 901 902 5. Give the container's `eth0` a new IP address from within the 903 bridge's range of network addresses. The default route is set to the 904 IP address passed to the Docker daemon using the `--default-gateway` 905 option if specified, otherwise to the IP address that the Docker host 906 owns on the bridge. The MAC address is generated from the IP address 907 unless otherwise specified. This prevents ARP cache invalidation 908 problems, when a new container comes up with an IP used in the past by 909 another container with another MAC. 910 911 With these steps complete, the container now possesses an `eth0` 912 (virtual) network card and will find itself able to communicate with 913 other containers and the rest of the Internet. 914 915 You can opt out of the above process for a particular container by 916 giving the `--net=` option to `docker run`, which takes four possible 917 values. 918 919 * `--net=bridge` — The default action, that connects the container to 920 the Docker bridge as described above. 921 922 * `--net=host` — Tells Docker to skip placing the container inside of 923 a separate network stack. In essence, this choice tells Docker to 924 **not containerize the container's networking**! While container 925 processes will still be confined to their own filesystem and process 926 list and resource limits, a quick `ip addr` command will show you 927 that, network-wise, they live “outside” in the main Docker host and 928 have full access to its network interfaces. Note that this does 929 **not** let the container reconfigure the host network stack — that 930 would require `--privileged=true` — but it does let container 931 processes open low-numbered ports like any other root process. 932 It also allows the container to access local network services 933 like D-bus. This can lead to processes in the container being 934 able to do unexpected things like 935 [restart your computer](https://github.com/docker/docker/issues/6401). 936 You should use this option with caution. 937 938 * `--net=container:NAME_or_ID` — Tells Docker to put this container's 939 processes inside of the network stack that has already been created 940 inside of another container. The new container's processes will be 941 confined to their own filesystem and process list and resource 942 limits, but will share the same IP address and port numbers as the 943 first container, and processes on the two containers will be able to 944 connect to each other over the loopback interface. 945 946 * `--net=none` — Tells Docker to put the container inside of its own 947 network stack but not to take any steps to configure its network, 948 leaving you free to build any of the custom configurations explored 949 in the last few sections of this document. 950 951 To get an idea of the steps that are necessary if you use `--net=none` 952 as described in that last bullet point, here are the commands that you 953 would run to reach roughly the same configuration as if you had let 954 Docker do all of the configuration: 955 956 # At one shell, start a container and 957 # leave its shell idle and running 958 959 $ docker run -i -t --rm --net=none base /bin/bash 960 root@63f36fc01b5f:/# 961 962 # At another shell, learn the container process ID 963 # and create its namespace entry in /var/run/netns/ 964 # for the "ip netns" command we will be using below 965 966 $ docker inspect -f '{{.State.Pid}}' 63f36fc01b5f 967 2778 968 $ pid=2778 969 $ sudo mkdir -p /var/run/netns 970 $ sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid 971 972 # Check the bridge's IP address and netmask 973 974 $ ip addr show docker0 975 21: docker0: ... 976 inet 172.17.42.1/16 scope global docker0 977 ... 978 979 # Create a pair of "peer" interfaces A and B, 980 # bind the A end to the bridge, and bring it up 981 982 $ sudo ip link add A type veth peer name B 983 $ sudo brctl addif docker0 A 984 $ sudo ip link set A up 985 986 # Place B inside the container's network namespace, 987 # rename to eth0, and activate it with a free IP 988 989 $ sudo ip link set B netns $pid 990 $ sudo ip netns exec $pid ip link set dev B name eth0 991 $ sudo ip netns exec $pid ip link set eth0 address 12:34:56:78:9a:bc 992 $ sudo ip netns exec $pid ip link set eth0 up 993 $ sudo ip netns exec $pid ip addr add 172.17.42.99/16 dev eth0 994 $ sudo ip netns exec $pid ip route add default via 172.17.42.1 995 996 At this point your container should be able to perform networking 997 operations as usual. 998 999 When you finally exit the shell and Docker cleans up the container, the 1000 network namespace is destroyed along with our virtual `eth0` — whose 1001 destruction in turn destroys interface `A` out in the Docker host and 1002 automatically un-registers it from the `docker0` bridge. So everything 1003 gets cleaned up without our having to run any extra commands! Well, 1004 almost everything: 1005 1006 # Clean up dangling symlinks in /var/run/netns 1007 1008 find -L /var/run/netns -type l -delete 1009 1010 Also note that while the script above used modern `ip` command instead 1011 of old deprecated wrappers like `ipconfig` and `route`, these older 1012 commands would also have worked inside of our container. The `ip addr` 1013 command can be typed as `ip a` if you are in a hurry. 1014 1015 Finally, note the importance of the `ip netns exec` command, which let 1016 us reach inside and configure a network namespace as root. The same 1017 commands would not have worked if run inside of the container, because 1018 part of safe containerization is that Docker strips container processes 1019 of the right to configure their own networks. Using `ip netns exec` is 1020 what let us finish up the configuration without having to take the 1021 dangerous step of running the container itself with `--privileged=true`. 1022 1023 ## Tools and examples 1024 1025 Before diving into the following sections on custom network topologies, 1026 you might be interested in glancing at a few external tools or examples 1027 of the same kinds of configuration. Here are two: 1028 1029 * Jérôme Petazzoni has created a `pipework` shell script to help you 1030 connect together containers in arbitrarily complex scenarios: 1031 <https://github.com/jpetazzo/pipework> 1032 1033 * Brandon Rhodes has created a whole network topology of Docker 1034 containers for the next edition of Foundations of Python Network 1035 Programming that includes routing, NAT'd firewalls, and servers that 1036 offer HTTP, SMTP, POP, IMAP, Telnet, SSH, and FTP: 1037 <https://github.com/brandon-rhodes/fopnp/tree/m/playground> 1038 1039 Both tools use networking commands very much like the ones you saw in 1040 the previous section, and will see in the following sections. 1041 1042 ## Building a point-to-point connection 1043 1044 <a name="point-to-point"></a> 1045 1046 By default, Docker attaches all containers to the virtual subnet 1047 implemented by `docker0`. You can create containers that are each 1048 connected to some different virtual subnet by creating your own bridge 1049 as shown in [Building your own bridge](#bridge-building), starting each 1050 container with `docker run --net=none`, and then attaching the 1051 containers to your bridge with the shell commands shown in [How Docker 1052 networks a container](#container-networking). 1053 1054 But sometimes you want two particular containers to be able to 1055 communicate directly without the added complexity of both being bound to 1056 a host-wide Ethernet bridge. 1057 1058 The solution is simple: when you create your pair of peer interfaces, 1059 simply throw *both* of them into containers, and configure them as 1060 classic point-to-point links. The two containers will then be able to 1061 communicate directly (provided you manage to tell each container the 1062 other's IP address, of course). You might adjust the instructions of 1063 the previous section to go something like this: 1064 1065 # Start up two containers in two terminal windows 1066 1067 $ docker run -i -t --rm --net=none base /bin/bash 1068 root@1f1f4c1f931a:/# 1069 1070 $ docker run -i -t --rm --net=none base /bin/bash 1071 root@12e343489d2f:/# 1072 1073 # Learn the container process IDs 1074 # and create their namespace entries 1075 1076 $ docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a 1077 2989 1078 $ docker inspect -f '{{.State.Pid}}' 12e343489d2f 1079 3004 1080 $ sudo mkdir -p /var/run/netns 1081 $ sudo ln -s /proc/2989/ns/net /var/run/netns/2989 1082 $ sudo ln -s /proc/3004/ns/net /var/run/netns/3004 1083 1084 # Create the "peer" interfaces and hand them out 1085 1086 $ sudo ip link add A type veth peer name B 1087 1088 $ sudo ip link set A netns 2989 1089 $ sudo ip netns exec 2989 ip addr add 10.1.1.1/32 dev A 1090 $ sudo ip netns exec 2989 ip link set A up 1091 $ sudo ip netns exec 2989 ip route add 10.1.1.2/32 dev A 1092 1093 $ sudo ip link set B netns 3004 1094 $ sudo ip netns exec 3004 ip addr add 10.1.1.2/32 dev B 1095 $ sudo ip netns exec 3004 ip link set B up 1096 $ sudo ip netns exec 3004 ip route add 10.1.1.1/32 dev B 1097 1098 The two containers should now be able to ping each other and make 1099 connections successfully. Point-to-point links like this do not depend 1100 on a subnet nor a netmask, but on the bare assertion made by `ip route` 1101 that some other single IP address is connected to a particular network 1102 interface. 1103 1104 Note that point-to-point links can be safely combined with other kinds 1105 of network connectivity — there is no need to start the containers with 1106 `--net=none` if you want point-to-point links to be an addition to the 1107 container's normal networking instead of a replacement. 1108 1109 A final permutation of this pattern is to create the point-to-point link 1110 between the Docker host and one container, which would allow the host to 1111 communicate with that one container on some single IP address and thus 1112 communicate “out-of-band” of the bridge that connects the other, more 1113 usual containers. But unless you have very specific networking needs 1114 that drive you to such a solution, it is probably far preferable to use 1115 `--icc=false` to lock down inter-container communication, as we explored 1116 earlier. 1117 1118 ## Editing networking config files 1119 1120 Starting with Docker v.1.2.0, you can now edit `/etc/hosts`, `/etc/hostname` 1121 and `/etc/resolve.conf` in a running container. This is useful if you need 1122 to install bind or other services that might override one of those files. 1123 1124 Note, however, that changes to these files will not be saved by 1125 `docker commit`, nor will they be saved during `docker run`. 1126 That means they won't be saved in the image, nor will they persist when a 1127 container is restarted; they will only "stick" in a running container.