Невозможно подключиться к службе Docker
Я запускаю образ докера на машине MAC, и когда я вошел в контейнер, я вижу IP-адрес как "172.17.0.2"( cat /etc/hosts).
- Как Docker выбирает IP?
Есть ли диапазон IP, который выбирает докер?
Что делать, если я запускаю несколько контейнеров на одном хосте? Будет ли это по-другому?
- /etc/resolve.conf дает немного IP. Что это за IP и где он берется?
- Как подключиться к сервису 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 ИЗОБРАЖЕНИЕ
Пробовал с,
Ничто из вышеперечисленного не работает.
вывод 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 ответа
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 Composeports:
раздел. Это может быть достигнуто с использованием 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-запросов).