你如何发送从docker集装箱到主机的TCP / IP请求?

我正在研究如何使用docker运行openproject。 我正在通过openproject / docker工作。

我有一个外部postgres目录运行的docker图像。

我现在正在研究如何连接到现有的运行的postgresql实例。

我正在使用的命令行看起来不错,根据官方文档。

编辑 。 添加在缺less-p。

docker run -p 8082:80 -p 5432:5432 --name openproject_dev -e SECRET_KEY_BASE=secret -e DATABASE_URL=postgresql://openproject:openproject-dev- password@localhost:5432/openproject_dev \ -v /Users/admin/var/lib/openproject/logs:/var/log/supervisor \ -v /Users/admin/var/lib/openproject/static:/var/db/openproject openproject/community:5.0 

我已经省略了-d [deamon]标志,所以我可以看到任何错误。

docker集装箱正在创build时,我得到

 -----> You're using an external database. Not initializing a local database cluster. /usr/src/app /usr/src/app Starting memcached: memcached. 

我期望的 然后我得到一个关于连接到我不指望的postgresql服务器的错误。

 ... PG::ConnectionBad: could not connect to server: Connection refused Is the server running on host "localhost" (127.0.0.1) and accepting TCP/IP connections on port 5432? could not connect to server: Cannot assign requested address Is the server running on host "localhost" (::1) and accepting TCP/IP connections on port 5432? /usr/local/bundle/gems/activerecord- 4.2.7.1/lib/active_record/connection_adapters/postgresql_adapter.rb:651:in `initialize' 

我猜测初始化容器的脚本期望postgres运行,而不是。 你将如何使docker集装箱端口转发请求5432到命令行上的主机? docker运行-p 5432:5432 …的相反,它将docker容器中的5432公开给主机。

你的方法目前是错误的

docker run -p 8082:80 -p 5432:5432 –name openproject_dev -e SECRET_KEY_BASE = secret -e DATABASE_URL = postgresql:// openproject:openproject-dev-password @ localhost:5432 / openproject_dev \ -v / Users / admin / var / lib / openproject / logs:/ var / log / supervisor \ -v / Users / admin / var / lib / openproject / static:/ var / db / openproject openproject / community:5.0

当您使用-p 5432:5432 ,意味着您希望在该端口的docker中运行某些东西,并且希望主机5432端口映射到5432

接下来,如果您能够运行该命令,即使容器内没有任何内容正在监听,那也意味着主机上的端口可用。 这意味着postgress在主机上也不会听5432 。 它可能正在监听一个套接字。 你应该尝试在主机上执行下面的命令

 psql -h 127.0.0.1 

如果你不能使用这个连接主机上,这意味着postgres数据库绑定到一个套接字文件,而不是一个IP。 现在你有几个select,你可以锻炼

安装sockets

docker run -p 8082:80 -p 5432:5432 –name openproject_dev -e SECRET_KEY_BASE = secret -e DATABASE_URL = postgresql:// openproject:openproject-dev-password @ localhost:5432 / openproject_dev \ -v / Users / admin / var / lib / openproject / logs:/ var / log / supervisor \ -v:\ -v / Users / admin / var / lib / openproject / static:/ var / db / openproject openproject / community:5.0

绑定在主机上的0.0.0.0

如果你不想安装卷,那么你应该将psql的绑定地址更改为0.0.0.0 ,然后将数据库url更改为-e DATABASE_URL=postgresql://openproject:openproject-dev-password@<YOURMACHINEIP>:5432/openproject_dev

在主机networking上运行

docker run –net host –name openproject_dev -e SECRET_KEY_BASE = secret -e DATABASE_URL = postgresql:// openproject:openproject-dev -password @ localhost:5432 / openproject_dev -v / Users / admin / var / lib / openproject /日志:/ var / log / supervisor \ -v:\ -v / Users / admin / var / lib / openproject / static:/ var / db / openproject openproject / community:5.0

 -e DATABASE_URL=postgresql://openproject:openproject-dev- password@localhost:5432/openproject_dev 

当你添加这个url时,容器需要postgres在localhost上运行,也就是在本身。

如果你在你的主机上运行postgres,你可以让容器和主机共享networking栈,在run命令中传递--network host 。 在这种情况下,localhost将引用postgres正在运行的主机。

Interesting Posts