Nginx PHP MySQL 
Docker running Nginx, PHP-FPM, Composer, MySQL and PHPMyAdmin.
Overview
-
Before installing project make sure the following prerequisites have been met.
-
We’ll download the code from its repository on GitHub.
-
Configure Nginx With SSL Certificates
We'll generate and configure SSL certificate for nginx before running server.
-
We'll configure Xdebug for IDE (PHPStorm or Netbeans).
-
By this point we’ll have all the project pieces in place.
-
When developing, you can use
Makefilefor doing recurrent operations. -
When running, you can use docker commands for doing recurrent operations.
Install prerequisites
For now, this project has been mainly created for Unix (Linux/MacOS). Perhaps it could work on Windows. Make sure to make compatible the relative paths in the docker-compose.yml file configuration like c:\foo\bar.
All requisites should be available for your distribution. The most important are :
Check if docker-compose is already installed by entering the following command :
which docker-compose
The following is optional but makes life more enjoyable :
which make
On Ubuntu and Debian these are available in the meta-package build-essential. On other distributions, you may need to install the GNU C++ compiler separately.
sudo apt install build-essential
Images to use
You should be careful when installing third party web servers such as MySQL or Nginx.
This project use the following ports :
| Server | Port |
|---|---|
| MySQL | 8989 |
| PHPMyAdmin | 8080 |
| Nginx | 8000 |
| Nginx SSL | 3000 |
Clone the project
To install Git, download it and install following the instructions :
git clone https://github.com/nanoninja/docker-nginx-php-mysql.git
Go to the project directory :
cd docker-nginx-php-mysql
Project tree
.
├── Makefile
├── README.md
├── bin
│ └── linux
│ └── clean.sh
├── data
│ └── db
│ ├── dumps
│ └── mysql
├── docker-compose.yml
├── etc
│ ├── nginx
│ │ └── default.conf
│ ├── php
│ │ └── php.ini
│ └── ssl
└── web
├── app
│ ├── composer.json.dist
│ ├── phpunit.xml.dist
│ ├── src
│ │ └── Foo.php
│ └── test
│ ├── FooTest.php
│ └── bootstrap.php
└── public
└── index.php
Configure Nginx With SSL Certificates
-
Generate SSL certificates
sudo docker run --rm -v $(pwd)/etc/ssl:/certificates -e "SERVER=localhost" jacoelho/generate-certificate -
Configure Nginx
Edit nginx file
etc/nginx/default.confand uncomment the SSL server section :# server { # server_name localhost; # # listen 443 ssl; # ... # }
Configure Xdebug
If you use another IDE than PHPStorm or Netbeans, go to the remote debugging section of Xdebug documentation.
-
Get your own local IP address :
sudo ifconfig -
Edit php file
etc/php/php.iniand comment or uncomment the configuration as needed. -
Set the
remote_hostparameter with your IP :xdebug.remote_host=192.168.0.1 # your IP
Run the application
-
Copying the composer configuration file :
cp web/app/composer.json.dist web/app/composer.json -
Start the application :
sudo docker-compose up -dPlease wait this might take a several minutes...
sudo docker-compose logs -f # Follow log output -
Open your favorite browser :
- http://localhost:8000
- https://localhost:3000 (HTTPS not configured by default)
- http://localhost:8080 (username: dev, password: dev)
-
Stop and clear services
sudo docker-compose stop && sudo docker-compose kill && sudo docker-compose rm -f
Use Makefile
When developing, you can use Makefile for doing the following operations :
| Name | Description |
|---|---|
| apidoc | Generate documentation of API |
| clean | Clean directories for reset |
| code-sniff | Check the API with PHP Code Sniffer (PSR2) |
| composer-up | Update PHP dependencies with composer |
| docker-start | Create and start containers |
| docker-stop | Stop and clear all services |
| gen-certs | Generate SSL certificates for nginx |
| logs | Follow log output |
| mysql-dump | Create backup of whole database |
| mysql-restore | Restore backup from whole database |
| test | Test application with phpunit |
Examples
Start the application :
sudo make docker-start
Show help :
make help
Use Docker commands
Updating PHP dependencies with composer
sudo docker run --rm -v $(pwd)/web/app:/app composer/composer update
Generating PHP API documentation
sudo docker exec $(sudo docker-compose ps -q php) php ./app/vendor/apigen/apigen/bin/apigen generate -s app/src -d app/doc
Testing PHP application with PHPUnit
sudo docker exec $(sudo docker-compose ps -q php) ./app/vendor/bin/phpunit --colors=always --configuration app/
Checking the standard code with PSR2
sudo docker exec $(sudo docker-compose ps -q php) ./app/vendor/bin/phpcs --standard=PSR2 app/src
Checking installed PHP extensions
sudo docker exec $(sudo docker-compose ps -q php) php -m
Handling database
MySQL shell access
sudo docker exec -it mysql bash
and
mysql -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASSWORD"
Backup of database
mkdir -p data/db/dumps
source .env && sudo docker exec mysql mysqldump --all-databases -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASSWORD" > "data/db/dumps/db.sql"
or
source .env && sudo docker exec mysql mysqldump test -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASSWORD" > "data/db/dumps/test.sql"
Restore Database
source .env && sudo docker exec -i $(sudo docker-compose ps -q mysqldb) mysql -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASSWORD" < "data/db/dumps/db.sql"
Connecting MySQL from PDO
<?php
try {
$dsn = 'mysql:host=mysql;dbname=test;charset=utf8;port=3306';
$pdo = new PDO($dsn, 'dev', 'dev');
} catch (PDOException $e) {
echo $e->getMessage();
}
?>
Help us !
Any thought, feedback or (hopefully not!)
Developed by @letvinz