Docker running Nginx, PHP-FPM, Composer, MySQL and PHPMyAdmin.
-
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
Makefile
for doing recurrent operations. -
When running, you can use docker commands for doing recurrent operations.
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
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 | 8091 |
Nginx | 8000 |
Nginx SSL | 3001 |
redis | 6379 |
To install Git, download it and install following the instructions :
git clone https://github.com/carlosfgti/docker-lemp-php7-phpmyadmin.git
Go to the project directory :
cd docker-lemp-php7-phpmyadmin
.
├── README.md
├── data
│ └── db
│ ├── dumps
│ └── mysql
│ └── redis
│ └── redis.conf
├── docker-compose.yml
├── etc
│ ├── nginx
│ │ └── default.conf
│ ├── php
│ │ └── php.ini
│ └── ssl
└── web
└── app
└── public
└── index.php
-
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.conf
and uncomment the SSL server section :# server { # server_name localhost; # # listen 443 ssl; # ... # }
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.ini
and comment or uncomment the configuration as needed. -
Set the
remote_host
parameter with your IP :xdebug.remote_host=192.168.0.100 # your IP
-
Start the application :
sudo docker-compose up -d
Please 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 PHPMyAdmin (username: dev, password: dev)
-
Stop and clear services
sudo docker-compose down -v
sudo docker-compose exec php php -m
Currently we have a way to install php extensions:
sudo docker-compose exec php curl -sSL https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions -o - | sh -s gd xdebug
Note: gd
and xdebug
is an example which additional extensions will be installed.
After successfully install additional extension, you have to restart php service container. For more information, please refer to this good source.
sudo docker exec -it mysql bash
and
mysql -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASSWORD"
mkdir -p data/db/dumps
source .env && sudo docker exec $(shell docker-compose ps -q mysqldb) mysqldump --all-databases -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASSWORD" > "data/db/dumps/db.sql"
or
source .env && sudo docker exec $(shell docker-compose ps -q mysqldb) mysqldump test -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASSWORD" > "data/db/dumps/test.sql"
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();
}
Any thought, feedback or (hopefully not!)