Как докер-контейнер выходит в Интернет? - PullRequest
1 голос
/ 29 мая 2019

У меня установлен докер (Docker для Mac). Я запускаю новый контейнер с

docker run -it ubuntu

Я вижу, что у моего недавно созданного контейнера есть доступ в Интернет, просто вызвав

ping google.com

Понятно:

root@b06e1a46cc40:/# ping google.com
PING google.com (216.58.209.14) 56(84) bytes of data.
64 bytes from sof01s12-in-f14.1e100.net (216.58.209.14): icmp_seq=1 ttl=37 time=63.0 ms
64 bytes from sof01s12-in-f14.1e100.net (216.58.209.14): icmp_seq=2 ttl=37 time=63.7 ms
64 bytes from sof01s12-in-f14.1e100.net (216.58.209.14): icmp_seq=3 ttl=37 time=64.8 ms

Затем я проверил сети, к которым подключен мой контейнер:

root@b06e1a46cc40:/# ip addr show
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
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1
    link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1
    link/tunnel6 :: brd ::
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
root@b06e1a46cc40:/#

Как я понимаю, eth0 используется для доступа в интернет - это сеть 172.17.0.0/16.

Когда я просматриваю список сетей своего хоста, я не подключен к этой сети.

Как мой контейнер получает доступ к Интернету?

Насколько я понимаю, мой контейнер должен иметь доступ к Интернету через мой хост, потому что, в конце концов, мой хост подключен к Интернету, так что это единственный способ доступа.

Ответы [ 3 ]

1 голос
/ 29 мая 2019

Насколько я понимаю, контейнеры Docker имеют изолированную сеть, к которой могут подключаться несколько контейнеров.Контейнеры в одной сети могут сразу связываться друг с другом.Эта внутренняя сеть может быть сделана доступной для Интернета.Смотрите эту документацию: https://docs.docker.com/v17.09/engine/userguide/networking/#bridge-networks

1 голос
/ 29 мая 2019

Docker для Mac использует MacOS Hypervisor Framework запустить пользовательский дистрибутив Linux (CLD) на виртуальной машине (ВМ).

Теперь CLD внутри виртуальной машины не имеет сетевого соединения с операционной системой хоста (то есть macOS), но Docker для Mac заполняет пробел (буквально) через VPNkit .

VPNkit использует очередь общей памяти для отправки сетевых пакетов между хостом и гостем, а затем вставляет их в сетевой стек другой стороны.

Вот некоторые соответствующие статьи, которые подробно описывают, как эти вещи работают:

https://docs.docker.com/docker-for-mac/networking/ https://github.com/moby/vpnkit/blob/master/docs/ethernet.md https://github.com/moby/vpnkit/blob/master/docs/ports.md

Итак, чтобы ответить на ваш вопрос напрямую - сети / интерфейсы, которые вы можете видеть внутри своего контейнера не имеют аналогов на хосте (macOS). Вместо этого, когда вы запускаете ping google.com, результирующие сетевые пакеты перехватываются VPNkit внутри виртуальной машины, передается на хост и вводится в сетевой стек хоста.

То же самое происходит для входящих пакетов, но в обратном направлении.

0 голосов
/ 29 мая 2019

Использовать сеть хоста при запуске docker run -it --network host ubuntu

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...