- 服务器:阿里云ECS(非广告,受它影响)
- Linux: CentOS Linux release 7.6.1810 (Core)
- docker: Docker version 18.09.6, build 481bc77156
结论nginx
docker 能够 ping 通宿主机局域网 ip,但端口通讯须要开防火墙开端口号,此处和阿里云的安全组不同,本人在阿里云安全组开启 8080 端口后,能够外网通 8080 端口,但 docker 不通,当防火墙(本人用的 firewall )关闭,或打开 8080 端口时,docker 才能与该端口通讯。docker
小插曲tomcat
docker 能够与宿主机指定端口号通讯后,却不能通外网了。结论是firewall关闭时,docker 不能访问外网,因而启动 firewall,并开放指定端口,来实现预期的效果。关闭阿里云安全组该端口,并不影响 docker 与宿主机该端口通讯。安全
发现问题服务器
新规划,计划尽量用 docker 部署,两个容器,一个 nginx,一个 tomcat。nginx 启动后,外网能够成功访问;tomcat 启动后,localhost能够访问,但 nginx 转发失败。工具
解决过程oop
很显然是 nginx 容器与宿主机的通信问题,而不是 tomcat 容器,因此如下操做在 nginx 容器下进行ui
给 docker 安装 ping 和 telnet 命令阿里云
# apt-get update # apt-get iputils-ping # apt-get telnet
问:为何不像好多博客用 sodu 呢?答:由于当前就是 root 用户code
查看宿主机 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 是最优的选择。
检测通讯状况并处理问题
小结
好像也很简单,就是 ping 一下,看通不通,通了以后 telnet 一下,若是不通,检查端口对应的应用是否启动,防火墙端口是否开启。此处遇到的小插曲就是,