Docker,将主机IP地址添加到新容器

我有一个docker图像,我将使用它来创build新的容器。 我有一个PostgreSQL数据库在我的机器上运行,我想连接到我未来的容器。

我知道新创build的容器将位于172.17.0.0/16networking中,所以我在PostgreSQLconfiguration中为我的listen_addresses参数添加了这个networking。

现在为了创build容器,我需要写这样的东西:

 docker run --add-host=connection_name:connection_ip container_name 

connection_ip我应该写什么样的地址? 我应该编写localhost还是需要写静态IP地址,以便从外部访问?

如果您希望您的容器在任何地方都可以工作,则不应该依赖本地生成的networking的IP地址(例如172.17.0.0/16):一些高级Docker引擎pipe理系统(如Kubernetes)会更改这些默认networking,而一些云Docker托pipe环境也是这样做的。

Docker特别处理您需要容器来托pipe与选项 – --network通信。 当运行一个新的Docker容器时,它可以让你指定一个要链接的networking名称,而不需要给出任何IP地址。

你需要一个相当新的 Docker引擎(至less1.9版本),这个选项是可用的。

这是如何解决你的问题,这个新的选项:

我们假设你的主机名为myhosthostname命令的输出)。

你必须这样启动你的容器:

 docker run --network host container_name 

--network参数host的值意味着您要将此容器连接到您的主机。

现在,从容器内部,主机被命名为myhost 。 此外,IP地址已经映射到容器的/etc/hosts的主机名myhost ,并且该IP地址在networking127.0.0.0/8中分配

因此,从主机的angular度来看,从容器到myhost :5432的postgresql连接将会从127.0.0.0/8出现。 然后,您只需要将127.0.0.0/8添加到您的listen_addresses postgresql参数。

要从容器连接到Postgres数据库,可以从入口点脚本中检索默认网关IP地址。

从容器中,您可以使用ip route show检索docker主机IP

 # ip route show default via 172.17.0.1 dev eth0 172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.2 

那么默认路由就是你的主机IP(这里是172.17.0.1)

此时,请注意主机的防火墙,可以阻止连接

在入口点脚本中,您可以使用ip route show |来检索主机IP awk'/ default / {print $ 3}'。 然后你可以通过一个环境variables传递这个IP,并在应用程序中检索它。

您应该在您的PostgreSQLconfiguration中使用0.0.0.0的listen_addresses来侦听这两个接口。

如果你真的想运行一个特定的IP地址,你必须创build一个networking,使用docker network create并使用--ip选项来运行docker-run或者docker-create。