天天看點

docker ip位址_Docker 概念很難了解?一文搞定 Docker 端口綁定還有一件事

docker ip位址_Docker 概念很難了解?一文搞定 Docker 端口綁定還有一件事

作者 | Dieter Jordens

譯者 | 蘇本如,責編 | 夕顔

出品 | CSDN(ID:CSDNnews)

以下為譯文:

作為初級開發人員的你,是不是參加過這樣的面試,在面試中面試官希望你準确地回答Docker的工作原理?現今的面試官們希望應聘者能夠深入了解8項、10項、甚至更多的技術。其實這有點瘋狂。在大學或其他學校裡,他們很可能根本不會教你任何關于Docker的知識。然而,如果你真的能夠深入了解Docker,那麼你就可以從一大群應聘者中脫穎而出。

當你開始使用Docker時,首先會遇到的問題之一是你無法連接配接到Docker容器。這篇文章将詳細解釋這個問題為什麼會發生,同時我也會解釋端口綁定(port binding)是如何工作的。

即使你是一個經驗豐富的開發人員,你也應該了解什麼是端口綁定。否則,你在面試時會顯得很傻。如果你還沒有了解,那麼現在就給自己拿杯咖啡。我一定會讓你把你想知道的關于這個話題的一切内容都記在你的腦子裡,隻需要花費你六分鐘!

docker ip位址_Docker 概念很難了解?一文搞定 Docker 端口綁定還有一件事

讓我們從一個Nginx Docker容器開始吧!

如果你對Docker有一點點了解的話,你就無需擔心了。因為我會盡量詳細地解釋關于Docker的一切。首先,我需要確定你了解Docker容器和Docker鏡像之間的差別。

你可以把Docker鏡像看作一個檔案,它包含了運作一個特定程式的所有依賴項和配置。為什麼要這樣做?因為Docker想要解決的首個問題就是系統/程式安裝的噩夢。

我們都經曆過在Windows、Mac或Linux系統上安裝程式的情況。然而令人沮喪的是,系統每次都會提示你缺少另一個程式。就像下面系統提示你要不要安裝的那樣,我猜你每次遇到這個問題都會選擇安裝,對吧?

你也要安裝這個程式嗎?…

最終你會發現,你不但需要安裝很多不同的程式,而且經常還需要配置系統變量等等。在最壞的情況下,這些會把你的系統弄得一團糟。

你一定不希望你組織裡的每個人都經曆這種麻煩,對嗎?

Docker鏡像可以幫助你解決這個麻煩,因為一個Docker鏡像裡包含了安裝程式所需的所有内容。而Docker容器則是Docker鏡像的運作執行個體。

Docker為你解決了安裝的噩夢。而Docker容器包含了它運作時所需要的一切,不多也不少。你可以在Windows、Linux或Mac上運作一個Docker容器。基本上,隻要你将Docker安裝好,你就可以在任何地方運作它。

關于Docker的優勢已經講得夠多了。接下來,我們要做的是讓一個Docker容器開始運作起來。

讓我們從一個Nginx Docker容器開始。Nginx是一個運作在端口80上的web伺服器。下面,我将使用Nginx Docker鏡像以分離模式(背景運作)啟動一個Docker容器,指令如下:

docker container run -d nginx
           

這個指令将會生成一個新的Docker容器,你會看到這個新的Docker容器的UUID。如果你不知道UUID是什麼,那麼請認真閱讀我寫的這篇文章中的所有内容。使用Docker容器的ps指令(docker ps),你将看到這個Docker容器處于活躍狀态:

docker ip位址_Docker 概念很難了解?一文搞定 Docker 端口綁定還有一件事

現在,如果你試圖使用curl指令或使用一個浏覽器直接連接配接到這個Docker容器,你會遇到連接配接失敗的錯誤(見下面)。因為你不能直接連接配接到一個Docker容器,原因是什麼呢?Docker的文檔隻是解釋說端口80易受攻擊…這個解釋有點不明不白。但是别擔心,我會在下一節詳細給出解釋!

curl -I 127.0.0.1:80              curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused
           

為什麼我不能直接連接配接到一個Docker容器?

事實上,Docker容器可以在不作任何配置的情況下連接配接到外部世界。這一點太好了,因為這樣我們就不必改變我們以前程式設計過的任何東西。

