以阿里雲服務器爲例理解docker端口映射

  • 問題描述

    docker自身是有一個網絡系統的,對於一個運行在docker內的程序的某個端口(比如training/webapp這個鏡像下的flask的5000端口)。如果要進行訪問,詳細的過程是:

    1. 訪問服務器的ip:port
    2. 公網ip:port --> docker的ip:port
    3. 通過docker的ip:port連接到某個api服務

    總共有三層邏輯:服務器層、容器層、應用層。

    最終計算請求數據的是容器內的應用,但是這個應用的端口是無法在公網上查看的,這就需要使用docker的端口映射功能。

  • 端口映射

    docker默認是不對外開放端口的。

    默認情況下,容器可以主動訪問到外部網絡的連接,但是外部網絡無法訪問到容器。

    所以如果在容器內運行網絡應用和服務是無法提供給外界使用的,端口映射功能可以實現公網上訪問容器內部的網絡應用。

    -p	可以指定要映射的端口,並且在一個指定端口上只可以綁定一個容器
    -P	隨機映射一個主機端口(這個是隨機的)到容器內部開放的網絡端口(這個端口是程序設定的)
    

    “映射”這個概念,是從外向內;是指將外網中訪問的port映射到容器內部的port上。

    支持格式:

       # 綁定宿主機IP及端口,服務器主機上可能有多快網卡
      ip:hostPort:containerPort
      # 綁定宿主機IP
      ip::containerPort
      # 綁定宿主機端口
      hostPort:containerPort
    
  • 案例

    阿里雲ubuntu16.04系統上運行菜鳥教程中給出的training/webapp案例。

  • docker run -P

    docker run -d -P training/webapp python app.py
    

    通過docker -ps查看,PORTS0.0.0.0:32769->5000/tcp

    這個端口信息的意思是:

    • 外界所有ip地址(0.0.0.0)
    • 都可以訪問本服務器的32769端口(本服務器公網47.240.xx.xx),即訪問47.240.xx.xx:32769
    • 就相當於訪問training/webapp容器中的app.py程序所開放的5000端口
  • docker run -p

    runoob@runoob:~$ docker run -d -p 80:5000 training/webapp python app.py
    

    但是阿里雲服務器有防火牆,默認只開放了2280443三個端口。

    因此-P默認映射的32769端口是無效的,用-p將容器內5000端口映射爲主機服務器上的80端口方可有效。

    當然,開放服務器的32769也是一個道理。

    此時訪問47.240.xx.xx:80就可以得到 Hello world!
    -p 可以多次使用指定多個端口映射

    docker run -p 80:5000 -p 443:5100 training/webapp python app.py
    

    Docker進行端口綁定時,默認會綁定TCP端口。還可以使用udp標記來綁定udp端口:

    sudo docker run -d --name experss-app -p 3000:3000/udp itbilu/express-app
    
  • docker port id/name

    >>> docker port container_id
    # or
    >>> docker port container_name
    5000/tcp -> 0.0.0.0:80
    

    查看指定容器的端口映射。

  • References

  1. docker端口映射
  2. Docker 從入門到實踐
  3. 菜鳥教程
  4. Docker 網絡-端口映射、容器鏈接、Networking
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章