Docker将PHP容器连接到MySQL [英] Docker Connecting PHP container to MySQL

查看:340
本文介绍了Docker将PHP容器连接到MySQL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个容器,一个apache-php容器和一个mysql db容器。
我正在尝试获取我的PHP脚本来查询我的sql数据库。
但是我收到以下错误;

I have two containers, a apache-php container, and a mysql db container. I am trying to get my php script to query my sql database. I am however receiving the following errors;

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

AND

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

当切换主机地址时,我认为我缺少Docker的一些基本知识,这使我发疯。

when toggling the host address, i think i am missing something fundamental to docker and this is driving my crazy.

我的Docker组成

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看起来像

my mysql dockerfile looks like

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看起来像;

my apache dockerfile looks like;

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看起来像

and finally my index.php looks like

<?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。

For my database host i have tried "db", "localhost" and "127.0.0.1".

对此的任何帮助将不胜感激!

Any help on this will be greatly appreciated!

推荐答案

您需要使用DNS名称作为服务名称: mysql

What you need to use as DNS name is the service name: mysql:

 $db = new PDO('mysql:host=mysql;port=3306;dbname=testapp', 'root', 'secret');

由于您这样命名,因此MySQL组合服务为:

Because you named as so the MySQL compose service:

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

这篇关于Docker将PHP容器连接到MySQL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