Weave - weaving containers into applications
Weave creates a virtual network that connects Docker containers
deployed across multiple hosts and enables their automatic discovery.
Applications use the network just as if the containers were all
plugged into the same network switch, with no need to configure port
mappings, links, etc. Services provided by application containers on
the weave network can be made accessible to the outside world,
regardless of where those containers are running. Similarly, existing
internal systems can be exposed to application containers irrespective
of their location.
Weave can traverse firewalls and operate in partially connected
networks. Traffic can be encrypted, allowing hosts to be connected
across an untrusted network.
With weave you can easily construct applications consisting of
multiple containers, running anywhere.
Weave works alongside Docker's existing (single host) networking
capabilities, so these can continue to be used by containers.
Installation
Ensure you are running Linux (kernel 3.8 or later) and have Docker
(version 1.3.1 or later) installed. Then install weave with
sudo curl -L git.io/weave -o /usr/local/bin/weave
sudo chmod a+x /usr/local/bin/weave
CoreOS users see here for an example of installing weave using cloud-config.
Weave respects the environment variable DOCKER_HOST
, so you can run
it locally to control a weave network on a remote host.
Quick Start Screencast
Example
Say you have docker running on two hosts, accessible to each other as
$HOST1
and $HOST2
, and want to deploy an application consisting of
two containers, one on each host.
On $HOST1
run
host1$ weave launch
host1$ weave launch-dns
host1$ weave run --name a1 -ti ubuntu
The first two lines start the weave router and DNS, each inside their
own container - this needs to be done once per host. Whilst the
required docker images are downloaded automatically, there is also a
weave setup
command for downloading all the images required for
weave operation; this is a strictly optional step which is especially
useful for automated installation of weave and ensures that any
subsequent weave commands do not encounter delays due to image
downloading.
The third line runs our application container, allocating it an IP
address on the weave network and registering it in DNS. weave run
invokes docker run -d
behind the scenes, so we could be launching
any container this way; here we just take a stock ubuntu container and
launch a shell in it. There's also a weave start
command, which
invokes docker start
for starting existing containers.
If our application consists of more than one container on this host we
simply launch them with a variation on third second line.
Next we repeat similar steps on $HOST2
...
host2$ weave launch $HOST1
host2$ weave launch-dns
host2$ weave run --name a2 -ti ubuntu
The only difference, apart from the name of the application container,
is that we tell our weave that it should peer with the weave on
$HOST1
(specified as the IP address or hostname, and optional
:port
, by which $HOST2
can reach it). NB: if there is a firewall
between $HOST1
and $HOST2
, you must open the weave port (6783 by
default; this can be overriden by setting WEAVE_PORT
) for TCP and
UDP.
Note that we could instead have told the weave on $HOST1
to connect to
$HOST2
, or told both about each other. Order does not matter here;
weave automatically (re)connects to peers when they become
available. Also, we can tell weave to connect to multiple peers by
supplying multiple addresses, separated by spaces. And we can
add peers dynamically.
Now that we've got everything set up, let's see whether our containers
can talk to each other...
On $HOST1
...
host1$ docker attach a1
root@a1:/# ping -c 1 -q a2
PING a2.weave.local (10.160.0.2) 56(84) bytes of data.
--- a2.weave.local ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.341/0.341/0.341/0.000 ms
Similarly, on $HOST2
...
host2$ docker attach a2
root@a2:/# ping -c 1 -q a1
PING a1.weave.local (10.128.0.2) 56(84) bytes of data.
--- a1.weave.local ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.366/0.366/0.366/0.000 ms
So there we have it, two containers on separate hosts happily talking
to each other.
Find out more
Found a bug, want to suggest a feature, or have a question?
File an issue, or email
help@weave.works. When reporting a bug, please include which version of
weave you are running, as shown by weave version
.
Follow weave on Twitter:
@weaveworks.
Read the Weave blog:
Weaveblog.
IRC:
#weavenetwork