> For the complete documentation index, see [llms.txt](https://book.konstantinsecurity.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://book.konstantinsecurity.com/readme/web-dev/docker-nginx-php-mysql.md).

# Docker nginx php mysql

## Docker nginx php mysql

<https://github.com/nanoninja/docker-nginx-php-mysql>

[docker-nginx-php-mysql](https://gitlab.com/johnmkane/tech-recipe-book/-/blob/main/Book/Web%20Dev/Docker%20nginx%20php%20mysql/Docker%20nginx%20php%20mysql/docker-nginx-php-mysql/README.md)

## [Nginx PHP MySQL](https://github.com/nanoninja/docker-nginx-php-mysql#nginx-php-mysql--)

Docker running Nginx, PHP-FPM, Composer, MySQL and PHPMyAdmin.

### [Overview](https://github.com/nanoninja/docker-nginx-php-mysql#overview)

1. [Install prerequisites](https://github.com/nanoninja/docker-nginx-php-mysql#install-prerequisites)

   Before installing project make sure the following prerequisites have been met.
2. [Clone the project](https://github.com/nanoninja/docker-nginx-php-mysql#clone-the-project)

   We’ll download the code from its repository on GitHub.
3. [Configure Nginx With SSL Certificates](https://github.com/nanoninja/docker-nginx-php-mysql#configure-nginx-with-ssl-certificates) \[`Optional`]

   We'll generate and configure SSL certificate for nginx before running server.
4. [Configure Xdebug](https://github.com/nanoninja/docker-nginx-php-mysql#configure-xdebug) \[`Optional`]

   We'll configure Xdebug for IDE (PHPStorm or Netbeans).
5. [Run the application](https://github.com/nanoninja/docker-nginx-php-mysql#run-the-application)

   By this point we’ll have all the project pieces in place.
6. [Use Makefile](https://github.com/nanoninja/docker-nginx-php-mysql#use-makefile) \[`Optional`]

   When developing, you can use `Makefile` for doing recurrent operations.
7. [Use Docker Commands](https://github.com/nanoninja/docker-nginx-php-mysql#use-docker-commands)

   When running, you can use docker commands for doing recurrent operations.

### [Install prerequisites](https://github.com/nanoninja/docker-nginx-php-mysql#install-prerequisites)

To run the docker commands without using **sudo** you must add the **docker** group to **your-user**:

```
sudo usermod -aG docker your-user

```

For now, this project has been mainly created for Unix `(Linux/MacOS)`. Perhaps it could work on Windows.

All requisites should be available for your distribution. The most important are :

* [Git](https://git-scm.com/downloads)
* [Docker](https://docs.docker.com/engine/installation/)
* [Docker Compose](https://docs.docker.com/compose/install/)

Check if `docker-compose` is already installed by entering the following command :

```
which docker-compose
```

Check Docker Compose compatibility :

* [Compose file version 3 reference](https://docs.docker.com/compose/compose-file/)

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](https://github.com/nanoninja/docker-nginx-php-mysql#images-to-use)

* [Nginx](https://hub.docker.com/_/nginx/)
* [MySQL](https://hub.docker.com/_/mysql/)
* [PHP-FPM](https://hub.docker.com/r/nanoninja/php-fpm/)
* [Composer](https://hub.docker.com/_/composer/)
* [PHPMyAdmin](https://hub.docker.com/r/phpmyadmin/phpmyadmin/)
* [Generate Certificate](https://hub.docker.com/r/jacoelho/generate-certificate/)

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](https://github.com/nanoninja/docker-nginx-php-mysql#clone-the-project)

To install [Git](http://git-scm.com/book/en/v2/Getting-Started-Installing-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](https://github.com/nanoninja/docker-nginx-php-mysql#project-tree)

```
.
├── Makefile
├── README.md
├── data
│   └── db
│       ├── dumps
│       └── mysql
├── doc
├── docker-compose.yml
├── etc
│   ├── nginx
│   │   ├── default.conf
│   │   └── default.template.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](https://github.com/nanoninja/docker-nginx-php-mysql#configure-nginx-with-ssl-certificates)

You can change the host name by editing the `.env` file.

If you modify the host name, do not forget to add it to the `/etc/hosts` file.

1.

```
Generate SSL certificates
```

````
```
source .env && docker run --rm -v $(pwd)/etc/ssl:/certificates -e "SERVER=$NGINX_HOST" jacoelho/generate-certificate
```
````

2\. Configure Nginx

````
Do not modify the `etc/nginx/default.conf` file, it is overwritten by `etc/nginx/default.template.conf`

Edit nginx file `etc/nginx/default.template.conf` and uncomment the SSL server section :

```
# server {
#     server_name ${NGINX_HOST};
#
#     listen 443 ssl;
#     fastcgi_param HTTPS on;
#     ...
# }
```
````

### [Configure Xdebug](https://github.com/nanoninja/docker-nginx-php-mysql#configure-xdebug)

If you use another IDE than [PHPStorm](https://www.jetbrains.com/phpstorm/) or [Netbeans](https://netbeans.org/), go to the [remote debugging](https://xdebug.org/docs/remote) section of Xdebug documentation.

For a better integration of Docker to PHPStorm, use the [documentation](https://gitlab.com/johnmkane/tech-recipe-book/-/blob/main/Book/Web%20Dev/Docker%20nginx%20php%20mysql/phpstorm-macosx/README.md).

1.

```
Get your own local IP address :
```

````
```
sudo ifconfig
```
````

2\. Edit php file `etc/php/php.ini` and comment or uncomment the configuration as needed. 3.

````
Set the `remote_host` parameter with your IP :

```
xdebug.remote_host=192.168.0.1 # your IP
```
````

### [Run the application](https://github.com/nanoninja/docker-nginx-php-mysql#run-the-application)

1.

```
Copying the composer configuration file :
```

````
```
cp web/app/composer.json.dist web/app/composer.json
```
````

2\. Start the application :

````
```
docker-compose up -d
```

**Please wait this might take a several minutes...**

```
docker-compose logs -f # Follow log output
```
````

3\.

```
Open your favorite browser :

- [http://localhost:8000](http://localhost:8000/)
- [https://localhost:3000](https://localhost:3000/) ([HTTPS](https://github.com/nanoninja/docker-nginx-php-mysql#configure-nginx-with-ssl-certificates) not configured by default)
- [http://localhost:8080](http://localhost:8080/) PHPMyAdmin (username: dev, password: dev)
```

4\.

````
Stop and clear services

```
docker-compose down -v
```
````

### [Use Makefile](https://github.com/nanoninja/docker-nginx-php-mysql#use-makefile)

When developing, you can use [Makefile](https://en.wikipedia.org/wiki/Make_\(software\)) 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 all databases             |
| mysql-restore | Restore backup of all databases            |
| phpmd         | Analyse the API with PHP Mess Detector     |
| test          | Test application with phpunit              |

#### [Examples](https://github.com/nanoninja/docker-nginx-php-mysql#examples)

Start the application :

```
make docker-start
```

Show help :

```
make help
```

### [Use Docker commands](https://github.com/nanoninja/docker-nginx-php-mysql#use-docker-commands)

#### [Installing package with composer](https://github.com/nanoninja/docker-nginx-php-mysql#installing-package-with-composer)

```
docker run --rm -v $(pwd)/web/app:/app composer require symfony/yaml
```

#### [Updating PHP dependencies with composer](https://github.com/nanoninja/docker-nginx-php-mysql#updating-php-dependencies-with-composer)

```
docker run --rm -v $(pwd)/web/app:/app composer update
```

#### [Generating PHP API documentation](https://github.com/nanoninja/docker-nginx-php-mysql#generating-php-api-documentation)

```
docker run --rm -v $(pwd):/data phpdoc/phpdoc -i=vendor/ -d /data/web/app/src -t /data/web/app/doc
```

#### [Testing PHP application with PHPUnit](https://github.com/nanoninja/docker-nginx-php-mysql#testing-php-application-with-phpunit)

```
docker-compose exec -T php ./app/vendor/bin/phpunit --colors=always --configuration ./app
```

#### [Fixing standard code with](https://github.com/nanoninja/docker-nginx-php-mysql#fixing-standard-code-with-psr2) [PSR2](http://www.php-fig.org/psr/psr-2/)

```
docker-compose exec -T php ./app/vendor/bin/phpcbf -v --standard=PSR2 ./app/src
```

#### [Checking the standard code with](https://github.com/nanoninja/docker-nginx-php-mysql#checking-the-standard-code-with-psr2) [PSR2](http://www.php-fig.org/psr/psr-2/)

```
docker-compose exec -T php ./app/vendor/bin/phpcs -v --standard=PSR2 ./app/src
```

#### [Analyzing source code with](https://github.com/nanoninja/docker-nginx-php-mysql#analyzing-source-code-with-php-mess-detector) [PHP Mess Detector](https://phpmd.org/)

```
docker-compose exec -T php ./app/vendor/bin/phpmd ./app/src text cleancode,codesize,controversial,design,naming,unusedcode
```

#### [Checking installed PHP extensions](https://github.com/nanoninja/docker-nginx-php-mysql#checking-installed-php-extensions)

```
docker-compose exec php php -m
```

#### [Handling database](https://github.com/nanoninja/docker-nginx-php-mysql#handling-database)

#### [MySQL shell access](https://github.com/nanoninja/docker-nginx-php-mysql#mysql-shell-access)

```
docker exec -it mysql bash
```

and

```
mysql -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASSWORD"
```

#### [Creating a backup of all databases](https://github.com/nanoninja/docker-nginx-php-mysql#creating-a-backup-of-all-databases)

```
mkdir -p data/db/dumps
```

```
source .env && docker exec $(docker-compose ps -q mysqldb) mysqldump --all-databases -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASSWORD" > "data/db/dumps/db.sql"
```

#### [Restoring a backup of all databases](https://github.com/nanoninja/docker-nginx-php-mysql#restoring-a-backup-of-all-databases)

```
source .env && docker exec -i $(docker-compose ps -q mysqldb) mysql -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASSWORD" < "data/db/dumps/db.sql"
```

#### [Creating a backup of single database](https://github.com/nanoninja/docker-nginx-php-mysql#creating-a-backup-of-single-database)

**`Notice:`** Replace "YOUR\_DB\_NAME" by your custom name.

```
source .env && docker exec $(docker-compose ps -q mysqldb) mysqldump -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASSWORD" --databases YOUR_DB_NAME > "data/db/dumps/YOUR_DB_NAME_dump.sql"
```

#### [Restoring a backup of single database](https://github.com/nanoninja/docker-nginx-php-mysql#restoring-a-backup-of-single-database)

```
source .env && docker exec -i $(docker-compose ps -q mysqldb) mysql -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASSWORD" < "data/db/dumps/YOUR_DB_NAME_dump.sql"
```

#### [Connecting MySQL from](https://github.com/nanoninja/docker-nginx-php-mysql#connecting-mysql-from-pdo) [PDO](http://php.net/manual/en/book.pdo.php)

```
<?php
    try {
        $dsn = 'mysql:host=mysql;dbname=test;charset=utf8;port=3306';
        $pdo = new PDO($dsn, 'dev', 'dev');
    } catch (PDOException $e) {
        echo $e->getMessage();
    }
?>
```
