Docker 连接 PHP 容器和 MySQL

11

我有两个容器,一个是apache-php容器,另一个是mysql数据库容器。 我试图让我的php脚本查询我的sql数据库。 然而,我收到了以下错误信息;

Fatal error: Uncaught PDOException: PDO::__construct(): php_network_getaddresses: getaddrinfo failed: Name or service not known

并且

Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] No such file or directory

当切换主机地址时,我认为我在使用Docker方面缺少了一些基础知识,这让我感到疯狂。

我的Docker Compose看起来像这样;

version: '2'

services:

    applications:
      image: tianon/true
      volumes:
        - /var/www/test:/var/www/html

    mysql_store:
      image: tianon/true
      volumes:
        - /var/www/test/mysql:/var/lib/mysql

    apache2:
      build:
        context: ./apache2
      volumes_from:
        - applications
      ports:
        - "80:80"
      depends_on:
       - mysql
      links:
        - mysql
    mysql:
      build:
        context: ./mysql
        volumes_from:
          - mysql_store
      environment:
        - MYSQL_DATABASE=testapp
        - MYSQL_USER=johnm
        - MYSQL_PASSWORD=johnm
        - MYSQL_ROOT_PASSWORD=secret
      volumes:
        - ./mysql/save:/var/lib/mysql
      ports:
        - "3306:3306"

我的 MySQL Dockerfile 如下所示

FROM mysql:8

MAINTAINER Mahmoud Zalt <mahmoud@zalt.me>

#####################################
# Set Timezone
#####################################

ARG TZ=UTC
ENV TZ ${TZ}
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN chown -R mysql:root /var/lib/mysql/

ADD my.cnf /etc/mysql/conf.d/my.cnf

CMD ["mysqld"]

EXPOSE 3306

我的 Apache Dockerfile 看起来像这样:

FROM php:7.0-apache
#COPY ./src/ /var/www/html/i
#RUN apt-get update && add-apt-repository ppa:ondrej/php && apt-get update && apt-get install php7.0-mysql
RUN apt-get update && apt-get install -y \
    && docker-php-ext-install pdo pdo_mysql \
    && docker-php-ext-enable pdo pdo_mysql

最后我的index.php看起来像这样

<?php
    $db = new PDO('mysql:host=localhost;port=3306;dbname=testapp', 'root', 'secret');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    var_dump($db->query('SELECT * from users'));

针对我的数据库主机,我尝试了“db”、“localhost”和“127.0.0.1”。

如果有任何帮助,将不胜感激!

1个回答

16
您需要用作 DNS 名称的是服务名称:mysql
 $db = new PDO('mysql:host=mysql;port=3306;dbname=testapp', 'root', 'secret');

因为您将MySQL服务命名为这样:

    mysql:
      build:
        context: ./mysql
...

2
啊,太酷了。我相信Docker会为放在链接下的所有内容创建DNS别名,因此本质上MySQL将链接到0.0.0.0。非常感谢您的帮助。 - John Mack
@Robert 给出了有帮助的答案。 - Simone Bonelli
连接 MySQL CLI 客户端,从主机系统外部到容器内部 $ mysql -h localhost -P 3306 --protocol=tcp -u root -p - Simone Bonelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接