connection failed between two linked containers : apache2/php & mysql - php

for my two containers:
Container 1:
- name: boxoffice
- containerPort : 80
- hostPort: 3030
- service installed : apache2 and php
command run container 1:
docker run --name=boxoffice -p 3030:80 -v /Users/mac/Desktop/storage-web:/var/www/app -d --link=db medoneapache:latest
Container 2:
- name: db
- containerPort : 3306
- hostPort: 3306
- service installed : mysql
command run container 2:
docker run --name=db -p 3306:3306 -v /Users/mac/Desktop/storage-db:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=medone -d mysqlmedone:1.0
i linked the first container "boxoffice" to the second container "db" via --link=db
and i create a php file to test the mysql connection that having a database called : profil
connection-php-mysql.php (/var/www/app) in "boxoffice" container:
<?php
$servername = "db";
$username = "root";
$password = "medone";
// Create connection
$conn = mysqli_connect($servername, $username, $password);
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>
Here is the error that i got :
Warning: mysqli_connect(): The server requested authentication method unknown to the client [caching_sha2_password] in /var/www/app/index.php on line 7
Warning: mysqli_connect(): (HY000/2054): The server requested authentication method unknown to the client in /var/www/app/index.php on line 7
Connection failed: The server requested authentication method unknown to the client
i inspected the first container to get the host ip address : 172.17.0.2 and replaced it with db as servername but i got the same error
and i can't get the username as root getting the error:
mysql -u root
ERROR 1045 (28000): Access denied for user 'root'#'localhost' (using password: NO)

You need to upgrade to PHP 7.4.4.
The support for caching_sha2_password has been added both in mysqli and PDO only in PHP 7.4.4.
The relevant feature-request: https://bugs.php.net/bug.php?id=79275
The GitHub PR: https://github.com/php/php-src/pull/5210

Related

"Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] Connection refused" after updating a PHP file [duplicate]

