-
-
Save jcavat/2ed51c6371b9b488d6a940ba1049189b to your computer and use it in GitHub Desktop.
Create this directories structure: | |
. | |
├── docker-compose.yml | |
├── Dockerfile | |
├── dump | |
│ └── myDb.sql | |
├── sessions | |
└── www | |
└── index.php | |
version: "2" | |
services: | |
www: | |
build: . | |
ports: | |
- "8001:80" | |
volumes: | |
- ./www:/var/www/html/ | |
links: | |
- db | |
networks: | |
- default | |
db: | |
image: mysql | |
ports: | |
- "3306:3306" | |
environment: | |
MYSQL_DATABASE: myDb | |
MYSQL_USER: user | |
MYSQL_PASSWORD: test | |
MYSQL_ROOT_PASSWORD: test | |
volumes: | |
- ./dump:/docker-entrypoint-initdb.d | |
- persistent:/var/lib/mysql | |
networks: | |
- default | |
phpmyadmin: | |
image: phpmyadmin/phpmyadmin | |
links: | |
- db:db | |
ports: | |
- 8000:80 | |
environment: | |
MYSQL_USER: user | |
MYSQL_PASSWORD: test | |
MYSQL_ROOT_PASSWORD: test | |
volumes: | |
persistent: |
FROM php:7.1.2-apache | |
RUN docker-php-ext-install mysqli |
<!-- put in ./www directory --> | |
<html> | |
<head> | |
<title>Hello...</title> | |
<meta charset="utf-8"> | |
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"> | |
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script> | |
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> | |
</head> | |
<body> | |
<div class="container"> | |
<?php echo "<h1>Hi! I'm happy</h1>"; ?> | |
<?php | |
$conn = mysqli_connect('db', 'user', 'test', "myDb"); | |
$query = 'SELECT * From Person'; | |
$result = mysqli_query($conn, $query); | |
echo '<table class="table table-striped">'; | |
echo '<thead><tr><th></th><th>id</th><th>name</th></tr></thead>'; | |
while($value = $result->fetch_array(MYSQLI_ASSOC)){ | |
echo '<tr>'; | |
echo '<td><a href="#"><span class="glyphicon glyphicon-search"></span></a></td>'; | |
foreach($value as $element){ | |
echo '<td>' . $element . '</td>'; | |
} | |
echo '</tr>'; | |
} | |
echo '</table>'; | |
$result->close(); | |
mysqli_close($conn); | |
?> | |
</div> | |
</body> | |
</html> |
-- put in ./dump directory | |
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; | |
SET time_zone = "+00:00"; | |
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; | |
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; | |
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; | |
/*!40101 SET NAMES utf8mb4 */; | |
CREATE TABLE `Person` ( | |
`id` int(11) NOT NULL, | |
`name` varchar(20) NOT NULL | |
) ENGINE=InnoDB DEFAULT CHARSET=latin1; | |
INSERT INTO `Person` (`id`, `name`) VALUES | |
(1, 'William'), | |
(2, 'Marc'), | |
(3, 'John'); | |
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; | |
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; | |
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; |
sudamar: I had the exact same problem as you. I solved it by using an older version of the software i.e. by doing the following:
Clean everything:
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker rmi my-old-docker-image
docker volume rm $(docker volume ls -q)
Dockerfile
I changed the Dockerfile to the following (using an older version):
FROM php:7.0.30-apache
RUN docker-php-ext-install mysqli
docker-compose.yml file
...and I changed the part of the docker-compose.yml file from:
db:
image: mysql
To
db:
image: mysql:5.7.13
Rebuild:
docker-compose up -d
Now wait about 20 seconds before trying to access the below webpages (I noticed that it takes some time for the mysql service to start up etc).
Now it you browse to http://192.168.1.106:8001/ and http://192.168.1.106:8000/index.php they both work (well they do for me now!)
Although I really believe that the decision of the MySQL maintainers is wrong, I do believe that they are not going to change it back. So, I verified out how it can work without downgrading. It is a bit more of work, but needs to be done only once:
- Change the Dockerfile to read
FROM php:7.2.6-apache
- Bring everything up, then login into the mysql container:
$ docker exec -t -i container_mysql_name /bin/bash
- Change the password storage for the user of interest:
#mysql -uroot -p [isempty]
mysql> ALTER USER 'user' IDENTIFIED WITH mysql_native_password BY 'test';
-
Change/Create all users you need with the option "mysql_native_password"
-
logout
This works fine for me, as the mysql data is persistent, and you can use the latest versions of the packages.
not able to login in to phpmyadmin
mysqli_real_connect(): The server requested authentication method unknown to the client [caching_sha2_password]
not able to login in to phpmyadmin
mysqli_real_connect(): (HY000/2002): Operation timed out
newest version of mysql doesn't work.
downgrade to a mysql:5.7 or mariadb
@OmegaWolfProjects: Thank you for your comment. It solved half of my issues. I have followed all the steps given in the comment. Still, I can't access http://192.168.1.106:8001/. It is showing Forbidden access.
Then, I have run below command in my command shell
docker exec -it proj1_www_1 bash which enters into
root@c2b400b7164d:/var/www/html#
Here, When I tried to see list of files by using ls command. It is not showing any of the files like index.php (The directory is empty).
Please help me to fix this issue
Thanks
Sricharan
Following your steps, i was able to connect :) But now i am trying to enable PDO_MYSQL instead of MYSQLI !
I add the line "RUN docker-php-ext-install pdo pdo_mysql" in "Dockerfile" but it still doesn't work ! i have the error "Erreur : could not find driver"
Any ideas ?
Thanks
I got a error php-mysql module missing any solution please
This is not working out of the box on the latest centos7 latest docker latest docker-compose:
ERROR: In file './docker-compose.yml', volume must be a mapping, not a NoneType.
All I had to do was move:
volumes:
persistent:
From the bottom of the docker-compose.yml file
To the Top (above services: below version:) of the file as shown:
version: "2"
volumes:
persistent:
services:
................................
This got the container to build and run. But I am having issues apparently due to a default character set changing. I may work on this later really wanting to use this.
Warning: mysqli_connect(): Server sent charset (255) unknown to the client.
Warning: mysqli_connect(): (HY000/2054): Server sent charset unknown to the client.
can some one help me pls ?
I changed the Dockerfile to the following (using the new version):
FROM php:7.3-apache RUN docker-php-ext-install mysqli
...and I changed the part of the docker-compose.yml file from:
db: image: mysql
To
db: image: mysql:8.0
All this is in a virtual server (at host [1 & 1] (https://www.ionos.com/servers/vps)), a Linux server on Ubuntu that contains my Docker.
On this Docker I try to install a web server on which I will put websites and databases.
I chose to do this because I will need access to databases from a JAVA application. Something that would not be possible if I had chosen a simple web host instead of this virtual server.
The issue is when i run the docker-compose :
docker-compose up -d
I have this error :
ERROR: yaml.parser.ParserError: while parsing a block mapping in "./docker-compose.yml", line 3, column 5 expected <block end>, but found '<block mapping start>' in "./docker-compose.yml", line 15, column 9
I am a noob in docker, so can you guys help me to resolve that issue please ?
I have this errors:
**Warning: mysqli_connect(): Server sent charset (255) unknown to the client. Please, report to the developers in /var/www/html/index.php on line 19
Warning: mysqli_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers in /var/www/html/index.php on line 19
Warning: mysqli_query() expects parameter 1 to be mysqli, boolean given in /var/www/html/index.php on line 21
Fatal error: Uncaught Error: Call to a member function fetch_array() on null in /var/www/html/index.php:24 Stack trace: #0 {main} thrown in /var/www/html/index.php on line 24**
Version 8.0.4 & newer requires you to change to mysql_native_password, https://mysqlserverteam.com/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password/
The /sessions folder is completely unnecessary, I removed it.
I made an updated version of this with plenty of fixes, https://gist.github.com/Beyarz/674b24d03614fde205a38f449800857a
Thanks !
@Beyarz thanks
@Beyarz thanks
No worries! It was a pain to get everything to work, I hope no one has to experience that again.
Although I really believe that the decision of the MySQL maintainers is wrong, I do believe that they are not going to change it back. So, I verified out how it can work without downgrading. It is a bit more of work, but needs to be done only once:
- Change the Dockerfile to read
FROM php:7.2.6-apache
- Bring everything up, then login into the mysql container:
$ docker exec -t -i container_mysql_name /bin/bash
- Change the password storage for the user of interest:
#mysql -uroot -p [isempty]
mysql> ALTER USER 'user' IDENTIFIED WITH mysql_native_password BY 'test';
- Change/Create all users you need with the option "mysql_native_password"
- logout
This works fine for me, as the mysql data is persistent, and you can use the latest versions of the packages.
I followed your instructions but when i try logging into mysql as root with
~ mysql -uroot -p
Attempt 1: (blank)
returned: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
Attempt 2: test (the password in yml file for root)
returned: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
Can't get into mysql directly to change settings as root.
Although I really believe that the decision of the MySQL maintainers is wrong, I do believe that they are not going to change it back. So, I verified out how it can work without downgrading. It is a bit more of work, but needs to be done only once:
1. Change the Dockerfile to read
FROM php:7.2.6-apache
1. Bring everything up, then login into the mysql container:
$ docker exec -t -i container_mysql_name /bin/bash
1. Change the password storage for the user of interest:
#mysql -uroot -p [isempty]
mysql> ALTER USER 'user' IDENTIFIED WITH mysql_native_password BY 'test';1. Change/Create all users you need with the option "mysql_native_password" 2. logout
This works fine for me, as the mysql data is persistent, and you can use the latest versions of the packages.
A other solution that works for me is to add following line into docker-compose.yml
db:
....
command: mysqld --default-authentication-plugin=mysql_native_password
.....
Hello, do you know how to configure additional password protection phpmyadmin at apache level?
Solved
Dockerfile -->
FROM php:8.0-apache
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
RUN apt-get update && apt-get upgrade -y
Docker-Composer-->
version: "2"
services:
www:
build: .
container_name: webhost
ports:
- "8001:80"
volumes:
- ./www:/var/www/html/
links:
- db
networks:
- default
db:
image: mysql
restart: always
container_name: DataBaseServer
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: myDb
MYSQL_USER: user
MYSQL_PASSWORD: test
MYSQL_ROOT_PASSWORD: test
volumes:
- ./dump:/docker-entrypoint-initdb.d
- persistent:/var/lib/mysql
networks:
- default
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: PHP_MySQL
links:
- db:db
ports:
- 8000:80
environment:
MYSQL_USER: user
MYSQL_PASSWORD: test
MYSQL_ROOT_PASSWORD: test
volumes:
persistent:
Bellow my fix to resolve connection issues ,
FROM php:7.2-apache
RUN a2enmod rewrite
RUN docker-php-ext-install pdo pdo_mysql
RUN apt-get update
&& apt upgrade -y
&& apt-get install -y libzip-dev
&& apt-get install -y zlib1g-dev
&& apt-get install -y iputils-ping
&& apt-get install -y mycli
&& rm -rf /var/lib/apt/lists/*
&& docker-php-ext-install zip
&& docker-php-ext-install mysqli
&& docker-php-ext-enable mysqli
if someone had a problem with Laravel with an error
could not find driver (SQL: select * from
don't forget to add pdo pdo_mysql
after RUN docker-php-ext-install
so it become
FROM php:8.0.2-apache
RUN docker-php-ext-install mysqli pdo pdo_mysql
to Dockerfile
where is access and error log path
Dockerfile
FROM php:8-apache
RUN apt-get update && apt-get upgrade -y
RUN apt-get install sudo unzip wget -y
RUN docker-php-ext-install mysqli
RUN a2enmod rewrite
RUN a2enmod ssl
RUN service apache2 restart
EXPOSE 80
docker-compose.yml
version: "3.6"
services:
php:
build: .
restart: always
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
- ./log:/var/log/apache2
mysql:
image: mysql:8.0
restart: always
ports:
- "3306:3306"
command: --default-authentication-plugin=mysql_native_password
environment:
- MYSQL_DATABASE=myDb
- MYSQL_USER=user
- MYSQL_PASSWORD=test
- MYSQL_ROOT_PASSWORD=test
volumes:
- ./dump:/docker-entrypoint-initdb.d
- ./conf:/etc/mysql/conf.d
- persistent:/var/lib/mysql
phpmyadmin:
image: phpmyadmin
restart: always
ports:
- 8081:80
environment:
- PMA_HOST=mysql
volumes:
persistent:
Create this structure:
├── docker-compose.yml
├── Dockerfile
├── /dump
│ └── myDb.sql
├── /log
└── /src
└── index.php
And run "docker-compose up". Then go to localhost:8080
and you should see a table with the data loaded from the myDb.sql
file.
You can also go to localhost:8081
and log in to the database with phpmyadmin.
Server: mysql
User: user
Password: test
Database: myDb
Hi @varaskkar - Thank you.
I think, a small correction. Tree structure would be for this one is as below —
Before executing docker-compose [no need to create directory | or if you create then not "/"]
[root@ip-10-0-8-114 ~]# tree dockercompose03
dockercompose03
├── conf
├── docker-compose.yml
├── dockerfile
├── dump
│ └── myDb.sql
└── www
└── index.php
After executing docker-compose up
[root@ip-10-0-8-114 ~]# tree dockercompose03
dockercompose03
├── conf
├── docker-compose.yml
├── dockerfile
├── dump
│ └── myDb.sql
├── log
│ ├── access.log
│ ├── error.log
│ └── other_vhosts_access.log
├── src
└── www
└── index.php
5 directories, 7 files
Error at the connect with phpmyadmin: mysqli_real_connect(): (HY000/2002): php_network_getaddresses: getaddrinfo failed: Name does not resolve
Error at the connect with http://localhost:8001/ : (403) You don't have permission to access / on this server.