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

时间:2017-07-28 18:15:39

标签: docker

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

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

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

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

connection_ip我应该写什么样的地址?我应该写localhost还是我需要写一个静态IP地址,我可以从外面访问?

3 个答案:

答案 0 :(得分: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参数中。

答案 1 :(得分:0)

你应该在PostgreSQL配置中使用0.0.0.0 listen_addresses来监听两个接口。

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

答案 2 :(得分:0)

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

从容器中,您可以使用ip route show

检索泊坞主机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}'。然后,您可以通过环境变量传递此IP并在应用程序中检索它。