【问题标题】:Access to mysql container from other container从其他容器访问 mysql 容器
【发布时间】:2023-04-04 11:35:02
【问题描述】:

我已经使用 mysql 设置了 docker 容器,它公开了 3306。 我已经指定了数据库用户、数据库密码并创建了一个测试数据库并将权限授予新用户。
在另一个容器中,我想访问这个数据库。
所以我用一个简单的 php 脚本设置了新容器,在这个数据库中创建新表。
我知道 mysql 容器的 ip 是 172.17.0.2 所以:

$mysqli = new mysqli("172.17.0.2", "mattia", "prova", "prova");

与使用 mysqli 相比,我创建了新表并且一切正常。
但我认为使用他的 IP 地址连接到容器并不好。
还有另一种指定数据库主机的方法吗?我尝试使用 mysql 容器的主机名,但它不起作用。

【问题讨论】:

    标签: mysql docker


    【解决方案1】:

    --link 标志被视为旧功能,您应该使用用户定义的网络。

    您可以在同一个网络上运行两个容器:

    docker run -d --name php_container --network my_network my_php_image
    
    docker run -d --name mysql_container --network my_network my_mysql_image
    

    该网络上的每个容器都可以使用容器名称作为主机名相互通信。

    【讨论】:

    • 我已经创建了一个新网络 $ docker network create -d bridge mynetwork 并在这个网络上运行我的应用程序容器和 mysql 容器我尝试通过容器 IP 和端口将我的节点应用程序连接到 mysql 容器,但是它的即使我的数据库在工作台中运行良好,也无法连接
    • 如果你有几个容器,每个容器都连接到自己的mysql容器怎么办? F.I: 竹代理1 -->mysql1 ,竹代理2 -->mysql2
    • @DimiDak 只是将它们放在两个不同的网络上。一个网络上的一对(客户端+db),另一个网络上的第二对。您可以为不同的项目创建多个网络。
    • 工作,刚刚在 2021 年用 mysql 5.7 和 laravel 7 测试过
    • 我成功迁移laravel数据库,更改DB_HOST=mysql_container
    【解决方案2】:

    您需要将 docker 容器与 docker run 命令中的 --link 标志或使用 docker-compose 中的链接功能链接在一起。例如:

    docker run -d -name app-container-name --link mysql-container-name app-image-name
    

    通过这种方式,docker 会将 mysql 容器的 IP 地址添加到应用程序容器的 /etc/hosts 文件中。 有关完整的文档,请参阅: MySQL Docker Containers: Understanding the basics

    【讨论】:

    【解决方案3】:

    在您的 docker-compose.yml 文件中,为您的网络服务器服务添加一个链接属性: https://docs.docker.com/compose/networking/#links

    然后在您的查询字符串中,主机参数的值是您的数据库服务名称:

    $mysqli = new mysqli("database", "mattia", "prova", "prova");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 2015-08-21
      • 2021-03-04
      • 2020-10-02
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      相关资源
      最近更新 更多