Docker 将 PHP 容器连接到 MySQL
Docker Connecting PHP container to MySQL
我有两个容器,一个 apache-php 容器和一个 mysql db 容器。
我正在尝试让我的 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 撰写看起来像;
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"
我的mysqldocker文件看起来像
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 docker文件看起来像;
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”。
如有任何帮助,我们将不胜感激!
您需要用作 DNS 名称的是服务名称:mysql
:
$db = new PDO('mysql:host=mysql;port=3306;dbname=testapp', 'root', 'secret');
因为您这样命名 MySQL 撰写服务:
mysql:
build:
context: ./mysql
...
我有两个容器,一个 apache-php 容器和一个 mysql db 容器。 我正在尝试让我的 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 撰写看起来像;
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"
我的mysqldocker文件看起来像
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 docker文件看起来像;
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”。
如有任何帮助,我们将不胜感激!
您需要用作 DNS 名称的是服务名称:mysql
:
$db = new PDO('mysql:host=mysql;port=3306;dbname=testapp', 'root', 'secret');
因为您这样命名 MySQL 撰写服务:
mysql:
build:
context: ./mysql
...