Dockernetworking:自动发现网桥中的主机名

我试图得到以下非常基本的(或者所以我认为)networking设置使用Docker 1.9:

  • 我有多个运行服务的容器,例如一个postgres容器和一个python容器(可能有两个以上)。
  • 这些集装箱通过bridgenetworking相互连接。
  • 我希望它们可以使用唯一的主机名来寻址(即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地址。 不过,我也希望能够同时运行该设置的多个实例(即容器+networking)。 这不起作用,因为/etc/hosts文件中每个容器的条目都等于它的名称 ,这个名称必须是唯一的。 指定hostname参数并不能解决这个问题,因为它只改变容器的本地主机名(即它自己看到的那个)。

我会非常感兴趣的一种方法来做到这一点,而不诉诸在容器上运行的DNS服务。 这似乎是一个简单的问题,但不幸的是,我无法find任何configuration选项来更改/etc/hosts文件中的容器的名称。

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

编辑 :我做了一些关于Docker的问题跟踪器的研究,似乎有一个在pipe道中的function: https : //github.com/docker/libnetwork/issues/737

docker1.10和PR 19242可以帮助:

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

docker1.10有一个新的networking范围的别名

尽pipe链接提供了在容器中本地化的专用名称parsing,但是networking范围的别名提供了一种容器在特定networking的范围内由其他容器的替代名称发现的方式。
与由服务使用者定义的链接别名不同,networking作用域别名是由向networking提供服务的容器定义的。

继续上面的例子,使用networking别名在isolated_nw创build另一个容器。

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

现在,让我们使用不同的networking范围别名将container6连接到local_aliasnetworking。

 $ docker network connect --alias scoped-app local_alias container6 

这个例子中的container6现在在networkingisolated_nw被定义为app scoped-app在networkinglocal_aliasscoped-app