使用Docker我得到的错误:“SQLSTATE 没有这样的文件或目录”

我正在使用Docker创build一个容器来testing我的Mac上构build于PHP和MySQL上的Web应用程序。 我的PHP应用程序是使用MVC和路由的无脂框架构build的。 我有两个Dockerfiles,一个用于MySQL,一个用于PHP。 我已经成功地使用了testing的Docker应用程序,所以我相信我的映像安装正确。

错误的主要部分:

Internal Server Error SQLSTATE[HY000] [2002] No such file or directory [fatfree/lib/DB/SQL.php:466] PDO->__construct('mysql:host=127.0.0.1;port=3306;dbname=robohome','root','password',array(1002=>'SET NAMES utf8;')) [fatfree/app/Controllers/Controller.php:24] DB\SQL->__construct('mysql:host=127.0.0.1;port=3306;dbname=robohome','root','password') 

请注意,如果我连接使用127.0.0.1而不是localhost我得到一个稍微不同的错误,说: SQLSTATE[HY000] [2002] Connection refused

我的PHP Dockerfile:

 FROM php:5.6-apache RUN docker-php-ext-install mysqli pdo pdo_mysql RUN a2enmod rewrite 

我的MySQL Dockerfile:

 FROM mysql:5.7 ENV MYSQL_ROOT_PASSWORD password ENV MYSQL_DATABASE robohome COPY ./schema.sql /docker-entrypoint-initdb.d/ 

