Docker,正在将主机ip地址添加到新容器
我有一个docker图像,我将使用它来创建新的容器。我有一个在我的机器上运行的PostgreSQL数据库,我想连接到我未来的容器 我知道新创建的容器将位于Docker,正在将主机ip地址添加到新容器,docker,Docker,我有一个docker图像,我将使用它来创建新的容器。我有一个在我的机器上运行的PostgreSQL数据库,我想连接到我未来的容器 我知道新创建的容器将位于172.17.0.0/16网络中,因此我在PostgreSQL配置中为我的listen\u addresses参数添加了此网络 现在,为了创建容器,我需要编写如下内容: docker run --add-host=connection_name:connection_ip container_name 在连接\u ip我应该写什么样的地址?我
172.17.0.0/16
网络中,因此我在PostgreSQL配置中为我的listen\u addresses
参数添加了此网络
现在,为了创建容器,我需要编写如下内容:
docker run --add-host=connection_name:connection_ip container_name
在
连接\u ip
我应该写什么样的地址?我应该写入localhost
还是需要写入静态IP地址,以便从外部进行访问?您应该在PostgreSQL配置中使用0.0.0.0作为listen\u地址来监听两个接口
如果确实要在特定IP地址上运行,则必须使用docker network create
创建网络,并使用--IP
选项运行docker或创建docker。要从容器连接到Postgres数据库,可以从脚本中检索默认网关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)
此时,请注意主机的防火墙,它会阻止连接
在entrypoint脚本中,您可以使用IP路由show | awk'/default/{print$3}检索主机IP。然后,您可以通过环境变量传递此IP并在应用程序中检索它。如果希望容器在任何地方都能工作,您不应该依赖本地生成的网络(例如172.17.0.0/16)的IP地址:一些高级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的postgresql连接将从127.0.0.0/8中看到5432然后,您只需要将127.0.0.0/8添加到侦听地址postgresql参数中。
那么我应该在连接ip
中写入什么呢?无:不要使用--添加主机。使用我编写的命令:docker run--network host container_name
,因此在我必须向PostgreSQL写入连接的容器中,我只写localhost:5432
?不,如上所述,您需要写myhost:5432(myhost是主机上命令主机名的输出,因此这是主机的主机名)