docker 與外網及宿主機之前的網路互通
阿新 • • 發佈:2019-06-15
系統、工具版本
- 伺服器:阿里雲ECS(非廣告,受它影響)
- Linux: CentOS Linux release 7.6.1810 (Core)
- docker: Docker version 18.09.6, build 481bc77156
簡要版
-
結論
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 容器竟然不能訪問外