我目前正在尝试将我的应用程序固定化以进行本地开发。就上下文而言,它使用的是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
。
经过一番挖掘,我发现了这篇博客文章,其中解释了如何设置容器,以便通过localhost
或127.0.0.1
访问它
这正如我所期望的那样有效,但它有一个缺陷。
没有Docker,我可以通过加载它来运行利用magento核心模块的PHP脚本。但有了Docker和博客文章配置,我再也做不到了,因为magento奇怪地期待着一个名为"mysql"的DB主机名。
有没有通过docker compose让容器可以用localhost
和主机名访问?
没有Docker,如果我在主机上安装MariaDB,我就可以通过127.0.0.1:3306
或mysql://
连接到它的实例。我想有类似的行为。
正如@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"