Docker 容器不能通过 localhost 访问,但可以通过 127.0.0.1 访问

Jer*_*eon 5 networking ipv4 ipv6 docker docker-swarm

问题

我有一个 Docker 服务容器暴露于*:8080.

  • 我无法通过localhost:8080. Chrome /curl无限期挂断。
  • 但是如果我使用任何其他本地IP,我就可以访问容器,例如 127.0.0.1

这让我很困惑,因为在我的hosts文件中,localhost重定向到127.0.0.1.

为什么会这样?它是否以某种方式与 IPv4/IPv6 双栈相关?

环境

我在 PopOS(基于 Ubuntu)上,启用了 Docker Swarm。我正在使用这个测试堆栈文件,traefik.docker-compose.yml

version: '3'
services:
  reverse-proxy:
    image: traefik # The official Traefik docker image
    command: --api --docker # Enables the web UI and tells Traefik to listen to docker
    ports:
      - "80:80"     # The HTTP port
      - "8080:8080" # The Web UI (enabled by --api)
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock # So that Traefik can listen to the Docker events
Run Code Online (Sandbox Code Playgroud)

要运行堆栈,我使用:

docker stack deploy -c traefik.docker-compose.yml traefik
Run Code Online (Sandbox Code Playgroud)

服务启动后,我确认它正在8080通过两种方式收听:

  1. docker service ls
ID                  NAME                    MODE                REPLICAS            IMAGE               PORTS
4ejfsvenij3p        traefik_reverse-proxy   replicated          1/1                 traefik:latest      *:80->80/tcp, *:8080->8080/tcp
Run Code Online (Sandbox Code Playgroud)
  1. sudo ss -pnlt | grep 8080
LISTEN   3         128                       *:8080                   *:*        users:(("dockerd",pid=2119,fd=45))
Run Code Online (Sandbox Code Playgroud)

作为参考,这里是我的内容/etc/hosts

127.0.0.1   localhost
::1     localhost ipv6-localhost
127.0.1.1   pop-os.localdomain  pop-os pop1810x220
Run Code Online (Sandbox Code Playgroud)

我只curl用于测试:

  • 作品: curl http://127.0.0.1:8080
  • 挂了: curl http://localhost:8080

小智 0

尝试在正在运行的容器中编辑 /etc/hosts 以删除第二个“localhost”引用,该引用位于第二行,并在“::1”后面跟随几个空格,以便它显示:

::1 ipv6-本地主机