【问题标题】:How to access a port that is already used by another Docker container如何访问已被另一个 Docker 容器使用的端口
【发布时间】:2019-06-11 10:56:37
【问题描述】:

我在一个 Docker 容器上运行 Tomcat 服务器。在另一个 docker 容器上,我希望能够访问该 Tomcat 服务器。所以,我要做的是使用 -p 选项将该端口映射到运行 Tomcat 服务器的 Docker 容器映射的端口。

简而言之,我有一个 Tomcat 容器,它是使用类似的东西运行的。

docker run ... -p X:8080 ...

还有像这样的其他 docker 容器

docker run ... -p X:X ...

但是,如果我尝试这样做,我会收到“端口已分配”错误。我该如何解决这个问题?

【问题讨论】:

  • 您可以使用相同的端口号(例如8080)拥有任意数量的容器,因为容器在它们的网络命名空间中运行并且没有冲突。但是,当您使用-p [host_port:container_port] 将此端口绑定/发布到host 端口时,您只能使用特定主机端口一次。
  • 我知道,我说的是容器端口映射到的主机上的端口。就像上面例子中的 X。
  • 是的,X 这里是host 端口。你不能重复使用同一个号码。
  • 另外,通过使用docker run ... 命令,您的容器会附加到不提供容器间DNS 的默认桥接网络。让 2 个容器通信的最简单方法是创建一个 user-defined bridge,然后您就可以在容器内部直接使用它们的名称,例如 container_A:8080container_B:8080
  • 这是一个巧妙的解决方案!

标签: docker networking


【解决方案1】:

当您添加 -p X:Y 时,您将 Y 端口从容器映射到主机中的 X 端口,并使其可在主机中访问。

假设您的 tomcat 容器在 8080:8080 上运行

现在你有另一个容器正在运行

您可以通过内部 IP 访问第二个容器内的 tomcat 容器。

如果两个容器都在默认网络上。

类似172.0.0.2:8080

你可以通过这个为容器分配内部IP

docker network inspect bridge

docker container inspect $id

其中 id 是容器 ID

【讨论】:

  • 永远不要通过docker inspect 找到容器的 Docker 内部 IP 地址。每当删除和重新创建容器时,该地址都会发生变化,它无法从其他主机访问,并且在某些平台上,它无法从同一主机上的外部 Docker 访问。
  • 是的,当我们以不同的顺序重新创建甚至启动停止的容器时,内部 IP 将发生变化。但只要容器启动并运行,IP 将保持不变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-23
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多