我有一个docker图像,我将用它来创建新的容器。我有一个在我的机器上运行的PostgreSQL数据库,我想连接到我未来的容器。
我知道新创建的容器将位于172.17.0.0/16
网络中,因此我在PostgreSQL配置中为listen_addresses
参数添加了此网络。
现在为了创建容器我需要写这样的东西:
docker run --add-host=connection_name:connection_ip container_name
在connection_ip
我应该写什么样的地址?我应该写localhost
还是我需要写一个静态IP地址,我可以从外面访问?
答案 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 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并在应用程序中检索它。