【问题标题】:How to map the IP address of docker container to another container dynamically如何将docker容器的IP地址动态映射到另一个容器
【发布时间】:2016-11-17 18:13:28
【问题描述】:

我在主机中运行的 docker 容器很少。我有一个场景,我需要将一个容器的 IP 地址映射到另一个容器中可用的配置文件。我知道我可以使用 docker inspect [container] 命令获取容器的 IP 地址。我假设每次重新启动容器时都会动态分配 IP 地址。所以每次我需要在另一个容器中更改这个 IP 地址。是否可以为容器提供静态 IP,或者我可以使用主机的 IP 地址而不是容器的 IP 地址。我是码头工人世界的新手。

还有一个案例,我需要将 IP 地址映射到在另一台主机上运行的容器。例如,我有一个在 HostA 中运行的 redis 容器和在 HostB 中运行的 tomcat 容器。为了从tomcat与redis通信,我需要在tomcat容器中映射redis的ip地址和端口。如何在 docker 中实现这一点?

【问题讨论】:

  • 您几乎可以肯定不需要实际的 IP 地址,这是一种可怕的链接方式。使用容器链接——它被烘焙了。
  • 我在 tomcat 容器中有一个属性文件,我必须在其中提供 redis 的 IP 地址。 tomcat 在启动时会读取这个属性并连接到 redis。那么链接将如何解决这个问题呢?使用别名链接容器是否意味着容器的主机名?
  • @Jugi 是的,它是主机名(或我在回答中所说的别名),您可以检查 /etc/hosts - here is example - 类似于 localhost 作为 127.0.0.1 的别名。在您的情况下,tomcat /etc/hosts 将具有redis 的 IP 地址。比如:172.17.0.5 redis
  • @VladoDemcak。非常感谢..

标签: tomcat docker docker-compose dockerfile docker-machine


【解决方案1】:

更新: 带有--link 参数的链接容器被标记为旧版enter link description here

警告:--link 标志是 Docker 的遗留功能。它可能 最终被删除。除非你绝对需要继续使用 它,我们建议您使用用户定义的网络来方便 两个容器之间的通信,而不是使用 --link。一 用户定义的网络不支持的功能,您可以使用 --link 在容器之间共享环境变量。但是,您可以使用其他机制(例如卷)来共享环境 以更可控的方式在容器之间进行变量。

您需要 docker 网络。下面的例子来自官方文档,但这里只有几行:

首先创建 docker 网络,例如:

docker network create --driver 桥接你 现在您可以像文档中那样运行容器 - 在用户定义的网络中链接容器:

docker run --network=your_netowrk -itd --name=container4 --link container5:c5 image
docker run --network=your_netowrk -itd --name=container5 --link container4:c4 image

原答案:

您可以像文档中一样运行 链接 容器 - Linking containers:

docker run -itd --name=container4 --link container5:c5 image
docker run -itd --name=container5 --link container4:c4 image

并 ping 第二个容器别名 (c5):

docker attach container4

/ # ping -w 4 c5
PING c5 (172.25.0.5): 56 data bytes
64 bytes from 172.25.0.5: seq=0 ttl=64 time=0.070 ms

因此您可以看到可以 使用别名 - 而不是使用 IP 地址 ping 第二个容器。

致你的第二个问题:如果你有 redis 和 tomcat 并且它们知道彼此的 IP 地址(并​​且它们是可访问的,因为它们在某个网络中),那么这是可能的,所以这几乎都是关于网络的配置。

【讨论】:

  • 天哪,我不确定您是否需要自定义网络才能将 2 个容器链接在一起。谷歌 docker 容器链接。它是内置的。
  • @user2105103 谢谢,你说得对,我不知道它是内置的,对于 2 个容器,创建自定义网络是“无用的”。
  • 链接被标记为旧版 -> 使用用户定义的网络恢复答案
【解决方案2】:

正如 Vlado 指出的那样,您应该通过主机名访问您的容器,并允许 Docker 管理将这些名称映射到 IP 地址的操作。这个legacy links 和user defined networks 中的链接有两个选项。两种描述都值得一读,但他的段落概述了两种方法之间的区别(强调我的)

请注意,在创建 container4 时,我们链接到了一个尚未创建的名为 container5 的容器。这是默认桥接网络中的旧链接与用户定义网络中的新链接功能之间的行为差​​异之一。 旧版链接本质上是静态的,它将容器与别名硬绑定,并且不允许链接的容器重新启动。而用户定义网络中的新链接功能本质上是动态的并支持链接容器重新启动,包括容忍链接容器上的 IP 地址更改。

根据您的next question,如果您想在多个主机上运行容器,您可能需要设置一个overlay network。那些绝对不支持旧链接。

官方文档有很好的例子,包括运行什么命令、创建链接和用户定义的网络。

【讨论】:

    猜你喜欢
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多