Docker Networking:自动发现桥接网络中的主机名

时间:2015-11-20 20:23:09

标签: docker

我正在努力使用以下非常基本(或者我认为)的网络设置来使用Docker 1.9:

  • 我有多个运行服务的容器,例如一个postgres容器和一个python容器(可能有两个以上)。
  • 这些容器通过bridge网络相互连接。
  • 我希望它们可以使用唯一的主机名进行寻址(即Python容器应该能够ping postgres ping Postgres容器。)

按照教程(https://docs.docker.com/engine/userguide/networking/dockernetworks/),我可以使用以下命令序列来实现此目的:

#create the containers
docker run -itd --name container1 busybox
docker run -itd --name container2 busybox
#create the network
docker network create test
docker network connect test container1
docker network connect test container2

这非常有效,Docker正确设置etc/hosts中的条目以指向正确的IP地址。但是,我还希望能够同时运行该设置的几个实例(即容器+网络)。这不起作用,因为/etc/hosts文件中每个容器的条目等于其名称,该名称必须是唯一的。指定hostname参数不能解决此问题,因为它只会更改容器的本地主机名(即它自己看到的那个)。

如果没有在容器上运行DNS服务,我会对这样做非常感兴趣。这似乎是一个简单的问题,但遗憾的是我无法找到任何配置选项来更改/etc/hosts文件中容器的名称。

顺便说一句,我希望主机名在我的网络+容器设置的每个实例中都是相同的,这样我就不需要动态地将主机名传递到容器中(例如告诉Python容器Postgres容器的地址)

编辑:我对Docker的问题跟踪器做了一些研究,似乎有一个功能正在筹备中:https://github.com/docker/libnetwork/issues/737

1 个答案:

答案 0 :(得分:6)

docker 1.10, and PR 19242可以提供帮助:

docker create --net-alias=[]: Add network-scoped alias for the container

docker 1.10有一个新部分Network-scoped alias

  

虽然链接提供了在容器中本地化的私有名称解析,但网络范围的别名提供了一种方法,可以通过特定网络范围内的任何其他容器以备用名称发现容器。   与由服务的使用者定义的链接别名不同,网络范围的别名由向网络提供服务的容器定义。

     

继续上面的示例,在isolated_nw中使用网络别名创建另一个容器。

$ docker run --net=isolated_nw -itd --name=container6 --net-alias app busybox
8ebe6767c1e0361f27433090060b33200aac054a68476c3be87ef4005eb1df17

现在让我们使用不同的网络范围别名将container6连接到local_alias网络。

$ docker network connect --alias scoped-app local_alias container6
  此示例中的

container6现在在网络app中显示为isolated_nw,在网络scoped-app中显示为local_alias