gpt4 book ai didi

macos - 主机网络模式下Docker端口映射失败

转载 作者:行者123 更新时间:2023-12-02 18:53:46 24 4
gpt4 key购买 nike

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

我对Docker有一个非常奇怪的情况,我绝对无法解释!

  • 我有一个Dockerized Web服务,该服务在Docker外部运行得很好,在端口9200上运行(因此:http://localhost:9200)
  • 我还可以在本地运行其他几个镜像(nginx,Oracle DB),并且可以分别通过localhost:80localhost:1521来访问它们
  • 当我为Dockerized服务运行容器时,我(通过docker logs <containerId>)看到服务启动,没有任何错误
  • 尽管容器正在运行,没有任何错误,但我绝对无法通过localhost:9200从我的Mac主机连接到它

  • 重现的确切步骤是:
  • Clone this repo
  • 通过./gradlew clean build && docker build -t locationservice .生成图像
  • 通过docker run -it -p 9200:9200 -d --net="host" --name locationservice locationservice来运行容器
  • 如果您使用docker ps获取<containerId>,则可以继续打docker logs <containerId>,直到看到它已启动且没有错误
  • 在我的计算机上,当我尝试对localhost:9200进行 curl 时,出现“连接被拒绝”错误(请参见下文)

  • curl 错误是:
    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
  • 上监听

    任何想法可能是什么问题?

    最佳答案

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

    Docker for Mac中的映射端口(docker run -p Y:N)有点特殊,除了通常的用户space proxy that runs on the Docker host外,Docker for Mac还在OSX上启动了一个用户空间代理,以侦听相同的端口并将连接转发到VM。使用--net=host时,不会启动OSX进程(当然,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=host
    → 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=host,那么我将使用Vagrant / Virtualbox来启动具有“仅主机”适配器的VM。这意味着您可以从VM上的OSX访问直接网络路径。这是我使用的 Vagrantfile

    关于macos - 主机网络模式下Docker端口映射失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49421821/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com