2017-07-28 313 views
0

我有一个docker映像,我将使用它来创建新容器。我有一台PostgreSQL数据库在我的机器上运行,我想连接到我的未来容器。Docker,将主机IP地址添加到新容器中

我知道新创建的容器将位于172.17.0.0/16网络中,所以我在PostgreSQL配置中为我的listen_addresses参数添加了该网络。

现在,为了创建容器我需要写是这样的:

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

connection_ip我什么样的解决我应该写?我应该写localhost还是需要写静态IP地址才能从外部访问?

回答

1

如果您希望您的容器在任何地方都能正常工作,您不应该依赖本地生成的网络的IP地址(例如172.17.0.0/16):一些高级Docker引擎管理系统(如Kubernetes)会进行更改到那些默认网络,并且一些云Docker托管环境也会这样做。

Docker特别处理您对集装箱与主机通信的需求,其选项为--network。当运行一个新的Docker容器时,它允许您指定要链接的网络名称,而不需要提供任何IP地址。

您需要一个相当于的近期 Docker引擎(至少版本1.9),以便此选项可用。

下面是如何使用这个新选项可以解决你的问题:

我们假设你的主机被命名为为myhost(该hostname命令的输出)。

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

docker run --network host container_name 

--network参数,host的价值,意味着你要这个容器连接到主机。

现在,从您的容器内部,主机名为myhost。此外,IP地址已映射到容器的/etc/hosts中的主机名称myhost,该IP地址分配在网络127.0.0.0/8中。

因此,从主机的角度来看,从容器到myhost:5432的postgresql连接将看起来来自127.0.0.0/8。 然后,您只需要将127.0.0.0/8添加到您的listen_addresses postgresql参数中即可。

+0

那么,我应该写入'connection_ip'? –

+0

Nothing:不要使用'--add-host'。使用我写的命令:'docker run --network host container_name' –

+0

因此,在我的continer中,我必须写PostgreSQL的连接我只写'localhost:5432'? –

0

您应该在您的PostgreSQL配置中使用0.0.0.0作为listen_addresses,以侦听两个接口的

如果您确实想要在特定IP地址上运行,则必须创建一个包含docker network create的网络,并使用--ip选项执行docker-run或docker-create。

0

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

从您可以ip route show

# 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容器然后默认路由是你的主机IP(这里172.17.0.1)

在这一点上,要注意主机的可以阻止连接的防火墙

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

相关问题