docker-compose动态端口分配并检索端口

时间:2018-11-06 10:28:17

标签: docker docker-compose

我正在实施一些通过docker-compose.yml启动Docker容器的测试。在CI上,有时会使用docker-compose.yml中定义的端口,这会导致测试失败。

因此,我有两个问题:

  1. 是否可以在docker-compose中完全动态分配端口转发?

  2. docker-compose cli中是否可以确定特定服务使用的端口?

在我看来,这将是最漂亮的解决方案-否则,我将需要尝试使用环境变量等。

1 个答案:

答案 0 :(得分:1)

我认为您的第一个问题的答案是肯定的。在回答第一个问题后,我将解决第二个问题。我假设当您问端口转发时,您指的是Docker端口发布,以便将内部端口转发到主机可访问的端口?如果是这样,此答案应该可以为您提供所需的信息。我将使用Apache Tomcat映像演示其工作原理。我将从Docker run开始,但还将显示docker-compose等效项。

在终端上,使用动态发布的端口启动Tomcat:

foo@bar:~$ docker run -dit -p 8080 --name tc01 tomcat:8-slim

请注意,-p参数仅指定了Tomcat内部端口。

列出动态分配给该容器的端口:

foo@bar:~$ docker port tc01
8080/tcp -> 0.0.0.0:32773

在这种情况下,端口32773是动态发布的端口,因此从主机上,我可以浏览到http://localhost:32773以显示Apache Tomcat主页。

如果在第一个容器(名为tc01)运行时创建另一个名为Tomcat的容器tc02,运行Tomcat:

foo@bar:~$ docker run -dit -p 8080 --name tc02 tomcat:8-slim

另一个端口将被动态分配:

foo@bar:~$ docker port tc02
8080/tcp -> 0.0.0.0:32774

在这种情况下,访问http://localhost:32774将显示Apache Tomcat主页。

要在docker-compose中做类似的事情,这是一个简单的docker-compose.yml,它将为容器tc03动态分配端口:

version: '3.7'

services:
  tomcat:
    image: tomcat:8-slim

    ports:
      - "8080"

    container_name: tc03 

使用docker-compose创建容器:

foo@bar:~$ docker-compose up -d

另一个端口将被动态分配:

foo@bar:~$ docker port tc03
8080/tcp -> 0.0.0.0:32775

在这种情况下,访问http://localhost:32775将显示Apache Tomcat主页。

要回答您的第二个问题,我认为您可以使用docker port,如图所示。因此,如果您在docker-compose中命名容器,则可以返回示例中显示的端口值。

如果您已经按照我概述的方式创建了这些容器,则可以这样删除它们:

foo@bar:~$ docker rm -f tc01 tc02 tc03