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中公开和发布端口的信息。
我们还讨论了公开的端口是有关容器化应用程序的元数据,而发布端口是从主机访问应用程序的一种方式。
0 评论