我正在实施一些通过docker-compose.yml启动Docker容器的测试。在CI上,有时会使用docker-compose.yml中定义的端口,这会导致测试失败。
因此,我有两个问题:
是否可以在docker-compose中完全动态分配端口转发?
docker-compose cli中是否可以确定特定服务使用的端口?
在我看来,这将是最漂亮的解决方案-否则,我将需要尝试使用环境变量等。
答案 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