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

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

虽然nginx和PHP-FPM容器之间的链接工作得很好,但我似乎无法将PHP应用程序服务器与数据库服务器连接起来。

我使用docker-compose来最小化手动terminal工作。 我的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错误,找不到一个原因,这是行不通的。 我可能错过的任何帮助或build议都不胜感激。

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

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

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

如果您使用MySql为您的容器创build了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

您正在使用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映像而不是你正在使用的映像。

然而,作为您正在尝试实现的一个完整解决scheme(Nginx, PHP-FPM and MySQL)考虑使用LaraDock这个开源项目是为Laraveldevise的,但是您可以轻松修改它以使其与您的PHP代码一起工作。