为什么PHP docker容器无法查找MYSQL容器的主机名?

时间:2020-03-17 08:47:00

标签: php mysql docker docker-compose dockerfile

我已经创建了php-apache容器并将其与MYSQL容器链接。但是,当我尝试使用php文件中的PDO建立连接时,出现了错误。有谁知道如何解决?谢谢。

PDO错误:

致命错误:未被捕获的PDOException:PDO :: __ construct():php_network_getaddresses:getaddrinfo失败:名称或服务在/var/www/html/index.php:3中未知堆栈跟踪:#0 / var / www / html /index.php(3):PDO-> __ construct('mysql:host = mysq ...','root','root')#1 {main}下一个PDOException:SQLSTATE [HY000] [2002] php_network_getaddresses:getaddrinfo失败:/var/www/html/index.php:3中未知的名称或服务堆栈跟踪:#0 /var/www/html/index.php(3):PDO-> __ construct('mysql:host = mysq ...','root','root')#1 {main}在第3行的/var/www/html/index.php中抛出

我的目录结构:

.
├── mysql
├── php
|   └── Dockerfile
├── src
|   └── index.php
└── docker-compose.yml

我的index.php的内容:

$connection = new PDO('mysql:host=mysql-db,dbname=app', 'root', 'root');

PHP Dockerfile:

FROM php:7.3.3-apache

RUN docker-php-ext-install -j$(nproc) pdo_mysql

docker-compose.yml:

version: '3'

services:
  apache-php:
    build:
      ./php
    volumes:
      - ./src:/var/www/html
    ports:
      - "8080:80"
    depends_on:
      - mysql-db
    links:
      - mysql-db

  mysql-db:
    image: mysql:5.7
    ports:
      - "3306:3306"
    volumes:
      - /mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: app

3 个答案:

答案 0 :(得分:1)

首先,由于两种服务都在同一网络中,因此您无需links:即可自动完成。

第二,depends_on不会等到MySQL服务器启动并运行,并且PHP服务有机会在准备就绪之前开始通信,这就是为什么会收到此错误。

在这种情况下,IT最好为您的PHP服务实现“等待”功能。

为此,您需要向您的PHP服务和类似这样的代码添加一个入口点

docker文件

COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]

docker-entrypoint.sh

#!/bin/sh -e
until nc -vz mysql-db:3306 > /dev/null; do
    >&2 echo "mysql-db:3306 is unavailable - sleeping"
    sleep 2
  done
  >&2 echo "mysql-db is up"

exec "YOUR COMMAND"
exit 0

答案 1 :(得分:0)

我这样做有2个问题:

1)php:apache图像需要大量工作来运行php应用程序,最好自己制作一个,我是从ubuntu 18:04图像中获取的

2)我不记得为什么,但是需要将mysql设置为允许mysql_native_passwords才能使用(在我的情况下)php

这是我在课堂上进行测试的docker-compose文件(因此称为“ examen”标签)以共享我的网络应用程序:

navigation.dispatch(
  CommonActions.reset({
    index: 0,
    routes: [
      {name: YOUR_ROUTE_NAME},
    ],
  })
);

PD。我是一位超级新手开发人员(仍在学习中),请放心。

编辑。如果您自己制作图像,请不要忘记version: '3' services: app: image: gnomejodas/httpd-php:examen ports: - 80:80 volumes: - ./src:/var/www/html links: - db db: image: mysql command: --default-authentication-plugin=mysql_native_password volumes: - ./db:/var/lib/mysql ,以便在运行容器时启动apache服务。

答案 2 :(得分:0)

毕竟,发现在我的php代码中,主机定义后有一个逗号,而不是分号。我很抱歉。