The link pointed to experimental.md, but that didn't exist. It looks like README.md was intended. Probably experimental.md was renamed. Signed-off-by: Leen Besselink <github@consolejunkie.net>
6.3 KiB
Experimental: Networking and Services
In this feature:
network
andservice
become first class objects in the Docker UI- one can now create networks, publish services on that network and attach containers to the services
- Native multi-host networking
network
andservice
objects are globally significant and provides multi-host container connectivity natively
- Inbuilt simple Service Discovery
- With multi-host networking and top-level
service
object, Docker now provides out of the box simple Service Discovery for containers running in a network
- With multi-host networking and top-level
- Batteries included but removable
- Docker provides inbuilt native multi-host networking by default & can be swapped by any remote driver provided by external plugins.
This is an experimental feature. For information on installing and using experimental features, see the experimental feature overview.
Using Networks
Usage: docker network [OPTIONS] COMMAND [OPTIONS] [arg...]
Commands:
create Create a network
rm Remove a network
ls List all networks
info Display information of a network
Run 'docker network COMMAND --help' for more information on a command.
--help=false Print usage
The docker network
command is used to manage Networks.
To create a network, docker network create foo
. You can also specify a driver
if you have loaded a networking plugin e.g docker network create -d <plugin_name> foo
$ docker network create foo
aae601f43744bc1f57c515a16c8c7c4989a2cad577978a32e6910b799a6bccf6
$ docker network create -d overlay bar
d9989793e2f5fe400a58ef77f706d03f668219688ee989ea68ea78b990fa2406
docker network ls
is used to display the currently configured networks
$ docker network ls
NETWORK ID NAME TYPE
d367e613ff7f none null
bd61375b6993 host host
cc455abccfeb bridge bridge
aae601f43744 foo bridge
d9989793e2f5 bar overlay
To get detailed information on a network, you can use the docker network info
command.
$ docker network info foo
Network Id: aae601f43744bc1f57c515a16c8c7c4989a2cad577978a32e6910b799a6bccf6
Name: foo
Type: null
If you no longer have need of a network, you can delete it with docker network rm
$ docker network rm bar
bar
$ docker network ls
NETWORK ID NAME TYPE
aae601f43744 foo bridge
d367e613ff7f none null
bd61375b6993 host host
cc455abccfeb bridge bridge
User-Defined default network
Docker daemon supports a configuration flag --default-network
which takes configuration value of format DRIVER:NETWORK
, where,
DRIVER
represents the in-built drivers such as bridge, overlay, container, host and none. or Remote drivers via Network Plugins.
NETWORK
is the name of the network created using the docker network create
command
When a container is created and if the network mode (--net
) is not specified, then this default network will be used to connect
the container. If --default-network
is not specified, the default network will be the bridge
driver.
Example : docker -d --default-network=overlay:multihost
Using Services
Usage: docker service COMMAND [OPTIONS] [arg...]
Commands:
publish Publish a service
unpublish Remove a service
attach Attach a backend (container) to the service
detach Detach the backend from the service
ls Lists all services
info Display information about a service
Run 'docker service COMMAND --help' for more information on a command.
--help=false Print usage
Assuming we want to publish a service from container a0ebc12d3e48
on network foo
as my-service
we would use the following command:
$ docker service publish my-service.foo
ec56fd74717d00f968c26675c9a77707e49ae64b8e54832ebf78888eb116e428
$ docker service attach a0ebc12d3e48 my-service.foo
This would make the container a0ebc12d3e48
accessible as my-service
on network foo
. Any other container in network foo
can use DNS to resolve the address of my-service
This can also be acheived by using the --publish-service
flag for docker run
:
docker run -itd --publish-service db.foo postgres
db.foo
in this instance means "place the container on network foo
, and allow other hosts on foo
to discover it under the name db
"
We can see the current services using the docker service ls
command
$ docker service ls
SERVICE ID NAME NETWORK PROVIDER
ec56fd74717d my-service foo a0ebc12d3e48
To remove the a service:
$ docker service detach a0ebc12d3e48 my-service.foo
$ docker service unpublish my-service.foo
Native Multi-host networking
There is a lot to talk about the native multi-host networking and the overlay
driver that makes it happen. The technical details are documented under https://github.com/docker/libnetwork/blob/master/docs/overlay.md.
Using the above experimental UI docker network
, docker service
and --publish-service
, the user can exercise the power of multi-host networking.
Since network
and service
objects are globally significant, this feature requires distributed states provided by the libkv
project.
Using libkv
, the user can plug any of the supported Key-Value store (such as consul, etcd or zookeeper).
User can specify the Key-Value store of choice using the --kv-store
daemon flag, which takes configuration value of format PROVIDER:URL
, where
PROVIDER
is the name of the Key-Value store (such as consul, etcd or zookeeper) and
URL
is the url to reach the Key-Value store.
Example : docker -d --kv-store=consul:localhost:8500
Send us feedback and comments on #14083 or on the usual Google Groups (docker-user, docker-dev) and IRC channels.