【问题标题】:Docker-compose: Connect to database using localhost & mysql as hostnameDocker-compose:使用 localhost 和 mysql 作为主机名连接到数据库
【发布时间】:2020-03-11 11:18:29
【问题描述】:

我目前正在尝试 dockerize 我的应用程序以进行本地开发。对于一些上下文,它使用的是 Magento。

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

最初,我尝试使用“链接”将我的容器链接到我的 docker-compose 文件中(在此时我的 docker-compose 设置的摘录下方)

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

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

经过一番挖掘,我找到了这个blog post,它解释了如何设置容器以便可以通过localhost127.0.0.1 访问它

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

没有 Docker,我可以通过加载它来运行利用 magento 核心模块的 PHP 脚本。但是使用 Docker 和博客文章配置,我无法再这样做了,因为 Magento 奇怪地期待一个名为“mysql”的数据库主机名。

无论如何通过 docker-compose 可以使用localhost 和主机名访问容器吗?

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

【问题讨论】:

  • 显然这不是 docker 的问题,而是 Magento 的问题...
  • 如果我直接在我的机器上安装 MariaDB,我不太确定这一点,因为它在没有 docker 的情况下也可以工作。虽然脚本正在使用“链接”,但它停止使用命名空间网络..

标签: php mysql docker magento docker-compose


【解决方案1】:

是的,你可以通过 localhost 或 127.0.0.1 连接你的数据库,但这只有在 host 模式下创建 docker-compose 网络时才有可能。 但是,当您将 docker 网络设置为 host 模式时,容器化概念将失败。所以你要选择host或者bridge网络模式

You can find networking in docker-compose

network_mode: "host"

【讨论】:

  • 并且不要在你的docker-compose中添加任何链接,当你添加网络模式的链接时它会失败
【解决方案2】:

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

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

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

所以如果我理解正确,Magento 期望使用mysql 作为主机名而不是localhost 连接到 MySQL。如果是这样,这很容易解决。

如何?

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

这仅适用于用户定义的网络。所以你可以做的是创建一个桥接网络并将 Magento 和 Mysql 连接到它。并将container_name 作为mysql 用于mysql,或者您也可以使用alias as mentioned here。因此,将所有这些放在一起一个示例 docker compose 将是

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.Networking in Compose.
2.Docker Networking.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-25
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多