我有一个问题,或者最好说两个。两者都取决于Docker,并且与对Docker如何处理容器主机名和端口的理解有关。
假设我有两个服务在不同的docker容器中运行,并且将端口80从容器暴露给端口8081(service1)和端口8082(service2):
服务1:8081:80 service2:8082:80
现在我很清楚,从主机角度来看,我可以使用暴露的端口(http://localhost:8081和http://localhost:8082)访问这些服务。但是,如果我想使用http://container1和http://container2之类的容器来访问我的服务怎么办?要实现此szenario含义,我必须要做的事情:
感谢帮助!
答案 0 :(得分:0)
正如伊贾兹·艾哈迈德·汗(Ijaz Ahmad Khan)所说。您必须使用该网络内的另一个容器作为代理,例如nginx。
如果您要将docker-compose
的端口公开到主机(您的PC),则只有您所提到的带有特定端口的localhost域可见。如果您像这样运行docker-compose.yml
:
version: "3"
services:
service1:
image: something
name: service1_name
ports:
- "8081:80"
service2:
image: something
name: service2_name
ports:
- "8082:80"
Docker-compose将在后缀为docker-compose.yml
的女巫_default
中创建由文件夹命名的默认网络。在此网络中,所有容器都可以看到对方。 expose
命令用于此网络内的容器(以便他们可以互相看到并进行通信),port
用于发布到主机(您的PC)。
这意味着:
service1在您的计算机上显示为http://localhost:8081
,对于网络中的其他容器,显示为service1:80
。
service2在您的计算机上显示为http://localhost:8082
,对于网络中的其他容器,显示为service2:80
。
请确保指定的容器名称对服务网络地址没有影响。要测试容器仅在网络内部可见,请尝试从另一个容器ping
docker run --rm --network=your_folder_name_default debian ping service1
要检查容器在哪个网络中运行,可以使用inspect
docker inspect service1_name
现在您必须使用容器名称