Dockernetworking:自动发现网桥中的主机名
我试图得到以下非常基本的(或者所以我认为)networking设置使用Docker 1.9:
- 我有多个运行服务的容器,例如一个
postgres
容器和一个python
容器(可能有两个以上)。 - 这些集装箱通过
bridge
networking相互连接。 - 我希望它们可以使用唯一的主机名来寻址(即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_alias
networking。
$ docker network connect --alias scoped-app local_alias container6
这个例子中的
container6
现在在networkingisolated_nw
被定义为app
scoped-app
在networkinglocal_alias
为scoped-app
。