系统、工具版本
简要版
结论
docker 可以 ping 通宿主机局域网 ip,但端口通信需要开防火墙开端口号,此处和阿里云的安全组不一样,本人在阿里云安全组开启 8080 端口后,可以外网通 8080 端口,但 docker 不通,当防火墙(本人用的 firewall )关闭,或打开 8080 端口时,docker 才能与该端口通信。
小插曲
docker 可以与宿主机指定端口号通信后,却不能通外网了。结论是firewall关闭时,docker 不能访问外网,于是启动 firewall,并开放指定端口,来实现预期的效果。关闭阿里云安全组该端口,并不影响 docker 与宿主机该端口通信。
过程版
发现问题
新规划,计划尽可能用 docker 部署,两个容器,一个 nginx,一个 tomcat。nginx 启动后,外网可以成功访问;tomcat 启动后,localhost可以访问,但 nginx 转发失败。
解决过程
很显然是 nginx 容器与宿主机的通讯问题,而不是 tomcat 容器,所以以下操作在 nginx 容器下进行
- 检测 docker 与宿主机通信情况
给 docker 安装 ping 和 telnet 命令
# apt-get update # apt-get iputils-ping # apt-get telnet
问:为什么不像好多博客用 sodu 呢?答:因为当前就是 root 用户
查看宿主机 ip
# ip addr 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 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:xx:xx:xx:f5:37 brd ff:ff:ff:ff:ff:ff inet 172.xx.x.xx/20 brd 172.xx.xx.255 scope global dynamic eth0 valid_lft 314450849sec preferred_lft 314450849sec 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:xx:xx:xx:00:0f brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever 5: veth0bab990@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 2e:7b:xx:xx:55:0c brd ff:ff:ff:ff:ff:ff link-netnsid 0 35: vethbbd78e9@if34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 02:ac:xx:xx:b4:f6 brd ff:ff:ff:ff:ff:ff link-netnsid 1
其中 2: eth0 是本机的局域网 ip,docker 容器可以通过外网、2和3三个 ip 与宿主机通信,当然通过 3: docker0 是最优的选择。
检测通信情况并处理问题
- 检测 docker 与宿主机通信情况
小结
好像也很简单,就是 ping 一下,看通不通,通了之后 telnet 一下,如果不通,检查端口对应的应用是否启动,防火墙端口是否开启。此处遇到的小插曲就是,
- 发现阿里云的安全组端口的开关与 docker 和宿主机通信没关系
- docker 与宿主机通信受宿主机防火墙端口控制影响
- 关闭宿主机防火墙,docker 容器竟然不能访问外网