Невозможно подключиться к службе Docker

Я запускаю образ докера на машине MAC, и когда я вошел в контейнер, я вижу IP-адрес как "172.17.0.2"( cat /etc/hosts).

  1. Как Docker выбирает IP?
  2. Есть ли диапазон IP, который выбирает докер?

  3. Что делать, если я запускаю несколько контейнеров на одном хосте? Будет ли это по-другому?

  4. /etc/resolve.conf дает немного IP. Что это за IP и где он берется?
  5. Как подключиться к сервису Docker, используя внутренний IP, скажем 172.17.0.2

ping CONTAINER_ID -> возвращает IP 172.17.0.2

Как это решает имя хоста?

Я пытался читать через сеть, но это не помогает.

Кроме того, я использую свой сервис в порту 8443. Тем не менее я не могу подключиться.

Я пытался бежать,

docker run -net host -p 8443: 8443 ИЗОБРАЖЕНИЕ

Все еще не повезло.

Пробовал также подход ниже.

Окно запуска -p MY_MACHINE_IP:8080:8080 ИЗОБРАЖЕНИЕ

Пробовал с,

Http://MY_MACHINE_IP:8080

HTTP: // локальный: 8080

Ничто из вышеперечисленного не работает.

вывод ifconfig,

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
    options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
    inet 127.0.0.1 netmask 0xff000000 
    inet6 ::1 prefixlen 128 
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
    nd6 options=201<PERFORMNUD,DAD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
XHC20: flags=0<> mtu 0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 60:f8:1d:b2:cb:0c 
    inet6 fe80::49d:a511:dc4e:7960%en0 prefixlen 64 secured scopeid 0x5 
    inet 10.231.168.63 netmask 0xffe00000 broadcast 10.255.255.255
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect
    status: active
p2p0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2304
    ether 02:f8:1d:b2:cb:0c 
    media: autoselect
    status: inactive
awdl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1484
    ether 0a:71:96:61:e4:eb 
    inet6 fe80::871:96ff:fe61:e4eb%awdl0 prefixlen 64 scopeid 0x7 
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect
    status: active
en1: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether 72:00:07:57:48:30 
    media: autoselect <full-duplex>
    status: inactive
en2: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether 72:00:07:57:48:31 
    media: autoselect <full-duplex>
    status: inactive
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    options=63<RXCSUM,TXCSUM,TSO4,TSO6>
    ether 72:00:07:57:48:30 
    Configuration:
        id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
        maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
        root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
        ipfilter disabled flags 0x2
    member: en1 flags=3<LEARNING,DISCOVER>
            ifmaxaddr 0 port 8 priority 0 path cost 0
    member: en2 flags=3<LEARNING,DISCOVER>
            ifmaxaddr 0 port 9 priority 0 path cost 0
    nd6 options=201<PERFORMNUD,DAD>
    media: <unknown type>
    status: inactive
utun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 2000
    inet6 fe80::3f17:8946:c18d:5d25%utun0 prefixlen 64 scopeid 0xb 
    nd6 options=201<PERFORMNUD,DAD>
utun2: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1380
    inet6 fe80::20aa:76fd:d68:7fb2%utun2 prefixlen 64 scopeid 0xd 
    nd6 options=201<PERFORMNUD,DAD>
utun3: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1380
    inet6 fe80::e42a:c616:4960:2c43%utun3 prefixlen 64 scopeid 0x10 
    nd6 options=201<PERFORMNUD,DAD>
utun1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1342
    inet 17...... --> 17.... netmask 0xff000000 
    inet6 fe80::93df:7780:862c:8a06%utun1 prefixlen 64 scopeid 0x12 
    nd6 options=201<PERFORMNUD,DAD>

Спасибо

3 ответа

Для первых 4 вопросов вы можете найти здесь некоторую информацию, в целом docker network Ответственный по поводу менеджера сети.

Обычно я задаю процы так:

docker run -p 8443:8443 IMAGE

и это работает.

Ссылка на существующую тему здесь

1. Как Docker выбирает IP?

Когда докер установлен на вашем компьютере, он создаст docker0 интерфейс. Он будет давать IP-адрес вашему контейнеру при каждом запуске. Вы можете проверить диапазон IP для docker0 от ifconfig команда.

2. Есть ли диапазон IP, который выбирает докер?

Да, пожалуйста, обратитесь мой ответ 1.

3. Что делать, если я запускаю несколько контейнеров на одном хосте? Будет ли это по-другому?

Да, это будет отличаться от диапазона docker0 интерфейс, пока вы не создадите свою собственную сеть, используя docker network create для более подробной информации: Docker Networking

4./etc/resolve.conf дает немного IP. Что это за IP и где он берется?

Это внутренний DNS сети Docker, вы можете дать свой DNS IP в vi /etc/systemd/system/docker.service.d/docker.conf добавьте свой DNS-сервер в линию, как показано ниже:

[Service]
        ExecStart=
        ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock -g "/opt/docker_storage" --dns <replace-dns-ip>

5. Как подключиться к сервису Docker по внутреннему IP, скажем 172.17.0.2

Вы должны выставить порт для подключения, как docker run -p 8443:8443 <image-name>после этого вы можете подключиться telnet localhost 8443 или же curl http://172.17.0.2:8443

Самое важное

Добавьте следующее к /etc/sysctl.conf

net.ipv4.ip_forward = 1 и применить настройки

sysctl -p /etc/sysctl.conf

Надеюсь, это поможет.

Спасибо!

Docker сам управляет всем этим внутренним сетевым механизмом. Это включает в себя выделение IP-адресов (v4) из частного диапазона, настройку NAT для исходящих соединений и службу DNS, позволяющую контейнерам взаимодействовать друг с другом.

Стабильная, разумная установка:

  • Бежать docker network create mynetодин раз, чтобы создать сеть не по умолчанию. (Docker Compose сделает это автоматически).
  • Запустите ваши контейнеры с --net mynet,
  • Когда контейнеры должны общаться друг с другом, они могут использовать другие контейнеры --name как DNS-имена (вы можете подключиться к http://other-container-name).
  • Если вам нужно добраться до контейнера из другого места, опубликуйте его сервисный порт, используя docker run -p или Docker Compose ports: раздел. Это может быть достигнуто с использованием DNS-имени хоста или IP-адреса и опубликованного порта.
  • Никогда не используйте частные IP-адреса контейнера (напрямую).
  • Никогда не используйте localhost если вы не уверены, что это значит. (Это правильный способ получить доступ к опубликованному порту из браузера, запущенного на хосте, на котором работают контейнеры; это почти определенно не то, что вы имеете в виду внутри контейнера.)

Проблемы, которые я видел с частными IP-адресами контейнеров, обычно возникают во второй раз, когда вы их используете: потому что вы перезапустили контейнер и IP-адрес изменился; потому что он работал с вашего локального хоста, и теперь вы хотите добраться до него откуда-то еще.

Чтобы кратко ответить на ваши первоначальные вопросы: (1-2) Docker назначает их сам из сети, которую можно настроить, но часто по умолчанию 172.17.0.0/16; (3) разные контейнеры имеют разные частные IP-адреса; (4-5) Docker предоставляет собственную службу DNS и /etc/resolv.conf указывает там; (6) ICMP-соединение обычно не очень много, и вам не нужно ping контейнеры (использование dig или же nslookup для отладки DNS, curl для актуальных HTTP-запросов).

Другие вопросы по тегам