我已经在Docker中使用了Adminer(来自标准image)和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由Adminer镜像中的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,并将port 80转换为port 8080,但事实并非如此。

谢谢。

最佳答案

@ kfedorov91的评论解决了这个问题:



我只插入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在评论中指出的内容。

感谢你们。

10-07 15:30