当前位置: 首页 > 知识库问答 >
问题:

为什么PHP docker容器不能查找MYSQL容器的主机名?

淳于博
2023-03-14

我已经创建并将php-apache容器与MYSQL容器链接起来。但是当我试图从php文件中使用PDO建立连接时,我得到了错误。有人知道怎么修好它吗?多谢了。

PDO错误:

致命错误:未捕获的PDOException:PDO::__Construct():php_network_getAddress:getaddrinfo失败:名称或服务在/var/www/html/index.php:3 Stack Trace:#0/var/www/html/index.php(3):pdo->__Construct('mysql:host=mysq...','root','root')#1{main}下一个PDOException:SQLState[HY000][2002]php_network_getAddress:getaddrinfo失败:名称或服务在

我的目录结构:

.
├── 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个答案

邵弘致
2023-03-14

毕竟,在我的php代码中,主机定义后面有一个逗号,而不是分号。我向你道歉。

濮阳驰
2023-03-14

我有两个问题在做这件事:

1)php:Apache映像需要大量的工作来运行php应用程序,最好只制作自己的映像,我是从ubuntu 18:04的映像中制作的

2)我不记得为什么,但需要将mysql设置为允许mysql_native_passwords,以便与php一起工作(在我的情况下)

下面是我在课堂上为一个测试做的docker-compose文件(因此名为examen的标记),以共享我的web应用程序:

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

我是一个超级新手开发人员(还在学习),请对我宽容一点。

编辑。如果您创建了自己的映像,请不要忘记cmd apachectl-d foreground,以便在运行容器时启动apache服务。

漆雕育
2023-03-14

首先,您不需要链接:,这将自动完成,因为两个服务都在同一个网络中。

其次,depends_on不会等到MySQL服务器启动并运行,并且PHP服务有可能在准备就绪之前开始通信,这就是您收到此错误的原因。

在这种情况下,最好为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
 类似资料:
  • 问题内容: 我尝试使用和设置元素的样式。 然而,它没有工作:表现得像,并表现得像个。 在Firefox和Chrome上都会发生这种情况,但奇怪的是,它在IE上有效。 是虫子吗?在HTML5和CSS Flexible Box Layout规范中,我都找不到应该有的特殊行为。 问题答案: 根据错误984869- 对按钮元素不起作用, 不能在纯CSS中实现(由浏览器实现),因此从CSS的角度来看,它们有

  • Docker中容器网络不通,宿主机跟容器,容器跟docker0,容器跟容器网络都不通? 使用 tcpdump -i docker0 抓包时容器的网络就通了,但是关闭 tcpdump -i docker0容器的网络又不通了。

  • 我正在我的机器上的docker容器中运行服务器。我想从我的机器(主机)向容器内的服务器发送HTTP请求。当我在容器中使用HTTP发送GET请求时,它会检测服务器。但是,如果我向容器的IP地址发送相同的请求(这次是从容器外部的主机),它会告诉我: 或者这个: 下面是我启动容器时使用的命令: 以及我为发送请求而运行的Python脚本: 下面是我用来查找容器IP地址的命令: 我知道这个问题,但我没有使用

  • (由于我对Docker或mysql管理的了解有限,这可能是一个愚蠢的问题,但由于我花了整整一个晚上讨论这个问题,所以我敢问这个问题。) 概括地说 我想在docker容器中运行mysql,并从我的主机连接到它。到目前为止,我取得的最好成绩是: 更多详细信息 我正在使用以下: 在有此文件的目录中,我可以成功地构建映像并运行它: 当我连接到图像上时,它似乎工作得很好: 然而,我并没有从主持人那里获得那么

  • 问题内容: 我正在开发服务,并在那里使用docker compose来旋转诸如postgres,redis,elasticsearch之类的服务。我有一个基于RubyOnRails的Web应用程序,并从所有这些服务中进行读写操作。 这是我的 我可以在此网络中ping容器 到目前为止,一切都很好。现在我想在主机上的Rails应用程序上运行ruby,但是能够像目前这样使用url访问postgres实例

  • 有没有办法通过在容器的命令行中发送命令来重命名lxc容器主机名?我知道您可以执行类似于的操作,然后使用()重命名配置中的主机名和路径。 但是,我可以不离开容器的控制台,然后在主控制台中键入内容来完成它吗?