我有以下非常简单的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,但也没有用,所以我认为关于docker的某些基本问题我没有做对。
为什么curl http://localhost
工作,而curl http://127.0.0.1
没有工作?
更新 似乎localhost正在解析为IPv6 :: 1,因此端口转发似乎在IPv6上有效,但在IPv4地址上不起作用。那有意义吗?
更新2 我无法修复它,但是我需要继续,所以我做了一个解决方法。由于我只想使用自定义域名访问docker容器,因此最终将我的域指向:: 1而不是/ etc / hosts文件中的127.0.0.1。我认为我不会进一步调试此问题,但是如果有人对此有很好的解释,那么知道它将会很有趣。
答案 0 :(得分:1)
找到了罪魁祸首:pfctl
AFAIK,pfctl
不应自动运行,但我的/System/Library/LaunchDaemons/com.apple.pfctl.plist
则相反。
已将数据包过滤配置为将端口80上的所有传入流量重定向到8080,并将端口443重定向到8443。而且,在没有任何进程实际侦听端口80和443的情况下完成了此操作,这就是lsof
和{{1 }}什么也不会显示。
netstat
具有以下内容
/Library/LaunchDaemons/it.winged.httpdfwd.plist
解决方案只是侦听端口8080和8443。所有对端口80和443的请求现在都被透明地重定向。
在进行调试时,我发现了无数关于类似问题的未解决问题。我希望这对某人有帮助。