我的Controller.php文件错误提到第24行:

 <?php namespace Controllers; class Controller { protected $f3; protected $db; public function __construct() { $f3 = \Base::instance(); $this->f3 = $f3; $mysqlServerName = $f3->get("MYSQL_SERVERNAME"); $mysqlDatabseName = $f3->get("MYSQL_DBNAME"); //$container = \DI\ContainerBuilder::buildDevContainer(); <-Not used currently //Below is line 24 referred to in the error $db = new \DB\SQL( "mysql:host={$mysqlServerName};port=3306;dbname={$mysqlDatabseName}", $f3->get("MYSQL_USERNAME"), $f3->get("MYSQL_PASSWORD") ); $this->db = $db; } 

这些MYSQL_*值是从.ini文件中提取的:

 MYSQL_SERVERNAME = "localhost" <-This is what I've tried changing to 127.0.0.1 MYSQL_USERNAME = "root" MYSQL_PASSWORD = "password" MYSQL_DBNAME = "robohome" 

我的Docker撰写文件:

 version: '2' services: web: build: ./docker/php ports: - 80:80 volumes: - .:/var/www/html/ links: - db db: build: ./docker/mysql ports: - 3306 

我通过做docker-compose up --build -d运行docker-compose up --build -d 。 我可以从docker ps得到的输出是:

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f35066a16586 robohomeweb_mysql "docker-entrypoint.sh" 3 minutes ago Up 2 seconds 0.0.0.0:32777->3306/tcp robohomeweb_mysql_1 86d34eb34583 robohomeweb_php "apache2-foreground" 3 minutes ago Up 2 seconds 0.0.0.0:80->80/tcp robohomeweb_php_1 

如果我在前台运行,我会得到以下输出:

 Building php Step 1 : FROM php:5.6-apache ---> 8f9b7e57129a Step 2 : RUN docker-php-ext-install mysqli pdo pdo_mysql ---> Using cache ---> fadd8f9e7207 Step 3 : RUN a2enmod rewrite ---> Using cache ---> 9dfed7fdc60f Successfully built 9dfed7fdc60f Building mysql Step 1 : FROM mysql:5.7 ---> eda6a4884645 Step 2 : ENV MYSQL_ROOT_PASSWORD password ---> Using cache ---> 759895ac5772 Step 3 : ENV MYSQL_DATABASE robohome ---> Using cache ---> e926c5ecc088 Step 4 : COPY ./schema.sql /docker-entrypoint-initdb.d/ ---> Using cache ---> cf5d00aa8020 Successfully built cf5d00aa8020 Starting robohomeweb_php_1 Starting robohomeweb_mysql_1 Attaching to robohomeweb_mysql_1, robohomeweb_php_1 php_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.3. Set the 'ServerName' directive globally to suppress this message php_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.3. Set the 'ServerName' directive globally to suppress this message php_1 | [Sun Oct 16 20:21:17.944575 2016] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/5.6.26 configured -- resuming normal operations php_1 | [Sun Oct 16 20:21:17.946919 2016] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND' mysql_1 | 2016-10-16T20:21:18.036272Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). mysql_1 | 2016-10-16T20:21:18.038330Z 0 [Note] mysqld (mysqld 5.7.16) starting as process 1 ... mysql_1 | 2016-10-16T20:21:18.043331Z 0 [Note] InnoDB: PUNCH HOLE support available mysql_1 | 2016-10-16T20:21:18.043603Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins mysql_1 | 2016-10-16T20:21:18.043951Z 0 [Note] InnoDB: Uses event mutexes mysql_1 | 2016-10-16T20:21:18.044077Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier mysql_1 | 2016-10-16T20:21:18.044260Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.3 mysql_1 | 2016-10-16T20:21:18.044414Z 0 [Note] InnoDB: Using Linux native AIO mysql_1 | 2016-10-16T20:21:18.045150Z 0 [Note] InnoDB: Number of pools: 1 mysql_1 | 2016-10-16T20:21:18.045620Z 0 [Note] InnoDB: Using CPU crc32 instructions mysql_1 | 2016-10-16T20:21:18.047629Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M mysql_1 | 2016-10-16T20:21:18.057705Z 0 [Note] InnoDB: Completed initialization of buffer pool mysql_1 | 2016-10-16T20:21:18.059988Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority(). mysql_1 | 2016-10-16T20:21:18.074670Z 0 [Note] InnoDB: Highest supported file format is Barracuda. mysql_1 | 2016-10-16T20:21:18.101209Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables mysql_1 | 2016-10-16T20:21:18.101433Z 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ... mysql_1 | 2016-10-16T20:21:18.354806Z 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB. mysql_1 | 2016-10-16T20:21:18.356928Z 0 [Note] InnoDB: 96 redo rollback segment(s) found. 96 redo rollback segment(s) are active. mysql_1 | 2016-10-16T20:21:18.357158Z 0 [Note] InnoDB: 32 non-redo rollback segment(s) are active. mysql_1 | 2016-10-16T20:21:18.358049Z 0 [Note] InnoDB: Waiting for purge to start mysql_1 | 2016-10-16T20:21:18.412987Z 0 [Note] InnoDB: 5.7.16 started; log sequence number 12179647 mysql_1 | 2016-10-16T20:21:18.414470Z 0 [Note] Plugin 'FEDERATED' is disabled. mysql_1 | 2016-10-16T20:21:18.421833Z 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool mysql_1 | 2016-10-16T20:21:18.424144Z 0 [Note] InnoDB: Buffer pool(s) load completed at 161016 20:21:18 mysql_1 | 2016-10-16T20:21:18.425607Z 0 [Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key mysql_1 | 2016-10-16T20:21:18.427018Z 0 [Note] Server hostname (bind-address): '*'; port: 3306 mysql_1 | 2016-10-16T20:21:18.427581Z 0 [Note] IPv6 is available. mysql_1 | 2016-10-16T20:21:18.427749Z 0 [Note] - '::' resolves to '::'; mysql_1 | 2016-10-16T20:21:18.428019Z 0 [Note] Server socket created on IP: '::'. mysql_1 | 2016-10-16T20:21:18.456023Z 0 [Warning] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode. mysql_1 | 2016-10-16T20:21:18.456354Z 0 [Warning] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode. mysql_1 | 2016-10-16T20:21:18.480237Z 0 [Warning] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode. mysql_1 | 2016-10-16T20:21:18.488758Z 0 [Note] Event Scheduler: Loaded 0 events mysql_1 | 2016-10-16T20:21:18.490880Z 0 [Note] mysqld: ready for connections. mysql_1 | Version: '5.7.16' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL) 

从我的研究,我已经尝试使用localhost127.0.0.1连接,因为他们在技术上被区别对待。 它也可能是与试图通过套接字而不是TCP进行通信有关的事情。 理想情况下,我想要一个解决scheme,我可以烤进我的Docker文件,所以我不必担心记住的命令,或者我怎么做了什么。

正如有人在评论中指出的那样,您提供的docker-compose文件与您的问题非常相关。

docker-compose文件中的links文档说

链接服务的容器将可以在与别名相同的主机名上访问,如果没有指定别名,则服务名称是可访问的。

在你的情况下,数据库容器被命名为db ,所以从PHP容器parsingdb主机应该指向你的MySQL容器。 在configuration文件中用dbreplacelocalhost应该允许PHP容器连接到MySQL。

PHP的生活在一个不同的docker图像比MySQL。 因此localhost和127.0.0.1从PHP不指向MySQL。 你应该连接到mysql docker实例的ip。

还要确保mysql正在监听所有的接口。 在mysql.ini中,您需要将侦听0.0.0.0以侦听所有可用的接口。 默认情况下,它只允许从本地主机连接(和PHP泊坞窗容器是一个不同的主机)。