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

The*_*ist 7 docker

我试图让以下非常基本(或者我认为)网络设置使用Docker 1.9:

  • 我有多个运行服务的postgres容器,例如容器和python容器(可能有两个以上).
  • 这些容器通过bridge网络相互连接.
  • 我希望它们可以使用唯一的主机名进行寻址(即Python容器应该能够ping postgresping 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
Run Code Online (Sandbox Code Playgroud)

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

如果不采用在容器上运行DNS服务的话,我会对这样做很感兴趣.这似乎是一个简单的问题,但不幸的是我无法找到任何配置选项来更改/etc/hosts文件中容器的名称.

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

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

Von*_*onC 6

docker 1.10和PR 19242可以提供帮助:

docker create --net-alias=[]: Add network-scoped alias for the container
Run Code Online (Sandbox Code Playgroud)

docker 1.10有一个新的网络范围别名:

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

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

$ docker run --net=isolated_nw -itd --name=container6 --net-alias app busybox
8ebe6767c1e0361f27433090060b33200aac054a68476c3be87ef4005eb1df17
Run Code Online (Sandbox Code Playgroud)

现在让我们使用不同的网络范围别名连接container6local_alias网络.

$ docker network connect --alias scoped-app local_alias container6
Run Code Online (Sandbox Code Playgroud)

container6在这个例子中,现在app在网络isolated_nwscoped-app网络中都有别名local_alias.