如何从容器内部访问在主机上运行的数据库?
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 您的问题是关于HOST
到CONTAINER
还是CONTAINER
到localhost
?,这是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"]
以上是关于如何从容器内部访问在主机上运行的数据库?的主要内容,如果未能解决你的问题,请参考以下文章