但是預設地,外部世界無法直接連接配接到一個Docker容器。

說到這裡,我想你應該明白了,這一點和我們預想的不同。那麼你應該如何連接配接到你的Docker容器呢?好吧,有多種選擇。讓我們探索一下。

1. 公開Docker的所有端口

docker container run -P -d nginx
           

這裡的-P指令打開容器公開的每個端口。Docker會辨別在Dockerfile中公開的每個端口,以及使用帶有--expose 參數的Docker container build指令公開的每個端口。每個公開的端口都直接綁定在主機的一個“随機”端口上。

聽起來不錯,但是我們現在該怎麼找到這些端口呢?别擔心,我們會找到你心愛的端口的,甚至有多種方法可以幫助找到它們。接下來我将向你展示兩種不同的方法:

  • Docker container port
  • netstat

我們的第一個選擇是使用上面的Docker指令(docker container port)。你隻需要鍵入上面的指令和容器UUID。你就會看到Docker容器的端口80綁定到了IP位址為0.0.0.0的主機端口32768上(如果你自己嘗試執行該指令,則會看到一個不同的端口)。

docker container port *insert container_uuid*              80/tcp -> 0.0.0.0:32768
           

我們的另一個選擇是使用netstat指令。要查找所有打開的端口,你可以執行以下指令。注意,Docker公開的端口混雜在其他端口中間,本例中第三行的那個端口就是我們要找的。

netstat -ntlp
           
docker ip位址_Docker 概念很難了解?一文搞定 Docker 端口綁定還有一件事

使用netstat指令找到的所有打開的端口。

2. 公開一個特定端口

docker ip位址_Docker 概念很難了解?一文搞定 Docker 端口綁定還有一件事

端口綁定示例:将Docker容器的80端口綁定到主機的8080端口上。

公開所有Docker端口通常不是一個好主意,預設情況是根本不公開任何端口,這是為了安全起見。你不想公開一切,因為這樣做根本沒有任何好處,對吧?

如果你隻想公開一個端口,請執行以下指令:

docker container run -p 8080:80 -d nginx
           

這個指令使得Nginx容器的80端口通過主機端口8080對外公開。現在,我們就可以通過多種方式連接配接到容器。例如,使用curl指令或通過一個浏覽器。這是不是太棒了!

恭喜你,現在你終于明白了Docker端口綁定最重要的部分了!下面我将向你展示curl指令執行的結果:

curl -I 0.0.0.0:8080HTTP/1.1 200 OK              Server: nginx/1.17.9              Date: Sun, 08 Mar 2020 11:38:47 GMT              Content-Type: text/html              Content-Length: 612              Last-Modified: Tue, 03 Mar 2020 14:32:47 GMT              Connection: keep-alive              ETag: "5e5e6a8f-264"              Accept-Ranges: bytes
           

如果你在浏覽器中通路這個位址:0.0.0.0:8080,那麼你的浏覽器會向你展示如下的内容:

docker ip位址_Docker 概念很難了解?一文搞定 Docker 端口綁定還有一件事

通過浏覽器連接配接到0.0.0.0:8080的情況。

還有一件事

預設情況下,Docker會将容器端口公開到IP位址0.0.0.0(這個位址和系統上的任何IP都比對)上。你也可以告訴Docker要綁定哪個IP,這個IP可以是127.0.0.1,也可以是其他IP位址。

如果你想将Docker容器的80端口綁定到主機系統端口8000和IP位址127.0.0.1(也稱為本地主機)上,你隻需運作以下指令:

docker run -d -p 127.0.0.1:8000:80 nginx
           
docker ip位址_Docker 概念很難了解?一文搞定 Docker 端口綁定還有一件事

結束語

對于使用Docker容器來說,Docker的端口綁定是一個很重要的概念。一開始可能因為需要配置傳入連接配接(incoming connection)的問題,會讓人困惑。但是Docker在提供所有需要的文檔方面做得很出色。

不過,作為開發者,有些Docker的概念比其他概念更難了解。希望讀完這篇文章後,你對Docker端口綁定已經很清楚了。如果沒有,請在下面留言!

原文連結:

https://medium.com/better-programming/how-does-docker-port-binding-work-b089f23ca4c8

本文為CSDN翻譯文章,轉載請注明出處。