无法将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。 (这是第三个本地主机,从本地主机分开,从每个容器内部看)。