Create a new bridge network and connect with container

Lab Environments

We use the docker hosts created by docker-machine on Amazon AWS.

$ docker-machine ls
NAME              ACTIVE   DRIVER      STATE     URL                       SWARM   DOCKER    ERRORS
docker-host-aws   -        amazonec2   Running   tcp://52.53.176.55:2376           v1.13.0
(docker-k8s-lab)➜  docker-k8s-lab git:(master) ✗ docker ssh docker-host-aws
docker: 'ssh' is not a docker command.
See 'docker --help'
$ docker-machine ssh docker-host-aws
ubuntu@docker-host-aws:~$ docker version
Client:
 Version:      1.13.0
 API version:  1.25
 Go version:   go1.7.3
 Git commit:   49bf474
 Built:        Tue Jan 17 09:50:17 2017
 OS/Arch:      linux/amd64

Server:
 Version:      1.13.0
 API version:  1.25 (minimum version 1.12)
 Go version:   go1.7.3
 Git commit:   49bf474
 Built:        Tue Jan 17 09:50:17 2017
 OS/Arch:      linux/amd64
 Experimental: false
ubuntu@docker-host-aws:~$

Create a new Bridge Network

Use docker network create -d bridge NETWORK_NAME command to create a new bridge network [1].

ubuntu@docker-host-aws:~$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
326ddef352c5        bridge              bridge              local
28cc7c021812        demo                bridge              local
1ca18e6b4867        host                host                local
e9530f1fb046        none                null                local
ubuntu@docker-host-aws:~$ docker network rm demo
demo
ubuntu@docker-host-aws:~$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
326ddef352c5        bridge              bridge              local
1ca18e6b4867        host                host                local
e9530f1fb046        none                null                local
ubuntu@docker-host-aws:~$ docker network create -d bridge my-bridge
e0fc5f7ff50e97787a7b13064f12806232dcc88bafa9c2eb07cec5e81cefd886
ubuntu@docker-host-aws:~$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
326ddef352c5        bridge              bridge              local
1ca18e6b4867        host                host                local
e0fc5f7ff50e        my-bridge           bridge              local
e9530f1fb046        none                null                local
ubuntu@docker-host-aws:~$
ubuntu@docker-host-aws:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 02:30:c1:3e:63:3a brd ff:ff:ff:ff:ff:ff
    inet 172.31.29.93/20 brd 172.31.31.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::30:c1ff:fe3e:633a/64 scope link
       valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:a7:88:bd:32 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:a7ff:fe88:bd32/64 scope link
       valid_lft forever preferred_lft forever
56: br-e0fc5f7ff50e: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:c0:80:09:3c brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 scope global br-e0fc5f7ff50e
       valid_lft forever preferred_lft forever
ubuntu@docker-host-aws:~$ brctl show
bridge name bridge id   STP enabled interfaces
br-e0fc5f7ff50e   8000.0242c080093c no
docker0   8000.0242a788bd32 no
ubuntu@docker-host-aws:~$

Create a Container connected with new Bridge

Create a container connected with the my-bridge network.

$ docker run -d --name test1 --network my-bridge busybox sh -c "while true;do sleep 3600;done"
$ docker exec -it test1 sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
57: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe12:2/64 scope link
       valid_lft forever preferred_lft forever

ubuntu@docker-host-aws:~$ brctl show
bridge name bridge id   STP enabled interfaces
br-e0fc5f7ff50e   8000.0242c080093c no    veth2f36f74
docker0   8000.0242a788bd32 no
ubuntu@docker-host-aws:~$

The new container will connect with the my-bridge.

Change a Container’s network

Create two containers which connect with the default docker0 bridge.

ubuntu@docker-host-aws:~$ docker run -d --name test1  busybox sh -c "while true;do sleep 3600;done"
73624dd5373b594526d73a1d6fb68a32b92c1ed75e84575f32e4e0f2e1d8d356
ubuntu@docker-host-aws:~$ docker run -d --name test2  busybox sh -c "while true;do sleep 3600;done"
33498192d489832a8534fb516029be7fbaf0b58e665d3e4922147857ffbbc10b

Create a new bridge network

ubuntu@docker-host-aws:~$ docker network create -d bridge demo-bridge
be9309ebb3b3fc18c3d43b0fef7c82fe348ce7bf841e281934deccf6bd6e51eb

Use docker network connect demo-bridge test1 command to connect container test1 to bridge demo-bridge.

ubuntu@docker-host-aws:~$ docker network connect demo-bridge test1
ubuntu@docker-host-aws:~$ brctl show
bridge name bridge id   STP enabled interfaces
br-be9309ebb3b3   8000.02423906b898 no    vethec7dc1d
docker0   8000.0242a788bd32 no    veth3238a5d
              veth7b516dd
ubuntu@docker-host-aws:~$ docker network inspect demo-bridge
[
    {
        "Name": "demo-bridge",
        "Id": "be9309ebb3b3fc18c3d43b0fef7c82fe348ce7bf841e281934deccf6bd6e51eb",
        "Created": "2017-02-23T06:16:28.251575297Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {
            "73624dd5373b594526d73a1d6fb68a32b92c1ed75e84575f32e4e0f2e1d8d356": {
                "Name": "test1",
                "EndpointID": "b766bfcc7fc851620b63931f114f5b81b5e072c7ffd64d8f1c99d9828810f17a",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

Now the container test1 has connected with the default docker0 bridge and demo-bridge. we can do them same action to connect container test2 to demo-bridge network. After that:

ubuntu@docker-host-aws:~$ brctl show
bridge name bridge id   STP enabled interfaces
br-be9309ebb3b3   8000.02423906b898 no    veth67bd1b0
              vethec7dc1d
docker0   8000.0242a788bd32 no    veth3238a5d
              veth7b516dd
ubuntu@docker-host-aws:~$ docker network inspect demo-bridge
[
    {
        "Name": "demo-bridge",
        "Id": "be9309ebb3b3fc18c3d43b0fef7c82fe348ce7bf841e281934deccf6bd6e51eb",
        "Created": "2017-02-23T06:16:28.251575297Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {
            "33498192d489832a8534fb516029be7fbaf0b58e665d3e4922147857ffbbc10b": {
                "Name": "test2",
                "EndpointID": "26d6bdc1c1c0459ba49718e07d6983a9dda1a1a96db3f1beedcbc5ea54abd163",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "73624dd5373b594526d73a1d6fb68a32b92c1ed75e84575f32e4e0f2e1d8d356": {
                "Name": "test1",
                "EndpointID": "b766bfcc7fc851620b63931f114f5b81b5e072c7ffd64d8f1c99d9828810f17a",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

Now, if we go into test1, we can ping test2 directly by container name:

ubuntu@docker-host-aws:~$ docker exec -it test1 sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
78: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link
       valid_lft forever preferred_lft forever
83: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe12:2/64 scope link
       valid_lft forever preferred_lft forever
/ # ping test2
PING test2 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.095 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.077 ms
^C
--- test2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.077/0.086/0.095 ms

Also, we can use docker network disconnect demo-bridge test1 to disconnect container test1 from network demo-bridge.