我正在努力使用以下非常基本(或者我认为)的网络设置来使用Docker 1.9:
postgres
容器和一个python
容器(可能有两个以上)。 bridge
网络相互连接。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
答案 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
。