PHP не может найти сервер MySQL в Docker

0

Таким образом, у меня есть набор сервисов Docker (работающих на Ubuntu), которые почти работают на данный момент:

  • Веб-сервер php/apache
  • Сервер MySQL
  • Веб-сервер PHPMyAdmin

Я установил их в файле docker-compose, описанном ниже, и PHPMyAdmin может взаимодействовать с SQL-сервером, но используя скрипт подключения PHP ниже и вызывая db_connect(), дает следующую страницу с ошибкой:

Warning: mysqli::__construct():(HY000/2002): No such file or directory in /var/www/html/api/sql_db.php on line 12
MySQLi Connection failed: No such file or directory
SESSION: Array ( [sql_server] => db [username] => root[password] => test [dbname] => bravo 

Файл, содержащий db_connect():

<?php
session_start();
$servername = "db";
$username = "root";
$password = "test";
$dbname = "bravo";
$_SESSION['sql_server'] = $servername;
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;
$_SESSION['dbname'] = $dbname;
function db_connect(){
  $conn = new mysqli($servername, $username, $password, $dbname);
  if ($conn->connect_errno) {
    printf("MySQLi Connection failed: %s\n", $conn->connect_error."<br>SESSION: ");
    print_r($_SESSION);
    session_destroy();
    unset($_SESSION);
    exit();
  }
}

docker-compose.yml:

version: '3'

services:
  db:
    image: mysql:5.7.23
    container_name: db
    command: --default-authentication-plugin=mysql_native_password
    ports: 
      - 3306:3306
    environment:
      MYSQL_DATABASE: bravo
      MYSQL_USER: user
      MYSQL_PASSWORD: test
      MYSQL_ROOT_PASSWORD: test
    restart: always
    volumes:
      - ./dump:/docker-entrypoint-initdb.d
      - ./db/data/mysql:/var/lib/mysql
    networks: 
      - default

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links: 
      - db
    ports:
      - 8000:80
    environment:
      MYSQL_USER: user
      MYSQL_PASSWORD: test
      MYSQL_ROOT_PASSWORD: test
    depends_on:
      - db

  websrv:
    build: .
    ports: 
      - 8080:80
    volumes:
      - ./www:/var/www/html
    links:
      - db
    networks:
      - default
    depends_on:
      - db

и, наконец, Dockerfile ссылается docker-compose для websrv службы:

FROM php:7.1.2-apache

RUN docker-php-ext-install mysqli 

Я прочитал несколько сообщений на форуме о том, почему mysqli не подключается, но я не нашел ответа, который решает мою проблему.

Я также попытался получить внутренний ip контейнера докера, но мне не повезло.

Мой выбор изображений докеров был результатом того, что я пытался просто заставить php & mysqli, phpMyAdmin и MySQL работать вместе. Любая функциональная комбинация из трех будет для меня отличной, но на удивление я действительно не нашел публичного репо, которое это сделало.

Спасибо за любые указатели.

  • 0
    Если вы начинаете с docker-compose up . Тогда вы сможете получить доступ к БД по db не по localhost . Также требуется некоторое время для загрузки базы данных, для получения дополнительной информации о последовательности запуска, пожалуйста, посетите. docs.docker.com/compose/startup-order
  • 0
    @nicholasnet, я начинаю с docker-compose. Как вы можете видеть в моем PHP-скрипте, я ищу узел с именем db
Показать ещё 1 комментарий
Теги:
docker
mysqli
docker-compose

3 ответа

0
Лучший ответ

Я нашел свою проблему: я сделал PHP goof. То, как я написал свой файл, переменные были определены вне функции, и когда область была изменена внутри функции, эти значения были либо неопределенными, либо нулевыми.

Исправление этой, по общему признанию, глупой проблемы заключается в том, чтобы поместить эти определения значений внутри функции, например.

<?php
function db_connect(){
  $servername = "db";
  $username = "root";
  $password = "test";
  $dbname = "bravo";

  $conn = new mysqli($servername, $username, $password, $dbname);
  if ($conn->connect_errno) {
    printf("MySQLi Connection failed: %s\n", $conn->connect_error."<br>SESSION: ");
    print_r($_SESSION);
    session_destroy();
    unset($_SESSION);
    exit();
  }
  return $conn;
}

Затем соединение можно выполнить, вызвав $conn = db_connect(); после того, как файл, который он существует, был импортирован.

Спасибо всем за ваши усилия.

0

Я не знаю, можно ли использовать его полностью, но мой файл connectDB:

<?php
$conn = mysqli_connect("localhost","root","password","nameDb");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
?>
0

В компоновке докеров псевдоним ссылки - "service: alias" (https://docs.docker.com/compose/compose-file/compose-file-v2/#links). Я думаю, что в вашем примере на веб-сервере имя хоста базы данных "mysql".

  • 0
    Итак, я видел это, но если вы на самом деле запускаете сервисы и с веб-сервера запускаете ping db , он получает тот же ip, что и при запуске ping mysql я пробовал оба пути и получал одинаковый ответ от PHP-сервера. Я также попробовал links: - db , так же, как вы видите в сервисе phpmyadmin.
  • 0
    Я вернулся и попытался исправить это, и, как я упоминал выше, я вижу ту же ошибку. Я изменил пост, чтобы показать это. Кроме того, я использую версию 3 файла compose. не версия 2.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню