Docker中expose”和“publish”之間的區別
- Docker
- Nginx
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中公開和發布端口的信息。
我們還討論了公開的端口是有關容器化應用程序的元數據,而發布端口是從主機訪問應用程序的一種方式。