вторник, 3 марта 2015 г.

Docker networking

Виды сетей у докера(Docker Network Types)

Closed Network/ None Network - контейнеры находясь в такой сети закрыты от и для внешнего мира
Bridge Network - вид по-умолчанию, где создается мост, через который контейнеры могут общаться с внешним миром и между собой на поточном хосте. В каждом контейнере созадется свой личный сетевой интерфейс, который соединяется с мостом для общений.
Host Network - прямой доступ на сетевой интерфейс хозяйской машины, как на родной
Overlay Network - тип сети, который позволяет находиться контейнерам в одной сети, не смотря на то, что они между собой запущены на разных хостах.

Посмотреть доступные сети докера на хосте. По умолчанию будут следующие:

$ docker network ls
NETWORK ID      NAME            DRIVER          SCOPE
77bf6b8ff5cf    bridge          bridge          local
9aac4cefdaf1    host            host            local
b8aa8b4a699f    none            null            local

Closed Network/ None Network

Пример как запустить изолированный конртейнер:
$ docker run -d --net none busybox sleep 1000
Внутри у такого контейнера только один сетевой интерфейс lo, который лупбек - тоесть это только локалхост.

Bridge Network

Внутри у контейнера, который по умолчанию подключен к bridge сети, уже два сетевых интерфейса lo и eth0, которая уже локальная сеть типа Mask: 255.255.0.0
Но контейнеры с разных сетей типа мост не могут уже иметь доступа к друг другу. Можем создать еще одну сеть типа мост:
$ docker network create --driver bridge my_bridge_network
$ docker network inspect my_bridge_network
[
   {
      "Name": "my_bridge_network",
      ...
      "IPAM": {
        "Driver": "default",
        "Config": [
           {
             "Subnet": "172.18.0.0/16",
             "Gateway": "172.18.0.1"
           }
        ]
      },
      ...
   }
]
$ docker run -d --name container_3 --net my_bridge_network busybox sleep 1000
Но мы можем подключать контейнеры к нескольким сетям, так контейнер который запущен был в другой сети сможет общаться с контейнера с сети по умолчанию
$ docker network connect bridge container_3
Вот так контейнер получил, доступ к контейнерам с другой сети. Так он получил еще +один сетевой интерфейс eth1.
Ну и когда доступ больше предоставлять не стоит, то
$ docker network disconnect bridge container_3
Так сетевой интерфейс eth1 удаляется у контейнера.
  Следующя информация может быть уже устаревшей, но принцип остается следующим.
Docker всегда создает дополнительный сетевой интерфейс в системе с именем bridge0(скорее всего на момент 11.02.2017 он уже с именем docker0).
Этот интерфейс является ничем иным как мостом(bridge) или виртуальным свитчером - устройство которое перебрасывает пакеты между двумя устройствами для коммуникации между ними.
Чтобы исследовать любой сетевой мост в системе нужна следующая утилита:
# apt-get install bridge-utils
# yum install bridge-utils

Посмотрим что он нам раскажет о нашем мосте:
# brctl show docker0
bridge name       bridge id           STP enabled      interfaces
docker0           8000.56847afe9799   no
Сейчас мы не видим ни одного интерфейса подключенного к мосту - это означает, что у нас нет запущенных образов:)

Наваляем побыстрому образок:
echo "\
#Test for networking module \
FROM ubuntu:15.04 \
RUN apt-get update && apt-get install -y iputils-ping traceroute \
ENTRYPOINT /bin/bash " > Dockerfile
#
# docker build -t="net-img" .
И запустим с него два контейнера
# docker run -it --name=net1 net-img #Ctrl+P+Q
# docker run -it --name=net2 net-img #Ctrl+P+Q
#
# docker ps
CONTAINER ID       IMAGE             COMMAND       CREATED
STATUS             PORTS             NAMES
d37d347f84d8       net-img:latest    "/bin/bash"   0 minutes ago Up 0 minutes
c0e85b69ecce       net-img:latest    "/bin/bahs"   1 minutes ago Up 1 minutes
Вураля и у нас появились два дополнительных сетевых интерфейса, которые завязаны на наш докеровский мост:
# brctl show docker0
bridge name       bridge id           STP enabled      interfaces
docker0           8000.56847afe9799   no               veth095066e
                                                       vethe7516ef
# ifconfig
...
veth095066e Link encap:Ethernet HWaddr ...
...
vethe7516ef Link encap:Ethernet HWaddr ...

Virtual Ethernet  - имя интерфейсов.

Host Network

Наименее защищенная сеть, такие контейнеры называются\ открытыми. Они получают доступ на пряму к сетевым интерфесам хостовой машины.

Комментариев нет:

Отправить комментарий