无法连接到 MySQL docker 通过 docker-compose 创建的容器

Can't connect to MySQL docker container created via docker-compose

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

虽然 nginx 和 PHP-FPM 容器之间的 link 运行良好,但我似乎无法 link 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 错误,但找不到这不起作用的原因。对于我可能遗漏的任何帮助或建议,我们将不胜感激。

您正在使用 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 代码。

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

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

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

如果您的容器有 0.0.0.0 主机 MySql 并且您想从 docker(WorkBench 或 SequelPro)外部连接数据库,只需使用您的 docker-机器 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

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

    ports:
      - 127.0.0.1:3306:3306

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

注意:127.0.0.1 是可选的,它指定端口 3306 只能从本地主机访问,不能从其他 ip 访问,例如。有人从外面连接