I am trying to use a PHP connection to connect MySQL Database which is on phpmyadmin. Nothing fancy about the connection just trying to see whether the connection is successful or not. I am using MAMP to host the database, the connection I am trying to use is this:
<?php
$servername = "127.0.0.1";
$username = "root";
$password = "root";
try {
$conn = new PDO("mysql:host=$servername;dbname=AppDatabase", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
}
catch(PDOException $e)
{
echo "Connection failed: " . $e->getMessage();
}
?>
I have been using postman to test to see if the connection is working, but I keep receiving this error message:
Connection failed: SQLSTATE[HY000] [2002] Connection refused
Before I was receiving an error message of:
Connection failed: SQLSTATE[HY000] [2002] No such file or directory
This was because I had set the servername to localhost, through changing this to the IP address it has given me connection refused and I have no idea what is wrong.
Any help regarding this would be appreciated.
I found the reason why the connection was not working, it was because the connection was trying to connect to port 8888, when it needed to connect to port 8889.
$conn = new PDO("mysql:host=$servername;port=8889;dbname=AppDatabase", $username, $password);
This fixed the problem, although changing the server name to localhost still gives the error.
Connection failed: SQLSTATE[HY000] [2002] No such file or directory
But it connects successfully when the IP address is entered for the server name.
In my case MySQL sever was not running. I restarted the MySQL server and issue was resolved.
//on ubuntu server
sudo /etc/init.d/mysql start
To avoid MySQL stop problem, you can use the "initctl" utility in Ubuntu 14.04 LTS Linux to make sure the service restarts in case of a failure or reboot. Please consider talking a snapshot of root volume (with mysql stopped) before performing this operations for data retention purpose[8]. You can use the following commands to manage the mysql service with "initctl" utility with stop and start operations.
$ sudo initctl stop mysql
$ sudo initctl start mysql
To verify the working, you can check the status of the service and get
the process id (pid), simulate a failure by killing the "mysql"
process and verify its status as running with new process id after
sometime (typically within 1 minute) using the following commands.
$ sudo initctl status mysql # get pid
$ sudo kill -9 <pid> # kill mysql process
$ sudo initctl status mysql # verify status as running after sometime
Note : In latest Ubuntu version now initctl is replaced by systemctl
I spent quite a few hours in a docker environment where all my containers are docker containers and I was using Phinx for migrations. Just to share different responses with different configurations.
Working solutions
"host" => "db", // {docker container's name} Worked
"host" => "172.22.112.1", // {some docker IP through ipconfig - may change on every instance - usually something like 172.x.x.x} Worked
Non-working solutions
"host" => "127.0.0.1", // SQLSTATE[HY000] [2002] Connection refused
"host" => "docker.host.internal", // SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name does not resolve
"host" => "localhost", // SQLSTATE[HY000] [2002] No such file or directory
I was running Phinx in following way.
docker compose --env-file .env run --rm phinx status -e development
Using MAMP I changed the host=localhost to host=127.0.0.1. But a new issue came "connection refused"
Solved this by putting 'port' => '8889', in 'Datasources' => [
Using MAMP ON Mac, I solve my problem by renaming
/Applications/MAMP/tmp/mysql/mysql.sock.lock
to
/Applications/MAMP/tmp/mysql/mysql.sock
1. server cert verify flag
I was required to use SSL to connect, and needed to set PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT to false in the new PDO options array, besides the entry PDO::MYSQL_ATTR_SSL_CA for the CA file.
Without it, the mysql log on the server helpfully mentions
2021-07-27 17:02:51 597605 [Warning] Aborted connection 597605 to db: 'unconnected' user: 'unauthenticated' host: '192.168.10.123' (This connection closed normally without authentication)
where I was definitely passing the right db and username and such in the DSN. An empty options array will show the db and user in the error log, at least. I am sure there is a valid, technical reason for these things.
I am adding this information so I can more easily find it, the next time I end up on this page..
2. host in connection string
In the context of SSL, I've also seen the error when using the IP address instead of the hostname to connect, if the hostname was used as CN (Common Name) in the certificate.
For me was php version from mac instead of MAMP, PATH variable on .bash_profile was wrong. I just prepend the MAMP PHP bin folder to the $PATH env variable. For me was:
/Applications/mampstack-7.1.21-0/php/bin
In terminal run vim ~/.bash_profile to open ~/.bash_profile
Type i to be able to edit the file, add the bin directory as PATH variable on the top to the file:
export PATH="/Applications/mampstack-7.1.21-0/php/bin/:$PATH"
Hit ESC, Type :wq, and hit Enter
In Terminal run source ~/.bash_profile
In Terminal type which php, output should be the path to MAMP PHP install.
I had the same issue on a docker container from php:8.0-fpm-alpine image. I just added the following line in the Dockerfile and it fixed the issue:
RUN apk add mysql-client
I had a similar problem once, turned out the User in the database was created with something like:
CREATE USER 'webpage'#'localhost' IDENTIFIED BY 'password';
worked fine when the connection details php script had localhost, but not when the IP address was there. A quick swap (ip address when creating user and localhost in connection details) revealed those two things have to match.
For everyone if you still strugle with Refusing connection, here is my advice. Download XAMPP or other similar sw and just start MySQL. You dont have to run apache or other things just the MySQL.

Ubuntu 20.04 LEMP Stack PHP 7.4 PDO Connection error

System: Ubuntu 20.04 (1 SQL Server and 1 Webserver)
mariadb Ver 15.1 Distrib 10.3.31-MariaDB
PHP 7.4.3
I'm currently facing a problem setting up my LEMP Webserver.
I already configured PHP and Nginx, also secure installed mariadb.
But no matter what I do I always run in the following problem:
mysql error log: 2021-08-22 15:47:40 37 [Warning] Access denied for user
''#'Hostname' (using password: NO)
Webbrowser: Server can't handle request HTTP500 Error
I created the database user called webcompiler#Server_ip on the database and gave him full permissions
on the specific database.
On the SQL Server itself I can login via mysql -u root -p (works fine).
But not via mysql -u webcompiler -p
my.cnf in mariadb:
[mysqld]
skip-networking=0
skip-bind-address
The PDO Connection script:
<?php
$servername ="*";
$dBUsername = "webcompiler";
$dBPassword = "*";
$dBName = "*";
$pdo = new PDO("mysql:host=$servername;dbname=$dBName",$dBUsername , $dBPassword);
if ($pdo->connect_error) { die("Connection failed: " . $pdo->connect_error); }
Thanks for the help so far!
I changed accordingly but now I get this error:
[Warning] Access denied for user 'webcompiler'#'host' (using password: YES)
As "Using Password Yes" points to a wrong password, I changed it to a
simple one to see if that fixes the Error.
It did. I changed it to another one and escaping special characters was the key to making it work.
Thanks for all the help!

docker container can't connect to localhost mysql server

im new to docker, have tried to setup my docker php-apache container to connect to mysql db running on my localhost. i created my docker image as follows:
dockerfile:
FROM php:7.2-apache
RUN docker-php-ext-install mysqli
build new docker image:
docker build -t will-php-env .
my php application is placed in my home folder(/home/will/php/)
i run my container as follows:
sudo docker run -it -p 180:80 -v "$PWD":/var/www/html will_php_env
the code for connection is:
mysqli_real_connect( mysqli_init(),"192.168.1.17", "root", "password", "bugtracker" );
error:
Warning: mysqli_real_connect(): (HY000/1045): Access denied for user 'root'#'172.17.0.2' (using password: YES) in /var/www/html/mantisbt-2.19.0/will.php on line 3
by the way, i will be able to connect to mysql server from the same container if i use the following code:
<?php
$will2k = new mysqli("192.168.1.17", "gkeepa", "password", "php");
please let me know why the container is not able to connect to mysql server on my localhost using mysqli_real_connect. thanks in advance

How to configure XAMPP to connect to MySQL remotely

I have a problem to connect my online MySQL database from my local system.
I installed XAMPP on my Windows 7 and created a PHP file with this code:
<?php
$db_path = mysqli_connect('printcity24.com', 'printci1_admin', 'xr10s20191', 'printci1_db', '3306');
if(!$db_path) {
echo mysqli_connect_error();
}else{
echo "Connected successfully";
}
?>
Then i created a database on my website : www.printcity24.com
My web host admin configured my host and opened firewall.
When i use XAMPP command line to connect to my database every thing is ok, i can connect to my database remotely with this code :
# mysql -u printci1_admin -p -h printcity24.com
but when i use php code to connect to my database i get this error :
Warning: mysqli_connect(): MySQL server has gone away in D:\Xampp Server\htdocs\st\index.php on line 2
Warning: mysqli_connect(): (HY000/2006): MySQL server has gone away in D:\Xampp Server\htdocs\st\index.php on line 2
MySQL server has gone away
I upload my php code on to other websites and test for connection and everything is "ok" but on my local xampp can't connect.
In this link said i have to use this command :
setsebool -P httpd_can_network_connect=1
but I don't know where to put this code and how to configure my xampp.

PHP PDO : SQLSTATE[HY000] [2002] Connection refused

I ran into this Problem with the PHP Data Object.
I cannot connect to my Database. First here is my PHP Script:
<?php
$serverName = "127.0.0.1";
$port = "3306";
$dbName = "callitTime";
$userName = "root";
$password = "superstrongPassword";
try {
$db = new PDO("mysql:host=$serverName;dbname=$dbName;port=$port;",
$userName, $password);
} catch (PDOException $pdoE) {
echo 'An Error occurred: ' . $pdoE->getMessage();
}
?>
I am using:
PHP 7.1.16
Nginx 1.13.12-1
MySQL 8.0.11-1debian9
All as Docker Containers.
A phpinfo() tells me that PDO Drivers are loaded as follows:
PDO Drivers:
sqlite
mysql
Driver Versions:
mysqlnd 5.0.12-dev
SQLite Library 3.15.1
I get the Error:
An Error occurred: SQLSTATE[HY000] [2002] Connection refused
I can connect to the same Database via Phpstorm with the same Password and Username.
It seems that this is not a problem related to the PHP Configuration.
The error Connection refused shows, from my point of view, that you can't establish a connection from the php container to the mysql container.
You need to expose the 3306 Port to the Webserver Container so that the PHP Container can establish a connection to the database. If you already bridged the containers you need to use the containers IP address and not your loopback 127.0.0.1.
Please see this answer for more information how to connect both containers and how to make a connection from a php to a mysql container:
https://stackoverflow.com/a/43128428/1118905
To narrow down the problem, you can try to establish a connection from within the PHP Container via Netcat to your given DB Host.
For example you can try to establish a connection with the following commands:
Get into the container from which you want to test the connection. docker exec -it <name_of_container> bash
Test to open up a connection via netcat (If not all ready available install it via f.e. apt) nc -vz 127.0.0.1:3306
If you are inside container, 127.0.0.1 is not known as a service that hosts the database. You can use the mysql container name instead. For example $serverName = "mysql"; depending on the name of your container.
sample service definition
services:
mysql:
image: 'mysql:5.5'
container_name: mysql
ports:
- '33066:3306'
...
Also note that the port to be used is the internal one.

Categories