docker - docker 容器如何连接到主机上的端口?
问题描述
我的问题与此非常相似(从 Docker 容器内部,如何连接到机器的本地主机?)。
我尝试使用--network="host"
连接到主机的8118代理,但这不是我想要的。我还是想用桥接模式。其实感觉docker的桥接和传统意义上的NAT差不多,可以和主机通信,访问它的开放端口,但实际上不能,不知道为什么,谁能帮帮我?(ping协议是基于tcp的,也意味着20/21端口是可达的,为什么8118不可达?)
好的,我可能已经找到原因了,端口是要监控的,我试试改主机代理软件的监控。
以下是我的尝试,容器无法成功连接主机上的8118代理端口:
主持人:
VirtualBox-centos7 (ip:192.168.125.95, shadowsocks[127.0.0.1:1080], privoxy[127.0.0.1:8118]): wget 没问题。
码头工人:
一个容器设置 http_proxy=192.168.125.95:8118... 并且 wget 得到一个错误:没有到主机的路由,然后我关闭防火墙并再次尝试得到另一个错误:连接被拒绝。
码头集装箱:
root@bee1d2892df4:/go# ip route show
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.2
root@bee1d2892df4:/go# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
23: eth0@if24: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
root@bee1d2892df4:/go# telnet 172.17.0.1 8118
Trying 172.17.0.1...
telnet: Unable to connect to remote host: Connection refused
root@bee1d2892df4:/go# telnet 192.168.125.95 8118
Trying 192.168.125.95...
telnet: Unable to connect to remote host: Connection refused
root@bee1d2892df4:/go#
主持人:(这应该没用,我的iptables不应该启动。)
[root@localhost shadowsocks]# iptables -A INPUT -i docker0 -j ACCEPT
[root@localhost shadowsocks]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 DOCKER-USER all -- 0.0.0.0/0 0.0.0.0/0
2 DOCKER-ISOLATION-STAGE-1 all -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
4 DOCKER all -- 0.0.0.0/0 0.0.0.0/0
5 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
6 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
7 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
8 DOCKER all -- 0.0.0.0/0 0.0.0.0/0
9 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
10 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Chain DOCKER (2 references)
num target prot opt source destination
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
num target prot opt source destination
1 DOCKER-ISOLATION-STAGE-2 all -- 0.0.0.0/0 0.0.0.0/0
2 DOCKER-ISOLATION-STAGE-2 all -- 0.0.0.0/0 0.0.0.0/0
3 RETURN all -- 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-ISOLATION-STAGE-2 (2 references)
num target prot opt source destination
1 DROP all -- 0.0.0.0/0 0.0.0.0/0
2 DROP all -- 0.0.0.0/0 0.0.0.0/0
3 RETURN all -- 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-USER (1 references)
num target prot opt source destination
1 RETURN all -- 0.0.0.0/0 0.0.0.0/0
解决方案
解决方案:
echo 'listen-address 172.17.0.1:8118' > /usr/local/etc/privoxy/config
service privoxy restart
netstat -nltp|grep 8118
tcp 0 0 172.17.0.1:8118 0.0.0.0:* LISTEN 27154/privoxy
tcp 0 0 127.0.0.1:8118 0.0.0.0:* LISTEN 27154/privoxy
ps:我犯了一个非常低级的错误,需要学习系统原理,我有很多误解,一个服务不是说能ping ip就可以用,端口的作用是用的监听和接受数据包,pingPassing只代表tcp端口监听没问题(可能是0.0.0.0),但是第三方服务一定要注意。
推荐阅读
- java - 这个递归算法的名称?
- java - WebSocket握手期间出错:意外的响应代码:400 Spring boot websockets
- java - 如何禁用组合框中的项目?
- javascript - 获取按键字符代码的最佳实践/标准兼容方法
- flutter - flutter riverpod:如何测试 asyncvalue.error?
- angular - 错误 TS2322:类型“列表 | undefined' 不可分配给类型 'any[] (Iterable
& 任何[]) | (任何[] & 可迭代 ) | 空 | 不明确的' - python - 获取单词的开始和结束索引?
- node.js - 如何使用 Apollo Server 清除设置的 cookie
- ocaml - 取消分配大数组
- python - 在 python 中,当我尝试选择随机数时,如何确保使用 randint 的种子不断变化?