Таким образом, у меня есть набор сервисов Docker (работающих на Ubuntu), которые почти работают на данный момент:
Я установил их в файле 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 работать вместе. Любая функциональная комбинация из трех будет для меня отличной, но на удивление я действительно не нашел публичного репо, которое это сделало.
Спасибо за любые указатели.
Я нашел свою проблему: я сделал 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();
после того, как файл, который он существует, был импортирован.
Спасибо всем за ваши усилия.
Я не знаю, можно ли использовать его полностью, но мой файл connectDB:
<?php
$conn = mysqli_connect("localhost","root","password","nameDb");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
?>
В компоновке докеров псевдоним ссылки - "service: alias" (https://docs.docker.com/compose/compose-file/compose-file-v2/#links). Я думаю, что в вашем примере на веб-сервере имя хоста базы данных "mysql".
ping db
, он получает тот же ip, что и при запуске ping mysql
я пробовал оба пути и получал одинаковый ответ от PHP-сервера. Я также попробовал links: - db
, так же, как вы видите в сервисе phpmyadmin.
docker-compose up
. Тогда вы сможете получить доступ к БД поdb
не поlocalhost
. Также требуется некоторое время для загрузки базы данных, для получения дополнительной информации о последовательности запуска, пожалуйста, посетите. docs.docker.com/compose/startup-orderdb