从Docker容器使用Unix域套接字连接到PostgreSQL是否可行?

15

以下是背景故事,但这里有问题:我发现如果我的docker主机上运行postgresql,我可以通过挂载为文件的域套接字在容器中连接它:

docker run -v /var/run/postgresql/:/var/run/postgresql

这感觉像是一个大的hack,所以我想知道在生产环境中是否真的糟糕。你有什么想法吗?


背景故事

背景是我在docker主机上运行postgresql,因为我不相信docker可以直接运行postgresql。

所以我需要从运行在同一台服务器上的docker容器连接到那个postgresql实例。我尝试过:

  • 使用--add-host

    但这也是一种hack,因为它需要将docker run放在脚本中来找出主机机器的正确IP。类似于:

     docker run --add-host=postgres-host:$(ip route show | awk {print $2})
    

    我不喜欢不得不这样做。

  • 我尝试使用--net=host,但那不是我们想要的。我们想要一个覆盖网络。

  • 我尝试通过在容器内查找主机的IP地址来设置这个,但我不想仅仅为了这个目的运行一个脚本。

所以...我想:“使用域套接字怎么样?”

2个回答

6

在我看来,挂载套接字并不像是一种黑客行为。事实上,如果你想要在容器内部使用docker命令,挂载/var/run/docker.sock是标准的方法。


1
哦,还没有看到过这个概念。看起来这里有一个好的解释: https://dev59.com/-lsW5IYBdhLWcg3wT155#35110344。谢谢! - mlissner

2
我认为的是“安全性”和“可扩展性”。
安全性:使用docker,即使容器被黑客攻击,您仍然可以在容器(Web服务器)和主机(数据库服务器)之间有一个保护层。但是使用unix套接字,数据可能会直接暴露给黑客。
可扩展性:我们需要将Web服务器和数据库服务器分开的原因之一是:如果遇到性能问题,我们可以轻松地扩展Web服务器。通过将更多的Web服务器连接到一个数据库服务器,应用程序可以支持更多的访问者。但是使用unix-socket,Docker中的Web服务器不可扩展,您必须将Web服务器(容器)放在一台机器上以利用数据库的unix-socket。

2
这种方法在我看来似乎和在主机上与数据库建立TCP连接一样安全。 - David Maze
不确定,使用TCP协议,黑客可能需要更多的努力来找到哪个端口是开放的,并且在网络中,可能有更多的方式(防火墙等)来控制访问。但是使用Unix套接字,容器没有额外的保护。对于网络和黑客安全方面不熟悉,只是一种想法。实际上,我认为这与Docker无关,只与反向代理的好处有关。但我想可扩展性是用户需要考虑的一个问题。 - atline

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接