Порт Docker, работающий на IPv6, но не на IPv4 - PullRequest
1 голос
/ 26 октября 2019

У меня есть следующий очень простой docker-compose.yml, работающий на Mac:

version: "3.7"
services:
  apache:
    image: httpd:2.4.41
    ports:
      - 80:80

Я запускаю docker-compose up, затем запускаю curl, и Apache возвращает содержимое:

/tmp/test $ curl -v http://localhost
*   Trying ::1:80...
* TCP_NODELAY set
* Connected to localhost (::1) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.66.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Sat, 26 Oct 2019 18:30:03 GMT
< Server: Apache/2.4.41 (Unix)
< Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
< ETag: "2d-432a5e4a73a80"
< Accept-Ranges: bytes
< Content-Length: 45
< Content-Type: text/html
< 
<html><body><h1>It works!</h1></body></html>
* Connection #0 to host localhost left intact

Однако, если я пытаюсь получить доступ к контейнеру, используя 127.0.0.1 вместо localhost, я получаю отказ в соединении:

/tmp/test $ curl -v http://127.0.0.1
*   Trying 127.0.0.1:80...
* TCP_NODELAY set
* Connection failed
* connect to 127.0.0.1 port 80 failed: Connection refused
* Failed to connect to 127.0.0.1 port 80: Connection refused
* Closing connection 0
curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused

Localhost указывает на 127.0.0.1:

/tmp/test $ ping localhost
PING localhost (127.0.0.1): 56 data bytes

И netstat показывает все локальные IP-адреса порта 80 для переадресации:

/tmp/test $ netstat -tna | grep 80
...
tcp46      0      0  *.80                   *.*                    LISTEN     
...

Я пришел к этому, фактически пытаясь получить доступ к контейнеру с помощью собственного домена, который был в моем файле /etc/hosts, указывая на127.0.0.1. Я подумал, что с этим доменным именем что-то не так, но потом я попробовал 127.0.0.1 и тоже не сработал, поэтому я пришел к выводу, что в докере есть что-то очень простое, что я не правильно делаю.

Почему curl http://localhost работает, а curl http://127.0.0.1 не работает?

ОБНОВЛЕНИЕ Кажется, что localhost разрешается в IPv6 :: 1, поэтому переадресация портов работает на IPv6, а не на адресах IPv4,Имеет ли это какой-то смысл?

ОБНОВЛЕНИЕ 2 Я не смог это исправить, но мне нужно было продолжить, поэтому я просто сделал обходной путь. Поскольку все, что мне было нужно, - это получить доступ к своему док-контейнеру, используя собственное доменное имя, в итоге я указал свой домен на :: 1 вместо 127.0.0.1 в моем файле / etc / hosts. Я не думаю, что буду отлаживать эту проблему дальше, но если у кого-то есть хорошее объяснение по этому поводу, было бы интересно узнать это.

...