如何动态地将docker容器的IP地址映射到另一个容器

时间:2016-11-17 18:13:29

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

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

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

2 个答案:

答案 0 :(得分:2)

更新:将包含--link参数的容器标记为旧版enter link description here

  

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

您需要泊坞网络。以下示例来自官方文档,但这里有几行:

首先创建docker network例如:

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

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

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

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

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

答案 1 :(得分:1)

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

  

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

根据您的next question,如果您想在多台主机上运行容器,您可能需要设置overlay network。那些肯定不支持传统链接。

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