Виды сетей у докера(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
Наименее защищенная сеть, такие контейнеры называются\ открытыми. Они получают доступ на пряму к сетевым интерфесам хостовой машины.