无法连接到通过docker-compose

时间:2016-05-26 14:20:17

标签: mysql docker docker-compose

我想开始使用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时:

$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错误,无法找到原因导致无效的原因。任何对我可能错过的帮助或建议都不胜感激。

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

如果您拥有使用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

答案 2 :(得分:0)

您使用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代码一起使用

答案 3 :(得分:0)

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

    ports:
      - 127.0.0.1:3306:3306

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

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