一尘不染

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

docker

我正在尝试获得以下相当基本的(或我认为)联网设置,以使用Docker 1.9进行工作:

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

遵循本教程(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


阅读 356

收藏
2020-06-17

共1个答案

一尘不染

docker 1.10和PR 19242可以帮助:

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

docker 1.10新增了一个
网络范围别名

链接提供了位于容器内的私有名称解析,而网络范围的别名为特定网络范围内的任何其他容器提供了一种由备用名称发现容器的方式。
与服务的使用者定义的链接别名不同,网络范围的别名是由向网络提供服务的容器定义的。

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

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

现在,让我们使用其他网络范围的别名连接container6local_alias网络。

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

container6在本示例中,现在别名为appnetwork isolated_nwscoped- appnetwork中的别名local_alias

2020-06-17