1. 程式人生 > >docker 與外網及宿主機之前的網路互通

docker 與外網及宿主機之前的網路互通

系統、工具版本

  • 伺服器:阿里雲ECS(非廣告,受它影響)
  • Linux: CentOS Linux release 7.6.1810 (Core)
  • docker: Docker version 18.09.6, build 481bc77156

簡要版

  1. 結論

    docker 可以 ping 通宿主機區域網 ip,但埠通訊需要開防火牆開埠號,此處和阿里雲的安全組不一樣,本人在阿里雲安全組開啟 8080 埠後,可以外網通 8080 埠,但 docker 不通,當防火牆(本人用的 firewall )關閉,或開啟 8080 埠時,docker 才能與該埠通訊。

  2. 小插曲

    docker 可以與宿主機指定埠號通訊後,卻不能通外網了。結論是firewall關閉時,docker 不能訪問外網,於是啟動 firewall,並開放指定埠,來實現預期的效果。關閉阿里雲安全組該埠,並不影響 docker 與宿主機該埠通訊。

過程版

  1. 發現問題

    新規劃,計劃儘可能用 docker 部署,兩個容器,一個 nginx,一個 tomcat。nginx 啟動後,外網可以成功訪問;tomcat 啟動後,localhost可以訪問,但 nginx 轉發失敗。

  2. 解決過程

    很顯然是 nginx 容器與宿主機的通訊問題,而不是 tomcat 容器,所以以下操作在 nginx 容器下進行

    1. 檢測 docker 與宿主機通訊情況
      1. 給 docker 安裝 ping 和 telnet 命令

         # apt-get update
         # apt-get iputils-ping
         # apt-get telnet
        

        問:為什麼不像好多部落格用 sodu 呢?答:因為當前就是 root 使用者

      2. 檢視宿主機 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 是最優的選擇。

      3. 檢測通訊情況並處理問題

  3. 小結

    好像也很簡單,就是 ping 一下,看通不通,通了之後 telnet 一下,如果不通,檢查埠對應的應用是否啟動,防火牆埠是否開啟。此處遇到的小插曲就是,

    1. 發現阿里雲的安全組埠的開關與 docker 和宿主機通訊沒關係
    2. docker 與宿主機通訊受宿主機防火牆埠控制影響
    3. 關閉宿主機防火牆,docker 容器竟然不能訪問外