无法将Npgsql连接到在Docker上运行的Postgres DB

我有一个与以下代码的.NET应用程序的docker容器:

var pgsql = OpenDbConnection("Server=localhost;Database=postgres;Username=postgres;Password=MyPass;Port=5432"); private static NpgsqlConnection OpenDbConnection(string connectionString) { NpgsqlConnection connection; Console.Error.WriteLine("Connecting to DB"); while (true) { try { connection = new NpgsqlConnection(connectionString); connection.Open(); break; } catch (SocketException e) { Console.WriteLine("{0} Exception caught.", e); Thread.Sleep(1000); } catch (DbException) { Console.Error.WriteLine("Waiting for db - db error"); Thread.Sleep(1000); } } return connection; } 

我有一个不同的容器与官方Postgres容器,我开始与命令

 docker run --name localpg -e POSTGRES_PASSWORD=MyPass -d postgres -p 5432:5432 

现在我可以从pgAdmin连接主机localhost ,用户名和密码postgres和密码MyPass

但是,如果我尝试使用命令docker run worker在同一台计算机上docker run worker上面的.NET代码,我得到这个exception:

 System.Net.Sockets.SocketException: Unknown error -1 at Npgsql.NpgsqlConnector.Connect(NpgsqlTimeout timeout) at Npgsql.NpgsqlConnector.RawOpen(NpgsqlTimeout timeout) at Npgsql.NpgsqlConnector.Open(NpgsqlTimeout timeout) at Npgsql.ConnectorPool.Allocate(NpgsqlConnection conn, NpgsqlTimeout timeout) at Npgsql.NpgsqlConnection.OpenInternal() at Worker.Program.OpenDbConnection(String connectionString) Exception caught. 

有什么想法吗?

编辑

按照Dan的build议,我把连接string改为

 var pgsql = OpenDbConnection("Server=localpg;Database=postgres;Username=postgres;Password=MyPass;Port=5432"); 

但仍然不起作用( InternalSocketException: No such device or address )。

 $ docker network ls NETWORK ID NAME DRIVER SCOPE ad8fa68b5dab bridge bridge local 984027aadc2a host host local 5604001734fa none null local 

使用docker run worker启动应用程序容器(不使用)。

每个容器都有自己的本地主机

你在这里有两个容器,一个运行你的.Net应用程序,一个运行你的Postgres数据库。 从.net应用程序容器的angular度来看,在本地主机(.Net容器)上没有运行Postgres,但是您正尝试连接到本地主机:

 var pgsql = OpenDbConnection("Server=localhost;Database=postgres; ..."); 

你的两个容器是分开的,每个容器都有自己 localhost。 要连接到Postgres容器,请使用其名称,就像它是一个主机名。 通过您在问题中发布的docker run命令来判断,您应该使用:

 var pgsql = OpenDbConnection("Server=localpg;Database=postgres; ..."); 

你的电脑也有它自己的本地主机

您可以使用pgAdmin连接到localhost:5432上的Postgres的原因是您已经将端口5432从Docker导出到外部主机(您运行Docker的计算机)。 这就是-p 5432:5432在你的docker run命令中做的事情。

在该系统的本地主机上,端口5432被绑定到容器中的Postgres。 (这是第三个本地主机,从本地主机分开,从每个容器内部看)。