Dynamic Routing Challenge
This guide explains how to make the topology. The goal is like as below.
Table of Contents
- Step 1: Create the Network
- Step 2: Create the Host (Container)
- Step 3: Connect between a host (Container) and a network
- See Also
Step 1: Create the Network
To create the network, use the following command:
$ docker network create <network_name> -d bridge --subnet=<subnet>
To check whether it’s created or not, use the following command:
$ docker network ls
To remove networks, use the following command:
$ docker network rm <network_name> <network_name>
Example
To add a new network named nw20
whose subnet is 192.168.20.0/24
, type like this:
$ docker network create nw20 -d bridge --subnet=192.168.20.0/24
To add a new network named nw21
whose subnet is 192.168.21.0/24
, type like this:
$ docker network create nw21 -d bridge --subnet=192.168.21.0/24
The topology will like as below.
Here is an example of adding a network named nw20
and nw21
.
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
f760eb82b30f bridge bridge local
3a05f05787c9 host host local
3cd75e5b104d none null local
$ docker network create nw20 -d bridge --subnet=192.168.20.0/24
d7531a6cd6a4ac8ba17a954ad0e51145a224d8ee1336b00fd627114ec63ab8d8
$ docker network create nw21 -d bridge --subnet=192.168.21.0/24
28af3fdd638c919c57d18054155b137280e57e8c3230b34936b86b3586a8319d
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
f760eb82b30f bridge bridge local
3a05f05787c9 host host local
3cd75e5b104d none null local
d7531a6cd6a4 nw20 bridge local
28af3fdd638c nw21 bridge local
Step 2: Create the Host (Container)
To create the host (Container), use the following command on the same directory as new makefile:
$ make create NAME=<container_name> NW=<network_name> IP=<ip address>
YOU CAN’T SPECIFY THE IP OF WHICH THE LAST BYTE IS ONE LIKE 192.168.20.1
.
This is due to specification of the docker.
To check whether it’s created or not, use the following command:
$ docker container ls --all
To remove the host (Container), use the following command:
$ docker container rm <container_name>
Before this, you need to stop its container. Or you can use --force
argument like this:
$ docker container rm <container_name> --force
Example
To create a container named R1
whose ip address is 192.168.20.4
whose network is nw20
, type like this:
$ make create NAME=R1 NW=nw20 IP=192.168.20.4
To create a container named R2
whose ip address is 192.168.20.2
whose network is nw20
, type like this:
$ make create NAME=R2 NW=nw20 IP=192.168.20.2
To create a container named R3
whose ip address is 192.168.20.3
whose network is nw20
, type like this:
$ make create NAME=R3 NW=nw20 IP=192.168.20.3
The topology will like as below. This topology has already applied to Step 1.
Here is an example of creating and removing a container named R1
and R2
and R3
.
The output depends on your OS.
$ make create NAME=R1 NW=nw20 IP=192.168.20.4
docker run -itd --name R1 --hostname=R1 --sysctl net.ipv4.ip_forward=1 --privileged -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --net=nw20 --ip=192.168.20.4 ieng:2 /bin/bash
1b075d70e0bca58819c042bee8e6c40fc6dbfa4cf4a1ce6dd770b1b18ff24ba8
$ make create NAME=R2 NW=nw20 IP=192.168.20.2
docker run -itd --name R2 --hostname=R2 --sysctl net.ipv4.ip_forward=1 --privileged -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --net=nw20 --ip=192.168.20.2 ieng:2 /bin/bash
d61974186b23fef44a67f4d94af2e9814bac34551c26c05798468bd3abd3b09b
$ make create NAME=R3 NW=nw20 IP=192.168.20.3
docker run -itd --name R3 --hostname=R3 --sysctl net.ipv4.ip_forward=1 --privileged -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --net=nw20 --ip=192.168.20.3 ieng:2 /bin/bash
627e2a423a84e674deedd842555a
$ docker rm R1 R2 R3
Error response from daemon: You cannot remove a running container 1b075d70e0bca58819c042bee8e6c40fc6dbfa4cf4a1ce6dd770b1b18ff24ba8. Stop the container before attempting removal or force remove
Error response from daemon: You cannot remove a running container d61974186b23fef44a67f4d94af2e9814bac34551c26c05798468bd3abd3b09b. Stop the container before attempting removal or force remove
Error response from daemon: You cannot remove a running container 627e2a423a84e674deedd842555a3b5b9b628be84a66bd158292b4aeba7b5ced. Stop the container before attempting removal or force remove
$ docker stop R1 R2 R3
R1
R2
R3
$ docker rm R1 R2 R3
R1
R2
R3
As you can see, you have to stop the container before removing. But with --force
argument, you can remove it.
Step 3: Connect between a host (Container) and a network
To connect between a host (Container) and a network, use the following command:
$ docker network connect <network_name> <container_name>
To disconnect between a host (Container) and a network, use the following command:
$ docker network disconnect <network_name> <container_name>
To check whether it’s connected or not, use the following command:
$ docker inspect <container_name>
You can also specify <network_name>
, but you won’t check whether it’s connected by hostE or not.
The output is too long. It’s good idea to filter output to Networks
by using grep
.
To check an ip address or network interface, start and attach its container, and then use the following command:
$ ip a
Example
To connect between nw21
and R2
, type like this:
$ docker network connect nw21 R2
To connect between nw21
and R3
, type like this:
$ docker network connect nw21 R3
The topology will like as below. This topology has already applied to Step 1 and 2.
Here is an example of connecting and checking (by ip a
) between nw21
and R2
and nw21
and R3
.
$ docker network connect nw21 R2
$ docker network connect nw21 R3
$ docker attach R2
ieng@R2:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
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
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:14:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.20.2/24 brd 192.168.20.255 scope global eth0
valid_lft forever preferred_lft forever
15: eth1@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:15:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.21.2/24 brd 192.168.21.255 scope global eth1
valid_lft forever preferred_lft forever
ieng@R2:~$ read escape sequence
$ docker attach R3
ieng@R3:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
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
13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:14:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.20.3/24 brd 192.168.20.255 scope global eth0
valid_lft forever preferred_lft forever
17: eth1@if18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:15:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.21.3/24 brd 192.168.21.255 scope global eth1
valid_lft forever preferred_lft forever
ieng@R3:~$
read escape sequence
means I pressed CTRL - P and CTRL - Q (detaching the container).
See Also
- “FRR User Manual”, https://buildmedia.readthedocs.org/media/pdf/frrouting/latest/frrouting.pdf
- “OSPF Configuration Guide”, https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/iproute_ospf/configuration/xe-16/iro-xe-16-book/iro-cfg.html
- “OSPF コンフィギュレーション ガイド”, https://www.cisco.com/c/ja_jp/td/docs/ans/wideareaappservs/cachesw/cr/001/iro-15-1-book/iro-cfg.html
- “システム管理コンフィギュレーション ガイド”, https://www.cisco.com/c/ja_jp/td/docs/switches/lan/catalyst3850/software/release/3e/system_management/configuration_guide/b_sm_3e_3850_cg/b_sm_3e_3850_cg_chapter_010001.html
- “OSPF 設計ガイド”, https://www.cisco.com/c/ja_jp/support/docs/ip/open-shortest-path-first-ospf/7039-1.html