代码之家  ›  专栏  ›  技术社区  ›  smeeb

主机网络模式的Docker端口映射失败

  •  2
  • smeeb  · 技术社区  · 8 年前

    Mac在此处运行Docker版本17.12.0-ce-mac55(23011)。

    我和Docker的情况很奇怪,我绝对无法解释!

    • 我有一个停靠的web服务,它在Docker之外运行得非常好,运行于9200端口(因此: http://localhost:9200 )
    • 我还可以在本地运行其他几个映像(nginx、Oracle DB),并可以通过 localhost:80 和 localhost:1521 分别地
    • 当我运行停靠服务的容器时,我看到(通过 docker logs <containerId> )服务启动时没有任何错误
    • 尽管容器运行时没有任何错误,但我绝对无法通过从Mac主机连接到它 localhost:9200

    复制的确切步骤是:

    1. Clone this repo
    2. 通过以下方式构建图像 ./gradlew clean build && docker build -t locationservice .
    3. 通过运行容器 docker run -it -p 9200:9200 -d --net="host" --name locationservice locationservice
    4. 如果您使用 docker ps 获取 <containerId> ,然后你可以继续击球 docker日志(<集装箱运输> 直到您看到它已无错误启动
    5. 在我的机器上,当我试图卷曲 本地主机:9200 ,我得到“ 连接被拒绝 “错误(见下文)

    卷曲误差为:

    curl -X GET http://localhost:9200/bupo
    curl: (7) Failed to connect to localhost port 9200: Connection refused
    

    有些事情我已经排除了:

    • localhost 完全可以从主机解析,因为我们正在运行 host 网络模式和我连接到nginx(端口80)和Oracle(端口1521)容器没有问题
    • 应用程序正在启动,如果你查看日志,你会看到它正在9200上启动

    有什么问题吗?!

    2 回复  |  直到 8 年前
        1
  •  2
  •   Matt slashingweapon    8 年前

    Docker for Mac在VM中运行。 --net=host 指的是Linux VM主机网络堆栈,而不是OSX。从OSX到Docker VM的直接网络路径只有映射端口。

    映射的端口( docker run -p Y:N )在Docker for Mac中除了用户 space proxy that runs on the Docker host 通常,Docker for Mac还会在OSX上启动一个用户空间代理,监听同一端口并将连接转发到VM。使用时未启动OSX进程 --net=主机 (当然,Linux也不是)。

    → docker run --name nc --rm --net=host -dp 9200:9200 busybox nc -lk -p 9201 -e echo hey
    → docker inspect nc --format '{{ json .NetworkSettings.Ports }}'
    {}  
    → sudo lsof -Pni | grep 9200
    → 
    

    然后没有 --net=主机

    → docker run --name nc --rm -dp 9200:9200 busybox nc -lk -p 9201 -e echo hey
    → docker inspect nc --format '{{ json .NetworkSettings.Ports }}'
    {"9200/tcp":[{"HostIp":"0.0.0.0","HostPort":"9200"}]}
    → sudo lsof -Pni | grep 9200
    vpnkit    42658           matt   28u  IPv4 0x57f79853269b81bf      0t0  TCP *:9200 (LISTEN)
    vpnkit    42658           matt   29u  IPv6 0x57f798532765ca9f      0t0  TCP [::1]:9200 (LISTEN)
    

    如果您的应用程序需要 --net=主机 然后,我将使用Vagrant/Virtualbox来启动具有“仅主机”适配器的VM。这意味着您可以从VM上的OSX访问直接网络路径。这是 Vagrantfile 我使用。

        2
  •  1
  •   Lauri    8 年前

    Docker for Mac不太支持主机网络模式: https://github.com/docker/for-mac/issues/1031

    因此,目前的解决方案是使用默认桥接模式。