У меня есть следующий очень простой 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. Я не думаю, что буду отлаживать эту проблему дальше, но если у кого-то есть хорошее объяснение по этому поводу, было бы интересно узнать это.