无法连接到 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 访问,例如。有人从外面连接
我想开始使用 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 访问,例如。有人从外面连接