我想开始使用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错误,无法找到原因导致无效的原因。任何对我可能错过的帮助或建议都不胜感激。
答案 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 访问,例如。有人从外部连接