Docker,将主机IP地址添加到新容器
我有一个docker图像,我将使用它来创build新的容器。 我有一个PostgreSQL数据库在我的机器上运行,我想连接到我未来的容器。
我知道新创build的容器将位于172.17.0.0/16
networking中,所以我在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版本),这个选项是可用的。
这是如何解决你的问题,这个新的选项:
我们假设你的主机名为myhost ( hostname
命令的输出)。
你必须这样启动你的容器:
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。