docker - Docker-compose 容器:如何别名端口?
问题描述
我在 Docker 中使用了 Adminer(来自标准图像)docker-compose
:
docker-compose.yml
:
version: '2'
services:
adminer:
image: adminer
restart: always
ports:
- '8080:8080'
/etc/hosts
(在主系统中):
172.19.0.6 adminer.ll
它工作得很好,当我输入adminer.ll:8080
浏览器时,我得到了Adminer。
然后我决定,我希望这个地址只adminer.ll
没有端口8080
(这意味着将暴露的端口从 更改8080
为80
)。
所以我改变了ports
参数:
version: '2'
services:
adminer:
image: adminer
restart: always
ports:
- '80:8080'
但它不起作用。当我adminer.ll
在浏览器中输入时,它无法连接。有趣的是,这adminer.ll:8080
仍然有效。
端口由管理员映像中8080
的指令公开。EXPOSE
但是为什么我的ports
参数不把它翻译成80
? 我错过了什么吗?
输出docker-compose ps
:
Name Command State Ports
-----------------------------------------------------------------------------------------
docker_adminer_1 entrypoint.sh docker-php-e ... Up 0.0.0.0:80->8080/tcp
看起来它正在侦听所有 IP 并将端口转换80
为端口8080
,但事实并非如此。
谢谢。
解决方案
@kfedorov91 的评论解决了这个问题:
为什么您的主机文件中有 172.19.0.6 adminer.ll 而不是 127.0.0.1 adminer.ll?你不是在本地运行 docker-compose 吗?
我只插入127.0.0.1 adminer.ll
和删除了以前的IP地址,当我去的时候adminer.ll
我可以看到Adminer。谢谢。
注意:看起来“翻译”端口(感谢ports
属性)正在“外部”网络上进行,因此仅当我使用 127.0.0.1 到达容器时才使用它。如果我使用容器的直接 IP,则不适用。
注意 2:我还通过他们的“直接 IP”(例如 172.19.0.x)将其他本地域路由到一些 docker 容器。它工作正常,因为他们使用隐式标准端口 80。如果我尝试将他们的路由更改为 127.0.0.1,我会看到 Adminer。我想这就是@Alkaline 在评论中指出的。
感谢你们。
推荐阅读
- linux - linux:在每个输出行的末尾打印字符串
- bash - Bash 脚本的行为出乎意料/奇怪
- node.js - 在生产环境中部署 Outlook Web 插件?
- javascript - Discord.js 关卡系统
- python-3.x - 如何尝试文件中的行是否与Python中其他文件中的行匹配
- android - Inside of Worker class call BroadcastReceiver class
- c# - 如何从另一个列表中的列表中获取总和作为带有 linq 的属性
- r - 有没有办法在不下载所有 HTML 的情况下运行 Rcrawler?
- javascript - 将属性映射到另一个属性中的对应值
- logstash - Logstash 中的 Foreach 消息