Глава 3. Построение вашей первой сетевой среды Docker
Данная глава описывает практические примеры построения сетей Docker, охватывая множество контейнеров по множеству хостов. Мы охватим следующие темы:
-
Введение в Piperwork
-
Множество контейнеров поверх одного хоста
-
В направлении масштабирования сетевых сред - введение в Open vSwitch
-
Построение сетей с оверлейными сетевыми средами - Flannel
-
Сравнение параметров построения сетей Docker
Содержание
Конвейеризация (Piperwork) позволяет вам соединять воедино контейнеры в произвольных сложных сценарях.
На практике она создаёт унаследованный мост Linux, добавляет новый интерфейс в контейнер, а затем подключает данный интерфейс к этому мосту; контейнеры получают сегмент сетевой среды в котором они взаимодействуют друг с другом.
Piperwork является сценарием оболочки и его установка проста:
#sudo wget -O /usr/local/bin/pipework
https://raw.githubusercontent.com/jpetazzo/pipework/master/pipework && sudo
chmod +x /usr/local/bin/pipework
Следующий рисунок отображает взаимодействие контейнеров с применением 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)
Теперь давайте применим Pipework для соединения с ними:
[root@us-east-1 ~]# s3cmd ls s3://owncloud#sudo pipework brpipe c1 192.168.1.1/24
Данная команда создаёт на машине хоста мост, brpipe
. Она добавляет
интефейс eth1
к вашему контейнеру с1
с IP адресом 192.168.1.1
и подключает интерфейс к мосту следующим
образом:
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
Эта команда не создаст мост brpipe
, так как он уже существует.
Она добавит интерфейс eth1
к контейнеру
c2
и соединит его с этим мостом следующим образом:
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)
Теперь контейнеры соединены и будут способны пинговать друг друга, так как они оба находятся в одной подсети,
а именно, 192.168.1.0/24
. Pipework предоставляет преимущество добавлления
статичных IP адресов вашим контейнерам.
Weave (переплетение) создаёт виртуальную сетевую среду, которая способна соединять контейнеры Docker на множестве хостов так, как если бы они соединялись одним комутатором. Маршрутизатор Weave сам по себе выполняется в качестве контейнера Docker и может кодировать обмен для передачи его через Интернет. Предоставляемые сетевой средой Weave контейнеры приложений могут быть сделаны доступными для внешнего мира, в зависимости от того, где эти контейнеры выполняются.
Воспользуйтесь следующим кодом для установки Weave:
#sudo curl -L git.io/weave -o /usr/local/bin/weave
#sudo chmod a+x /usr/local/bin/weave
Следующий рисунок изображает взаимодействие с множеством хостов с применением Weave
На $HOST1
мы выполним:
# weave launch
# eval $(weave proxy-env)
# docker run --name c1 -ti ubuntu
Далее мы повторим аналогичные шаги на $HOST2
:
# weave launch $HOST1
# eval $(weave proxy-env)
# docker run --name c2 -ti ubuntu
В запущенном на $HOST1
контейнере создаётся следующий вывод:
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)
Мы може увидеть интерфейс Weave, ethwe
, воспользовавшись
командой ifconfig
:
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
Аналогично, в запущенном на $HOST2
контейнере создаётся следующий
вывод:
#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
Следовательно, здесь мы достигли желаемого - два контейнера на различных хостах успешно общаются друг с другом.
Docker по умолчанию использует мост docker0
. Однако, существуют
варианты применения, при которых может требоваться Open vSwitch
(OVS) вместо моста Linux. Отдельный мост
Linux может обрабатывать только 1024 порта- это ограничивает масштабируемость Docker, поскольку мы можем
создать только 1024 контейнера, причйм каждый с отдельным сетевым интерфейсом.
Теперь мы установим OVS на отдельный хост, создадим два контейнера, и соединим их мостом OVS.
Для установки OVS примените эту команду:
# sudo apt-get install openvswitch-switch
Установите утилиту ovs-docker
следующим образом:
# cd /usr/bin
# wget https://raw.githubusercontent.com/openvswitch/ovs/master/utilities/ovsdocker
# chmod a+rwx ovs-docker
Приводимая ниже схема показывает OVS с одним хостом:
Создание моста OVS
Здесь мы добавим новый мост OVS и настроим его таким образом, чтобы он мог достичь контейнеры, присоединённые к различным сетевым средам следующим образом:
# ovs-vsctl add-br ovs-br1
# ifconfig ovs-br1 173.16.1.1 netmask 255.255.255.0 up
Из моста OVS добавим порт к контейнеру Docker применив следующую последовательность:
-
Создадим два контейнера Ubuntu Docker:
# docker run -I -t --name container1 ubuntu /bin/bash # docekr run -I -t --name container2 ubuntu /bin/bash
-
Соединим эти контейнеры с вашим моcтом OVS:
# ovs-docker add-port ovs-br1 eth1 container1 --ipaddress=173.16.1.2/24 # ovs-docker add-port ovs-br1 eth1 container2 --ipaddress=173.16.1.3/24
-
Ппри помощи команды
ping
проверим соединение между двумя контейнерами, взаимодействующими через мост OVS. Для начала определим их IP адреса:# docker exec container1 ifconfig eth0 Link encap:Ethernet HWaddr 02:42:ac:10:11:02 inet addr:172.16.17.2 Bcast:0.0.0.0 Mask:255.255.255.0 inet6 addr: fe80::42:acff:fe10:1102/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1472 Metric:1 RX packets:36 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4956 (4.9 KB) TX bytes:648 (648.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 exec container2 ifconfig eth0 Link encap:Ethernet HWaddr 02:42:ac:10:11:03 inet addr:172.16.17.3 Bcast:0.0.0.0 Mask:255.255.255.0 inet6 addr: fe80::42:acff:fe10:1103/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1472 Metric:1 RX packets:27 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4201 (4.2 KB) TX bytes:648 (648.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)
Теперь, когда мы знаем IP адреса
container1
иcontainer2
, мы можем пропинговать их:# docker exec container2 ping 172.16.17.2 PING 172.16.17.2 (172.16.17.2) 56(84) bytes of data. 64 bytes from 172.16.17.2: icmp_seq=1 ttl=64 time=0.257 ms 64 bytes from 172.16.17.2: icmp_seq=2 ttl=64 time=0.048 ms 64 bytes from 172.16.17.2: icmp_seq=3 ttl=64 time=0.052 ms # docker exec container1 ping 172.16.17.2 PING 172.16.17.2 (172.16.17.2) 56(84) bytes of data. 64 bytes from 172.16.17.2: icmp_seq=1 ttl=64 time=0.060 ms 64 bytes from 172.16.17.2: icmp_seq=2 ttl=64 time=0.035 ms 64 bytes from 172.16.17.2: icmp_seq=3 ttl=64 time=0.031 ms
Давайте рассмотрим как соединять контейнеры Docker с применением OVS на множестве хостов.
Рассмотрим нашу сборку как это отображено на диаграмме ниже, которая содержит два хоста, Host1 и Host2, работающих под управлением Ubuntu 14.04:
На обоих хостах установим Docker и Open vSwitch:
# wget -qO- https://get.docker.com/ | sh
# sudo apt-get install openvswitch-switch
Установим утилиту ovs-docker
:
# cd /usr/bin
# wget https://raw.githubusercontent.com/openvswitch/ovs/master/utilities/ovsdocker
# chmod a+rwx ovs-docker
По умолчанию, Docker случайным образом выбирает сеть для выполнения в ней контейнеров. Он создаёт мост,
docker0
и назначает ему IP адрес
(172.17.42.1
). Следовательно, у обоих
Host1 и
Host2 IP адреса моста
docker0
являются одинаковыми, что осложняет взаимодействие контейнеров
в обоих ваших хостах. Для преодоления этого препятствия, давайте назначим статические IP адреса вашей
сетевой среде, а именно: 192.168.10.0/24
.
Давайте взглянем на то, как изменится подсеть Docker по умолчанию.
Выполним на Host1 следующие команды:
# service docker stop
# ip link set dev docker0 down
# ip addr del 172.17.42.1/16 dev docker0
# ip addr add 192.168.10.1/24 dev docker0
# ip link set dev docker0 up
# ip addr show docker0
# service docker start
Добавим мост br0 OVS:
# ovs-vsctl add-br br0
Создадим туннель к другому хосту и подключимся к нему:
# add-port br0 gre0—set interface gre0 type=gre
options:remote_ip=30.30.30.8
Добавим мост br0 к мосту docker0:
# brctl addif docker0 br0
На Host2 выполним следующие команды:
# service docker stop
# iptables -t nat -F POSTROUTING
# ip link set dev docker0 down
# ip addr del 172.17.42.1/16 dev docker0
# ip addr add 192.168.10.2/24 dev docker0
# ip link set dev docker0 up
# ip addr show docker0
# service docker start
Добавим OVS мост br0:
# ip link set br0 up
# ovs-vsctl add-br br0
Создадим туннель к другому хосту и присоединимся к нему:
# br0 bridge ovs-vsctl add-port br0 gre0—set interface gre0 type=gre options:remote_ip=30.30.30.7
Добавим мост br0 к нашему мосту docker0:
# brctl addif docker0 br0
Мост docker0 подключён к другому мосту, br0. В то же время, это мост OVS. Это означает, что весь обмен между мостами также маршрутизируется через br0.
Кроме того, нам необходимо соединить вместе сети с двух хостов, в которых выполняются контейнеры. Для этой цели применяется туннель GRE. Этот туннель присоединяется к мосту OVS br0 и, в результате, к docker0.
После выполнения предыдущих команд на обоих хостах, у вас должна быть возможность пинговать адреса моста docker0 с обоих хостов.
При применении команды ping на Host1 создаётся следующий вывод:
# ping 192.168.10.2
PING 192.168.10.2 (192.168.10.2) 56(84) bytes of data.
64 bytes from 192.168.10.2: icmp_seq=1 ttl=64 time=0.088 ms
64 bytes from 192.168.10.2: icmp_seq=2 ttl=64 time=0.032 ms
^C
--- 192.168.10.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.032/0.060/0.088/0.028 ms
Когда мы используем команду ping на Host2, мы получаем:
# ping 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.088 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.032 ms
^C
--- 192.168.10.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.032/0.060/0.088/0.028 ms
Давайте посмотрим как создавать контейнеры на обоих наших хостах:
На Host1 воспользуемся следующим кодом:
# docker run -t -i --name container1 ubuntu:latest /bin/bash
На Host2 применим:
# docker run -t -i --name container2 ubuntu:latest /bin/bash
Теперь мы можем пинговать container2 из container1. Таким образом, мы соединили контейнеры Docker на множестве хостов при помощи Open vSwitch.
Flannel является уровнем виртуальной сетевой среды, который предоставляет подсеть каждому хосту для её применения контейнерами Docker. Он поставляется в пакете с CoreOS, однако также может быть настроен с прочими ОС Linux. Flannel создаёт оверлеи на самом деле соединяясь с мостом Docker, к которому, в свою очередь, присоединены контейнеры, как это показано на рисунке ниже. Для установки Flannel необходимы две машины хостов или ВМ, которые могут быть как CoreOS, что более предпочтительно, ОС Linux, как это ображено на данном рисунке:
Код Flannel может быть клонирован с GitHub и собран локально, если это необходимо, на различных предпочтениях ОС Linux, как показано здесь. В качестве предустановленного он поставляется в CoreOS:
# git clone https://github.com/coreos/flannel.git
Cloning into 'flannel'...
remote: Counting objects: 2141, done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 2141 (delta 6), reused 0 (delta 0), pack-reused 2122
Receiving objects: 100% (2141/2141), 4.
Checking connectivity… done.
# sudo docker run -v `pwd`:/opt/flannel -i -t google/golang /bin/bash -c
"cd /opt/flannel && ./build"
Building flanneld…
Машины CoreOs могут быть легко настроены с применением Vagrant и VirtualBox, как это оговаривается в руководстве по следующей ссылке: https://coreos.com/os/docs/latest/booting-on-vagrant.html.
После того как машина создана и на ней выполнена регистрация, мы увидим мост Flannel, автоматически
создающийся с применением настройки etcd
:
# ifconfig flannel0
flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1472
inet 10.1.30.0 netmask 255.255.0.0 destination 10.1.30.0
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
txqueuelen 500 (UNSPEC)
RX packets 243 bytes 20692 (20.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 304 bytes 25536 (24.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Среда Flannel может быть проверена просмотром subnet.env
:
# cat /run/flannel/subnet.env
FLANNEL_NETWORK=10.1.0.0/16
FLANNEL_SUBNET=10.1.30.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=true
Демон Docker должен быть перезапущен с применением следующей команды для переустановки сетевой среды с параметрами подсети от моста Flannel:
# source /run/flannel/subnet.env
# sudo rm /var/run/docker.pid
# sudo ifconfig docker0 ${FLANNEL_SUBNET}
# sudo docker -d --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU} & INFO[0000]
[graphdriver] using prior storage driver "overlay"
INFO[0000] Option DefaultDriver: bridge
INFO[0000] Option DefaultNetwork: bridge
INFO[0000] Listening for HTTP on unix (/var/run/docker.sock)
INFO[0000] Firewalld running: false
INFO[0000] Loading containers: start.
..............
INFO[0000] Loading containers: done.
INFO[0000] Daemon has completed initialization
INFO[0000] Docker daemon
commit=cedd534-dirty execdriver=native-0.2 graphdriver=overlay
version=1.8.3
Для вторго хоста среда Flannel может быть проверена просмотром subnet.env
:
# cat /run/flannel/subnet.env
FLANNEL_NETWORK=10.1.0.0/16
FLANNEL_SUBNET=10.1.31.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=true
На втором хосте размещается другая подсеть. Служба Docker также может быть перезапущена на этом хосте с указанием моста Flannel:
# source /run/flannel/subnet.env
# sudo ifconfig docker0 ${FLANNEL_SUBNET}
# sudo docker -d --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU} & INFO[0000]
[graphdriver] using prior storage driver "overlay"
INFO[0000] Listening for HTTP on unix (/var/run/docker.sock)
INFO[0000] Option DefaultDriver: bridge
INFO[0000] Option DefaultNetwork: bridge
INFO[0000] Firewalld running: false
INFO[0000] Loading containers: start.
....
INFO[0000] Loading containers: done.
INFO[0000] Daemon has completed initialization
INFO[0000] Docker daemon
commit=cedd534-dirty execdriver=native-0.2 graphdriver=overlay
version=1.8.3
Контейнеры Docker могут быть созданы на соответствующих хостах и они могут быть протестированы с применением
команды ping
для проверки связности оверлейной сетевой среды
Flannel:
#docker run -it ubuntu /bin/bash
INFO[0013] POST /v1.20/containers/create
INFO[0013] POST
/v1.20/containers/1d1582111801c8788695910e57c02fdba593f443c15e2f1db9174ed9078db809/attach?stderr=1&stdin=1&stdout=1&stream=1
INFO[0013] POST
/v1.20/containers/1d1582111801c8788695910e57c02fdba593f443c15e2f1db9174ed9078db809/start
INFO[0013] POST
/v1.20/containers/1d1582111801c8788695910e57c02fdba593f443c15e2f1db9174ed9078db809/resize?h=44&w=80
root@1d1582111801:/# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0a:01:1e:02
inet addr:10.1.30.2 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::42:aff:fe01:1e02/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1472 Metric:1
RX packets:11 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:969 (969.0 B) TX bytes:508 (508.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)
Для Host2 воспользуйтесь следующими командами:
# docker run -it ubuntu /bin/bash
root@ed070166624a:/# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0a:01:1f:02
inet addr:10.1.31.2 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::42:aff:fe01:1f02/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1472 Metric:1
RX packets:18 errors:0 dropped:2 overruns:0 frame:0
TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1544 (1.5 KB) TX bytes:598 (598.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)
root@ed070166624a:/# ping 10.1.30.2
PING 10.1.30.2 (10.1.30.2) 56(84) bytes of data.
64 bytes from 10.1.30.2: icmp_seq=1 ttl=60 time=3.61 ms
64 bytes from 10.1.30.2: icmp_seq=2 ttl=60 time=1.38 ms
64 bytes from 10.1.30.2: icmp_seq=3 ttl=60 time=0.695 ms
64 bytes from 10.1.30.2: icmp_seq=4 ttl=60 time=1.49 ms
Таким образом, в предыдущем примере мы увидели уменьшение сложности с применением Flannel при выполнении
агента flanneld
на каждом хосте, который отвечает за выделение подсети,
сдаваемой в аренду из предварительно настроенного простанства адресов. Flannel внутренне применяет
etcd
для сохранения настроек сетевой среды и прочих подробностей таких,
как IP хоста и выделяемая подсеть. Перенаправление пакетов достигается применением лежащей в основе
стратегии.
Flannel также имеет целью решение проблемы развёртывания Kubernetes в поставщиках облачных решений, отличных от GCE, в которых оверлеи ячеек сетевых сред Flannel могут облегчить проблему назначения уникального IP адреса каждому соединению путём создания подсети для каждого сервера.
В этой главе мы изучили как контейнеры Docker взаимодейтсвуют на множестве хостов с применением различных параметров сетевой среды, таких как {Pipework}, Weave, OVS и Flannel. Pipework использует наследуемый мост Linux, Weave создаёт виртуальную сетевую среду, OVS применяет технологию туннелирования GRE, а Flannel обеспечивает отдельные подсети для каждого хоста для соединения контейнеров на множестве хостов. Некоторые из реализаций, такие как Pipeworks, являются наследуемыми и остаются абсолютными на всём промежутке времени, в то время как другие разрабатываются для применения в контексте определённых ОС, например, Flannel с CoreOS.
Следующий рисунок показывает базовое сопоставление параметров построения сетевых сред Docker:
В следующей главе мы обсудим то, как контейнеры Docker выстраивают сетевые среды с применением таких инфраструктур, как Kubernetes, Docker Swarm и Mesosphere.