Docker中expose”和“publish”之間的區別

1.概述

在Docker中,了解容器化應用程序正在偵聽哪些端口非常重要。我們還需要一種從容器外部訪問應用程序的方法。

為了解決這些問題,Docker使我們能夠公開和發布端口。

在本文中,我們將學習有關公開和發布端口的知識。我們將以一個簡單的Nginx Web服務器容器為例。

2.暴露端口

公開的端口是有關容器化應用程序的一部分元數據。在大多數情況下,這顯示了應用程序正在偵聽的端口。 Docker本身對暴露的端口不做任何事情。但是,啟動容器時,可以在發布端口時使用此元數據。

2.1 Nginx暴露端口

讓我們使用Nginx Web服務器嘗試一下。

如果我們看一下Nginx官方Dockerfile ,我們會看到端口80通過以下命令公開:

EXPOSE 80

端口80在這裡公開,因為它是http協議的默認端口。讓我們在本地計算機上運行Nginx容器,看看是否可以通過端口80訪問它:

$ docker run -d nginx

上面的命令將使用Nginx的最新映像並運行容器。我們可以使用以下命令仔細檢查Nginx容器是否正在運行:

$ docker container ls

此命令將輸出有關所有正在運行的容器(包括Nginx)的一些信息:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

 cbc2f10f787f nginx "/docker-entrypoint..." 15 seconds ago Up 15 seconds 80/tcp dazzling_mclean

在這裡,我們在端口部分下看到80。由於80端口暴露出來,我們可能會認為,訪問localhost:80 (或只是localhost )將顯示Nginx的默認頁面,但事實並非如此:

$ curl http://localhost:8080

 ... no web page appears

儘管該端口是公開的,但Docker尚未將其打開到主機。

2.2 暴露端口的方式

在Docker中公開端口有兩種主要方法。我們可以使用EXPOSE命令Dockerfile

EXPOSE 8765

另外,我們也可以在運行容器時使用–expose :

$ docker run --expose 8765 nginx

3.發布端口

為了通過Docker主機訪問容器端口,我們需要發布它。

3.1 用Nginx發布

讓我們使用映射端口運行Nginx:

$ docker run -d -p 8080:80 nginx

上面的命令會將主機的端口8080映射到容器的端口80。該選項的一般語法為:

-p <hostport>:<container port>

如果我們轉到localhost:8080 ,我們應該獲得Nginx的默認歡迎頁面:

$ curl http://localhost:8080

 StatusCode : 200

 StatusDescription : OK

 Content : <!DOCTYPE html>

 <html>

 <head>

 <title>Welcome to nginx!</title>

 ... more HTML

讓我們列出所有正在運行的容器:

$ docker container ls

現在,我們應該看到容器具有端口映射:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

 38cfed3c61ea nginx "/docker-entrypoint..." 31 seconds ago Up 30 seconds 0.0.0.0:8080->80/tcp dazzling_kowalevski

ports部分下,我們有0.0.0.0:8080->80/tcp映射。

Docker默認情況下0.0.0.0不可路由的元地址.這意味著該映射對主機的所有地址/接口均有效。

3.2 限制容器訪問

我們可以根據主機IP地址來限制對容器的訪問。可以允許在映射中指定主機IP地址,而不是允許所有接口訪問容器( 0.0.0.0

讓我們將對容器的訪問限制為僅來自127.0.0.1環回地址:

$ docker run -d -p 127.0.0.1:8081:80 nginx

在這種情況下,只能從主機本身訪問該容器。這使用用於發布的擴展語法,其中包括地址綁定:

-p <binding address>:<hostport>:<container port>

4.發布所有公開的端口

公開的端口元數據對於啟動容器非常有用,因為Docker使我們能夠發布所有公開的端口:

$ docker run -d --publish-all nginx

在這裡,Docker將容器中所有公開的端口綁定到主機上的空閒隨機端口。

讓我們看一下此命令啟動的容器:

$ docker container ls



 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

 0a23e78732ce nginx "/docker-entrypoint..." 6 minutes ago Up 6 minutes 0.0.0.0:32768->80/tcp pedantic_curran

正如我們預期的那樣,Docker從主機中選擇了一個隨機端口(在本例中為32768),並將其映射到暴露的端口.

5.結論

在本文中,我們學習了有關在Docker中公開和發布端口的信息。

我們還討論了公開的端口是有關容器化應用程序的元數據,而發布端口是從主機訪問應用程序的一種方式。