【问题标题】:Can't connect to a remote mysql database from php within a docker container无法从 docker 容器中的 php 连接到远程 mysql 数据库
【发布时间】:2021-05-07 12:15:13
【问题描述】:

我的设置: docker(php、mysql、nginx 等)

我的问题:我无法连接到 php docker 容器中的远程 mysql 数据库

php 示例:

    try
    {
        $this->live['pdo'] = new PDO(
            'mysql:host='.$_ENV['DB_REMOTE_HOST'].';port='.$_ENV['DB_REMOTE_PORT'].';dbname='.$_ENV['DB_REMOTE_DATABASE'],
            $_ENV['DB_REMOTE_USERNAME'],
            $_ENV['DB_REMOTE_PASSWORD']
        );
        $this->live['pdo']->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->live['pdo']->exec("SET NAMES utf8");
        $this->live['pdo']->exec("SET CHARACTER SET utf8");
    }
    catch (PDOException $e)
    {
        echo $e->getMessage();
        exit;
    }

我的 .env

DB_REMOTE_HOST = "5.9.xxx.xx"
DB_REMOTE_PORT = 3306
DB_REMOTE_DATABASE = "somedb"
DB_REMOTE_USERNAME = "someuser"
DB_REMOTE_PASSWORD = "xxxxxx"

我的 docker-compose.yml 的一部分

php:
build:
  context: .
  dockerfile: ./php/Dockerfile
  args:
    ENVIRONMENT: ${ENVIRONMENT}
container_name: php
restart: "unless-stopped"
ports:
  - "9000"
  - "9006"
  - "3306:3306"
volumes:
  - ./app/myapp.com:/var/www/html:cached
working_dir: /var/www/html
networks:
  - my_network

所以当我尝试运行上面的 php 示例时,我得到:

SQLSTATE[HY000] [1045] 用户'someuser'@'85.110.xxx.xx'的访问被拒绝(使用密码:YES

85.110.xxx.xx 是我在https://whatsmyip.com/ 上使用我的macbook 获得的实际IP 地址

这对我来说很奇怪,因为我尝试访问的 ip 是 5.9.xxx.xx。 mysql 用户、数据库和密码是正确的,我检查了三次。我什至可以用续集登录。我已经尝试为 php 容器公开 3306 端口,并没有改变任何东西。

如果有人可以帮助我,我将非常感激。

【问题讨论】:

  • 您的DB_REMOTE_HOST 必须是mysql,因为您将容器命名为mysql。 Docker 将名称路由到内部 ip。
  • 是的,如果我想连接到我的本地 mysql 容器,那是正确的。但是我想在我的 docker 环境之外连接到一个很远的远程 mysql 服务器

标签: php mysql docker containers


【解决方案1】:

在 MySQL 中,用户由用户名他们连接的 IP 地址定义。有一个特殊的“%”表示每个 IP 都被接受。因此,如果您的 MySQL 用户没有像 'someuser'@'85.110.xxx.xx''someuser'@'%' 这样在服务器上定义,服务器将拒绝您访问。

【讨论】:

  • 我相信没有人能正确阅读我的帖子。我不想连接到 85.110.xxx.xx。我想连接到 5.9.xxx.xx 流程是这样的:-> 在 docker 容器内:尝试连接到 5.9.xxx.xx -> 抛出异常,说:无法连接到 85.110.xxx.xx 我想从我的 docker 容器内部连接到我的 docker 环境之外的外部 mysql 数据库。 5.9.xxx.xx 是我尝试连接的服务器的正确 ip。 85.110.xxx.xx 是我自己的ip地址。这很奇怪,不是吗?我猜这与 ip4forwarding、docker 和 Big Sur 有关系
  • 我相信我理解你的问题,但我在解释我的意思方面做得不好。您的问题不是连接问题,而是授权问题。简而言之,您的连接 IP 地址未在 MySQL 服务器上为用户 someuser 列入白名单。这就是为什么您必须要求 MySQL 服务器的管理员创建用户 'someuser'@'85.110.xxx.xx''someuser'@'%'。在 MySQL 中,用户定义为:'username'@'allowedIP'。您不必对代码进行任何更改。
  • 好的,我明白你的意思。但是我可以使用我自己的个人 IP 85.110.xxx.xx 从我的 macbook 将 Sequel 连接到这个 mysql 数据库(5.9.xxx.xx)
猜你喜欢
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
相关资源
最近更新 更多