docker 與外網及宿主機以前的網絡互通

系統、工具版本

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

簡要版

  1. 結論nginx

    docker 能夠 ping 通宿主機局域網 ip,但端口通訊須要開防火牆開端口號,此處和阿里雲的安全組不同,本人在阿里雲安全組開啓 8080 端口後,能夠外網通 8080 端口,但 docker 不通,當防火牆(本人用的 firewall )關閉,或打開 8080 端口時,docker 才能與該端口通訊。docker

  2. 小插曲tomcat

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

過程版

  1. 發現問題服務器

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

  2. 解決過程oop

    很顯然是 nginx 容器與宿主機的通信問題,而不是 tomcat 容器,因此如下操做在 nginx 容器下進行ui

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

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

        問:爲何不像好多博客用 sodu 呢?答:由於當前就是 root 用戶code

      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 容器居然不能訪問外網
相關文章
相關標籤/搜索