Docker-compose:使用 localhost 和 mysql 作为主机名连接到数据库



我目前正在尝试将我的应用程序固定化以进行本地开发。就上下文而言,它使用的是Magento。

我有一个配置文件,用于将127.0.0.1设置为MySQL主机名,因为web应用程序与MariaDB在同一主机上运行。

最初,我尝试使用"链接"(在我的docker compose设置的摘录下面(将我的容器链接到我的dockercompose文件中

mariadb:
image: mariadb:5.5
php-fpm:
build: docker/php-fpm
links:
- "mariadb:mysql"

此时,可以通过在我的配置文件中将mysql而不是127.0.0.1设置为主机名来访问MariaDB。但是,我想保留127.0.0.1

经过一番挖掘,我发现了这篇博客文章,其中解释了如何设置容器,以便通过localhost127.0.0.1访问它

这正如我所期望的那样有效,但它有一个缺陷。

没有Docker,我可以通过加载它来运行利用magento核心模块的PHP脚本。但有了Docker和博客文章配置,我再也做不到了,因为magento奇怪地期待着一个名为"mysql"的DB主机名。

有没有通过docker compose让容器可以用localhost和主机名访问?

没有Docker,如果我在主机上安装MariaDB,我就可以通过127.0.0.1:3306mysql://连接到它的实例。我想有类似的行为。

正如@Sai Kumar所说,您可以将docker容器连接到host网络,然后可以使用localhost访问服务。但问题是,该端口将由该容器保留,在删除之前将不可用。

但从你的问题来看,下面的一句话引起了我的注意

没有Docker,我可以运行利用magento的PHP脚本通过加载它来核心模块。但是使用Docker和博客文章配置,我不能再做了,因为Magento很奇怪期望一个名为"mysql"的DB主机名

因此,如果我理解得当,Magento希望以mysql而不是localhost作为主机名连接到MySQL。如果是这样的话,这个问题就很容易解决。

如何

所以在docker中,有一个概念叫做服务发现。我在很多答案中都解释了同样的道理。基本上,它所做的是通过容器主机名/别名解析容器的IP。因此,不用使用IP地址在容器之间连接,而是可以使用容器的主机名在容器之间进行连接,这样即使容器重新启动(导致IP更改(,Docker也会负责将其解析到相应的容器。

这仅适用于用户定义的网络。所以你可以做的是创建一个桥接网络,并将Magento和Mysql连接到它。并将container_name作为Mysql的mysql,或者你也可以使用这里提到的别名。因此,把所有这些放在一起,一个示例docker组成将是

version: '3'
services:
mariadb:
image: mariadb:5.5
container_name: mysql #This can also be used but I always prefer using aliases
networks:
test:
aliases:
- mysql #Any container connected to test network can access this simply by using mysql as hostname   
php-fpm:
build: docker/php-fpm
networks:
test:
aliases:
- php-fpm
networks:
test:
external: true

更多参考文献
1。Compose中的网络
2.Docker网络。

是的,您可以通过数据库与localhost或127.0.0.1连接,但这只有在host模式下创建docker composed网络时才可能。但是,当您将docker网络设置为host模式时,容器化概念将失败。因此,您必须选择主机网桥网络模式

你可以在docker compose 中找到网络

network_mode: "host"

相关内容

  • 没有找到相关文章

最新更新