Docker,正在将主机ip地址添加到新容器

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我应该写什么样的地址?我

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

我知道新创建的容器将位于
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是主机上命令主机名的输出,因此这是主机的主机名)