如何从 docker 容器向主机发送 tcp/ip 请求?

How do you send tcp/ip requests from a docker container to the host?

我正在研究如何 运行 使用 docker 打开项目。我正在处理 openproject/docker.

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

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

根据官方文档,我使用的命令行看起来没问题。

编辑。添加在缺少的-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 容器时,我得到

-----> 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 是 运行ning 而不是。您将如何使 docker 容器端口将对 5432 的请求转发到命令行上的主机? ...与 docker 运行 -p 5432:5432 相反...将 docker 容器中的 5432 暴露给主机。

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

添加此 url 时,容器希望 postgres 运行在本地主机上运行,​​即在其自身中。

如果您在主机上 运行ning postgres,您可以通过在 运行 命令中传递 --network host 让容器与主机共享网络堆栈。在这种情况下,localhost 将引用 postgres 运行ning.

所在的主机

您目前的做法是错误的

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 里面 docker.

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

上执行以下命令
psql -h 127.0.0.1

如果您无法使用此连接到主机,则意味着 postgres 数据库绑定到套接字文件而不是 IP。现在你可以练习的选项很少

挂载套接字

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

运行 在主机网络上

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/logs:/var/log/supervisor \ -v : \ -v /Users/admin/var/lib/openproject/static:/var/db/openproject openproject/community:5.0