【问题标题】:Can't connect to MySQL docker container created via docker-compose无法连接到通过 docker-compose 创建的 MySQL docker 容器
【发布时间】:2016-05-26 14:20:17
【问题描述】:

我想开始使用 docker,并创建了一个简单的容器环境,其中包含一个 nginx 容器、一个 PHP-FPM 容器和一个 MySQL 容器。

虽然 nginx 和 PHP-FPM 容器之间的链接运行良好,但我似乎无法将 PHP 应用程序服务器与数据库服务器链接。

我使用 docker-compose 来最大程度地减少手动终端工作。我的 docker-compose.yml 看起来像这样:

web:
  image: tutorial/nginx
  ports:
    - "8080:80"
  volumes:
    - ./src:/var/www
    - ./src/vhost.conf:/etc/nginx/sites-enabled/vhost.conf
  links:
    - php
php:
  image: nmcteam/php56
  volumes:
    - ./src/php-fpm.conf:/etc/php5/fpm/php-fpm.conf
    - ./src:/var/www
  links:
    - db
db:
  image: sameersbn/mysql
  volumes:
   - /var/lib/mysql
  environment:
   - DB_NAME=demoDb
   - DB_USER=demoUser
   - DB_PASS=demoPass

当我尝试使用以下语句连接到数据库时:

$db = new \PDO('mysql:host=db;dbname=demoName', 'demoUser', 'demoPass');

MySQL 容器本身正在工作,因为我可以连接到容器 bash 并使用 MySQL CLI:

mysql> show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| demoDb             |
| mysql              |
| performance_schema |
+--------------------+

我只是收到一个 500 错误,但找不到这不起作用的原因。对于我可能错过的任何帮助或建议,我们将不胜感激。

【问题讨论】:

  • 如果本地连接,你的连接字符串应该是$db = new \PDO('mysql:host=localhost;dbname=demoName', 'demoUser', 'demoPass');,否则你需要暴露端口并使用主机的ip。链接仅在内部将链接容器公开给它链接到的应用程序。 db不能引用,必须localhost127.0.0.1引用
  • @GHETTO.CHiLD 感谢您的努力。我评论了你提供的答案。
  • 你是从 nginx 盒子连接的吗?
  • @GHETTO.CHiLD 我不确定我是否收到您的问题...由于 PHP 应用程序服务器解释了我的所有 PHP 代码,它应该通过此容器进行连接。如果我在这里弄错了,请纠正我。
  • 试试这个:$db = new \PDO('mysql:host=db;port=3306;dbname=demoDb', 'demoUser', 'demoPass'); 你有DB_NAME=demoDb 但正在设置'mysql:host=db;dbname=demoName'。改变它,重新连接,看看它是否有效。我认为这不是 Docker 问题,而是代码问题。

标签: mysql docker docker-compose


【解决方案1】:

这不是 Docker 问题,而是代码问题:

你有:$db = new \PDO('mysql:host=db;dbname=demoName', 'demoUser', 'demoPass');

应该是:$db = new \PDO('mysql:host=db;port=3306;dbname=demoDb', 'demoUser', 'demoPass');

【讨论】:

    【解决方案2】:

    如果您的容器使用 MySql 有 0.0.0.0 主机,并且您想从外部 docker(WorkBench 或 SequelPro)连接数据库,只需使用您的 docker-machine IP。示例:

    user$ docker-machine ls
    NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
    default   *        virtualbox   Running   tcp://192.168.99.100:2376           v1.12.0
    

    那么您的 MySQL 主机是 192.168.99.100 并具有正确的端口,例如3306

    【讨论】:

      【解决方案3】:

      确保将数据库端口暴露给主机网络,通过设置您的“db”服务端口

          ports:
            - 127.0.0.1:3306:3306
      

      现在您的 mysql 3306 端口将从外部可见。如果没有此设置,它将使其仅可用于同一网络上的其他服务。

      注意:127.0.0.1 是可选的,它指定端口 3306 只能从 localhost 访问,而不能从另一个 ip 访问,例如。从外部连接的人

      【讨论】:

        【解决方案4】:

        您正在使用 sameersbn/mysql 作为 MySQL 的基本映像,它根据此 dockerfile 公开 EXPOSE 3306/tcp

        我认为您需要在容器中将端口 3306 公开到 3306。您可以通过将以下内容添加到您的 docker-compose.yml 文件中来做到这一点:

        db:
          image: sameersbn/mysql
          volumes:
           - /var/lib/mysql
          environment:
           - DB_NAME=demoDb
           - DB_USER=demoUser
           - DB_PASS=demoPass
          ports:
           - "3306:3306"
        

        我个人会使用原始的MySQL 图像而不是您正在使用的图像。

        但是,作为您尝试实现 (Nginx, PHP-FPM and MySQL) 的完整解决方案,请考虑使用 LaraDock 这个开源项目是为 Laravel 设计的,但您可以轻松修改它以使其与您的 PHP 代码一起使用。

        【讨论】:

        • - "3306:3306"
        • 这实际上使您的 MySQL 服务器对 Internet 开放。不利于安全。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-28
        • 2019-04-14
        • 1970-01-01
        • 2020-02-12
        • 1970-01-01
        相关资源
        最近更新 更多