如何从容器内部访问在主机上运行的数据库?

Posted

技术标签:

【中文标题】如何从容器内部访问在主机上运行的数据库?【英文标题】:How to access database which runs on host from inside of container? 【发布时间】:2016-05-10 01:19:47 【问题描述】:

我在容器中运行我的应用程序并映射 8080 -> 5000 并且它可以工作。但是,我想访问在 HOST 系统上而不是在其他容器内运行的 Postgres 数据库。假设 pg 在 postgres://localhost:5434/mydb 上运行 - 我如何从我的应用容器连接到该数据库?

这是我的 docker-compose.yml

web:
  image: myprofile/myimage:latest
  ports:
    - 8080:5000

【问题讨论】:

【参考方案1】:

很遗憾,这个问题没有一个简单的答案。

基本上你有两个选择:

1) 使用volumes 使套接字在容器中可用。

数据库,如 postgres & mysql,支持监听 unix 域 套接字而不是 TCP 套接字。这里的好处是你可以 通过卷挂载将 unix 域套接字转发到容器中 docker run -v

2) 使用socat 从套接字提供主机内部的 localhost(127.0.0.1) tcp 连接

对于只有 tcp 套接字的应用程序,我只需将 socat 扔到 图像,并在容器内的后台启动它(具有 它在 127.0.0.1 上侦听,并转发到指定的套接字)。

主机上的本地主机是本地的。如果您在同一个网络命名空间中,则只能共享 localhost。 所以你可以--net=host 或者你不使用localhost

【讨论】:

【参考方案2】:

在 docker 文档中查看如何处理卷

https://docs.docker.com/engine/userguide/dockervolumes/

Dockerfile 中的 VOLUME 指令

https://docs.docker.com/engine/reference/builder/#volume

docker run命令的-v

https://docs.docker.com/engine/reference/commandline/cli/#run

提取

-v, --volume=[] Bind mount a volume

【讨论】:

我想连接到在主机上运行的数据库 @user606521 这个答案是有效的!。不是直接的答案,但可以为您提供所需的帮助 它没有提供任何关于如何将数据库从 HOST 连接到 CONTAINER 的信息 @user606521 您的问题是关于HOSTCONTAINER 还是CONTAINERlocalhost?,这是2 个不同的场景 例如,从“Dockerizing PostgreSQL”中提取docs.docker.com/engine/examples/postgresql_service# Add VOLUMEs to allow backup of config, logs and databases VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]

以上是关于如何从容器内部访问在主机上运行的数据库?的主要内容,如果未能解决你的问题,请参考以下文章

docker从容器中怎么访问宿主机

从 Docker 容器中访问主机上的 MySQL 数据库

无法从 docker 容器内部访问 datadog 代理

如何将我的 docker 连接到远程数据库?

从另一个容器访问 docker 容器

如何启用从 Docker 容器内部启动的 Spark-Mesos 作业?