无法通过localhost访问Docker容器,但可以通过127.0.0.1访问

时间:2019-02-25 00:24:32

标签: docker networking ipv6 docker-swarm ipv4

问题

我有一个暴露给*:8080的Docker服务容器。

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

这让我不寒而栗,因为在我的hosts文件中,localhost重定向到127.0.0.1

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

环境

我正在使用启用了Docker Swarm的PopOS(基于Ubuntu)。 我正在使用此测试堆栈文件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

要运行堆栈,我使用:

docker stack deploy -c traefik.docker-compose.yml traefik

服务启动后,我确认它正在通过两种方式监听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
  1. sudo ss -pnlt | grep 8080
LISTEN   3         128                       *:8080                   *:*        users:(("dockerd",pid=2119,fd=45))

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

127.0.0.1   localhost
::1     localhost ipv6-localhost
127.0.1.1   pop-os.localdomain  pop-os pop1810x220

我只使用curl进行测试:

  • 作品:curl http://127.0.0.1:8080
  • 挂断电话:curl http://localhost:8080

1 个答案:

答案 0 :(得分:0)

尝试在正在运行的容器中编辑/ etc / hosts,以删除第二行的“ localhost”引用,该引用位于第二行,并在“ :: 1”之后跟随一些空格,以便读取:

:: 1 ipv6-localhost