Pipework is a shell script and installing it is simple:
#sudo wget -O /usr/local/bin/pipework https://raw.githubusercontent.com/jpetazzo/pipework/master/pipework && sudo chmod +x /usr/local/bin/pipework
The following figure shows container communication using Pipework:
#docker run -i -t --name c1 ubuntu:latest /bin/bash root@5afb44195a69:/# ifconfig eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:10 inet addr:172.17.0.16 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:acff:fe11:10/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:13 errors:0 dropped:0 overruns:0 frame:0 TX packets:9 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1038 (1.0 KB) TX bytes:738 (738.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) #docker run -i -t --name c2 ubuntu:latest /bin/bash root@c94d53a76a9b:/# ifconfig eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:11 inet addr:172.17.0.17 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:acff:fe11:11/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:9 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:648 (648.0 B) TX bytes:738 (738.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)
Now let's use Pipework to connect them:
#sudo pipework brpipe c1 192.168.1.1/24
This command creates a bridge, brpipe
, on the host machine. It adds an eth1
interface to the container c1
with the IP address 192.168.1.1
and attaches the interface to the bridge as follows:
root@5afb44195a69:/# ifconfig eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:10 inet addr:172.17.0.16 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:acff:fe11:10/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:13 errors:0 dropped:0 overruns:0 frame:0 TX packets:9 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1038 (1.0 KB) TX bytes:738 (738.0 B) eth1 Link encap:Ethernet HWaddr ce:72:c5:12:4a:1a inet addr:192.168.1.1 Bcast:0.0.0.0 Mask:255.255.255.0 inet6 addr: fe80::cc72:c5ff:fe12:4a1a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:23 errors:0 dropped:0 overruns:0 frame:0 TX packets:9 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1806 (1.8 KB) TX bytes:690 (690.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) #sudo pipework brpipe c2 192.168.1.2/24
This command will not create bridge brpipe
as it already exists. It will add an eth1
interface to the container c2
and connect it to the bridge as follows:
root@c94d53a76a9b:/# ifconfig eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:11 inet addr:172.17.0.17 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:acff:fe11:11/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:9 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:648 (648.0 B) TX bytes:738 (738.0 B) eth1 Link encap:Ethernet HWaddr 36:86:fb:9e:88:ba inet addr:192.168.1.2 Bcast:0.0.0.0 Mask:255.255.255.0 inet6 addr: fe80::3486:fbff:fe9e:88ba/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:9 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:648 (648.0 B) TX bytes:690 (690.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)
Now the containers are connected and will be able to ping each other as they are on the same subnet, 192.168.1.0/24
. Pipework provides the advantage of adding static IP addresses to the containers.
Weave creates a virtual network that can connect Docker containers across multiple hosts as if they are all connected to a single switch. The Weave router itself runs as a Docker container and can encrypt routed traffic for transmission over the Internet. Services provided by application containers on the Weave network can be made accessible to the outside world, regardless of where those containers are running.
Use the following code to install Weave:
#sudo curl -L git.io/weave -o /usr/local/bin/weave #sudo chmod a+x /usr/local/bin/weave
The following figure shows multihost communication using Weave:
On $HOST1
, we run the following:
# weave launch # eval $(weave proxy-env) # docker run --name c1 -ti ubuntu
Next, we repeat similar steps on $HOST2
:
# weave launch $HOST1 # eval $(weave proxy-env) # docker run --name c2 -ti ubuntu
In the container started on $HOST1
, the following output is generated:
root@c1:/# ifconfig eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:21 inet addr:172.17.0.33 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:acff:fe11:21/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:38 errors:0 dropped:0 overruns:0 frame:0 TX packets:34 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:3166 (3.1 KB) TX bytes:2299 (2.2 KB) ethwe Link encap:Ethernet HWaddr aa:99:8a:d5:4d:d4 inet addr:10.128.0.3 Bcast:0.0.0.0 Mask:255.192.0.0 inet6 addr: fe80::a899:8aff:fed5:4dd4/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:65535 Metric:1 RX packets:130 errors:0 dropped:0 overruns:0 frame:0 TX packets:74 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:11028 (11.0 KB) TX bytes:6108 (6.1 KB) 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)
You can see the Weave network interface, ethwe
, using the ifconfig
command:
root@c2:/# ifconfig eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:04 inet addr:172.17.0.4 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:acff:fe11:4/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:28 errors:0 dropped:0 overruns:0 frame:0 TX packets:29 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:2412 (2.4 KB) TX bytes:2016 (2.0 KB) ethwe Link encap:Ethernet HWaddr 8e:7c:17:0d:0e:03 inet addr:10.160.0.1 Bcast:0.0.0.0 Mask:255.192.0.0 inet6 addr: fe80::8c7c:17ff:fe0d:e03/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:65535 Metric:1 RX packets:139 errors:0 dropped:0 overruns:0 frame:0 TX packets:74 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:11718 (11.7 KB) TX bytes:6108 (6.1 KB) 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) #root@c1:/# ping -c 1 -q c2 PING c2.weave.local (10.160.0.1) 56(84) bytes of data. --- c2.weave.local ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 1.317/1.317/1.317/0.000 ms
Similarly, in the container started on $HOST2
, the following output is generated:
#root@c2:/# ping -c 1 -q c1 PING c1.weave.local (10.128.0.3) 56(84) bytes of data. --- c1.weave.local ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 1.658/1.658/1.658/0.000 ms
So there we have it—two containers on separate hosts happily talking to each other.