Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
43 views

Containerize PHP With NGINX, MySQL, and MongoDB Using Docker Containers - Tutorials24x7

Docker PHP

Uploaded by

Susanto Yang
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
43 views

Containerize PHP With NGINX, MySQL, and MongoDB Using Docker Containers - Tutorials24x7

Docker PHP

Uploaded by

Susanto Yang
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 11

8/18/22, 4:47 PM Containerize PHP with NGINX, MySQL, and MongoDB using Docker Containers | Tutorials24x7

HOME
ABOUT US
TERMS & CONDITIONS
PRIVACY POLICY

HOME
ABOUT US
TERMS & CONDITIONS
PRIVACY POLICY

Ad removed.
Details

Ads by
Send feedback Why thi

Recent Posts

Containerize PHP with NGINX, MySQL, and MongoDB Container


ize
using Docker Containers Laravel
with
Apache,
It provides all the steps required to containerize the PHP application using NGINX Web
MySQL,
Server, MySQL, phpMyAdmin, MongoDB, and Mongo Express using Docker Containers.
and
MongoDB

December 13, 2021 





 using
Docker
Container
We can containerize our applications using Docker to have a separate installation of the required
s
packages with the application-specific versions independent of the underlying operating system. We
can use Docker Containers to make our application portable so that we can simply move it to another
system having docker. This tutorial provides all the steps to containerize a PHP application using NGINX
Web Server as the web server and either MySQL or MongoDB as the database server.
Container
ize
Prerequisites Laravel
with
Windows -  How To Install WSL 2 (Windows Subsystem for Linux) with Ubuntu On Windows 10 and How NGINX,
To Install Docker Desktop On Windows 10. Optionally you may follow How To Change Docker Data Path MySQL,
On Windows 10. and
Ubuntu - How To Install Docker Engine on Ubuntu 20.04 LTS MongoDB
macOS - How To Install Docker Desktop On Mac using
Docker
Container
Install PHP and NGINX Web Server s

Create a directory to store your project-specific files. I have created the directory helloworld to store all
the project files. Now create the file docker-compose.yml at the root of your project directory as shown
below. Container
ize PHP
with
# docker-compose.yml

NGINX,
version: "3.8"

MySQL,
services:

and
nginx:

MongoDB
container_name: nginx

using
build: ./docker/nginx

Docker
command: nginx -g "daemon off;"

Container
links:

s
- php

ports:

- "80:80"

volumes:
Container
- ./src:/var/www/html
ize

https://devops.tutorials24x7.com/blog/containerize-php-with-nginx-mysql-and-mongodb-using-docker-containers 1/11
8/18/22, 4:47 PM Containerize PHP with NGINX, MySQL, and MongoDB using Docker Containers | Tutorials24x7
php:
HOME
ABOUT US
TERMS & CONDITIONS
PRIVACY POLICY MongoDB

container_name: php
and
Affordable Access To Latest LC
build: ./docker/php
Mongo
ports:
HOME Open
Express
Future Proof -Your Lab With LC Refresh. Flexible Financing,ABOUT
Personalized
US Training & Support

"9000:9000"
using
Waters TERMS & CONDITIONS
volumes:
PRIVACY POLICY Docker
- ./src:/var/www/html
Container
working_dir: /var/www/html s

Now create the directories - docker and src within the project root directory. Also, create two directories
within the docker directory i.e. php and nginx.
Container
Create the Dockerfile within the PHP directory as shown below. ize MySQL
and
phpMyAd
# docker/php/Dockerfile

min using
FROM php:8.1-fpm
Docker
Container
Create the Dockerfile within the NGINX directory as shown below. s

# docker/nginx/Dockerfile

FROM nginx:1.20

Create the index.php file within the src directory as shown below.

# src/index.php

<?php

echo phpinfo();

We also need to configure the Server Block or Virtual Host to pass the PHP requests to PHP-FPM vial port
9000. Now, create the default configuration file as shown below.

# docker/nginx/helloworld.nginx.conf

server {

listen 80;

index index.php index.htm index.html;

root /var/www/html;

error_log /var/log/nginx/error.log;

access_log /var/log/nginx/access.log;

location ~ \.php$ {

try_files $uri =404;

fastcgi_split_path_info ^(.+\.php)(/.+)$;

fastcgi_pass php:9000;

fastcgi_index index.php;

include fastcgi_params;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi_param PATH_INFO $fastcgi_path_info;

Now, update the Dockerfile within the NGINX directory as shown below.

# docker/nginx/Dockerfile

FROM nginx:1.20

ADD helloworld.nginx.conf /etc/nginx/conf.d/default.conf

After creating all the directories and files, the directory structure should be similar as shown below.

helloworld

-- docker

-- php

-- Dockerfile

-- nginx

-- Dockerfile

-- helloworld.nginx.conf

-- src

-- index.php

-- docker-compose.yml

Now, run the command docker-compose build to build the images for PHP and NGINX Web Server.

https://devops.tutorials24x7.com/blog/containerize-php-with-nginx-mysql-and-mongodb-using-docker-containers 2/11
8/18/22, 4:47 PM Containerize PHP with NGINX, MySQL, and MongoDB using Docker Containers | Tutorials24x7
HOME
ABOUT US
TERMS & CONDITIONS
PRIVACY POLICY
# Build

Affordable Access To Latest LC


cd <path to project>/helloworld

docker-compose build

HOME Open
Future
Proof Your Lab With LC Refresh. Flexible Financing,ABOUT
Personalized
US Training & Support

Waters# Output
TERMS & CONDITIONS
PRIVACY POLICY
Building php

[+] Building 3.6s (6/6) FINISHED

=> [internal] load build definition from Dockerfile


=> => transferring dockerfile: 31B
=> [internal] load .dockerignore
=> => transferring context: 2B
=> [internal] load metadata for docker.io/library/php:8.1-fpm
=> [auth] library/php:pull token for registry-1.docker.io
=> CACHED [1/1] FROM docker.io/library/php:8.1-fpm@sha256:c884ad419ce99d3136cd02a56
=> exporting to image
=> => exporting layers
=> => writing image sha256:dd8e9ace979d52b810014bd90565f9bf60ffdbb754af263b1eb3b2bb
=> => naming to docker.io/library/helloworld_php

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn
Building nginx

[+] Building 3.4s (8/8) FINISHED

=> [internal] load build definition from Dockerfile


=> => transferring dockerfile: 31B
=> [internal] load .dockerignore
=> => transferring context: 2B
=> [internal] load metadata for docker.io/library/nginx:1.20
=> [auth] library/nginx:pull token for registry-1.docker.io
=> [internal] load build context
=> => transferring context: 43B
=> [1/2] FROM docker.io/library/nginx:1.20@sha256:71a1217d769cbfb5640732263f81d74e8
=> CACHED [2/2] ADD helloworld.nginx.conf /etc/nginx/conf.d/default.conf
=> exporting to image
=> => exporting layers
=> => writing image sha256:9b1edf62e7a508b108c5043be42882327ec535269fac500e72267aa0
=> => naming to docker.io/library/helloworld_nginx

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn

After completing the build, we can run the application using the command shown below.

# Launch Application

docker-compose up

# Output

Creating network "helloworld_default" with the default driver

Creating php ... done

Creating nginx ... done

Attaching to php, nginx

Now open the browser and enter the URL - http://localhost/index.php. It should show the output of
index.php as shown in Fig.1.

https://devops.tutorials24x7.com/blog/containerize-php-with-nginx-mysql-and-mongodb-using-docker-containers 3/11
8/18/22, 4:47 PM Containerize PHP with NGINX, MySQL, and MongoDB using Docker Containers | Tutorials24x7
HOME
ABOUT US
TERMS & CONDITIONS
PRIVACY POLICY

Affordable Access To Latest LC


HOME Open
Future Proof Your Lab With LC Refresh. Flexible Financing,ABOUT
Personalized
US Training & Support

Waters TERMS & CONDITIONS


PRIVACY POLICY

Fig 1

Press Ctrl + C to stop the containers.

Install MySQL and phpMyAdmin

In this step, we will continue with our previous step and install MySQL and phpMyAdmin. We will also
access the MySQL database from the PHP code using PDO. Now, update the docker-compose.yml as
shown below.

# docker-compose.yml

version: "3.8"

services:

nginx:

container_name: nginx

build: ./docker/nginx

command: nginx -g "daemon off;"

links:

- php

ports:

- "80:80"

volumes:

- ./src:/var/www/html

php:

container_name: php

build: ./docker/php

links:

- mysql

ports:

- "9000:9000"

volumes:

- ./src:/var/www/html

working_dir: /var/www/html

mysql:

image: mysql:8.0.27

container_name: mysql

environment:

MYSQL_ROOT_PASSWORD: '<root-password>'

MYSQL_DATABASE: helloworld

MYSQL_USER: helloworld

MYSQL_PASSWORD: '<db-password>'

ports:

- "3306:3306"

volumes:

- ./database/mysql:/var/lib/mysql

phpmyadmin:

image: phpmyadmin/phpmyadmin

container_name: pma

links:

- mysql

environment:

PMA_HOST: mysql

https://devops.tutorials24x7.com/blog/containerize-php-with-nginx-mysql-and-mongodb-using-docker-containers 4/11
8/18/22, 4:47 PM Containerize PHP with NGINX, MySQL, and MongoDB using Docker Containers | Tutorials24x7
PMA_PORT: 3306
HOME
ABOUT US
TERMS & CONDITIONS
PRIVACY POLICY

PMA_ARBITRARY: 1

Affordable
restart: Access
always
To Latest LC
ports:
HOME Open
Future Proof -Your Lab With LC Refresh. Flexible Financing,ABOUT
8085:80
Personalized
US Training & Support

Waters TERMS & CONDITIONS


PRIVACY POLICY
Now, run the command docker-compose build to build the application.

# Build

cd <path to project>/helloworld

docker-compose build

# Output

mysql uses an image, skipping

phpmyadmin uses an image, skipping

Building php

....

....

=> => naming to docker.io/library/helloworld_nginx


Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn

We also need to run the command docker-compose up to launch the application as shown below. It will
pull the MySQL and phpMyAdmin images and take time for the first time. The subsequent launches will
be faster.

# Launch Application

docker-compose up

# Output

Pulling mysql (mysql:8.0.27)...

8.0.27: Pulling from library/mysql

ffbb094f4f9e: Pull complete

df186527fc46: Pull complete

fa362a6aa7bd: Pull complete

5af7cb1a200e: Pull complete

....

....

Status: Downloaded newer image for mysql:8.0.27

Pulling phpmyadmin (phpmyadmin/phpmyadmin:)...

latest: Pulling from phpmyadmin/phpmyadmin

69692152171a: Pull complete

2040822db325: Pull complete

....

....

2e982de2b8e5: Pull complete

Digest: sha256:382dedf6b43bf3b6c6c90f355b4dda660beb3e099dqw1bb3241170e54fca6d59

Status: Downloaded newer image for phpmyadmin/phpmyadmin:latest

....

....

Creating mysql ... done

Recreating php ... done

Creating pma ... done

Recreating nginx ... done

Attaching to mysql, pma, php, nginx

....

....

Now, try to access phpMyAdmin from the Browser using the URL http://localhost:8085. It should show
the phpMyAdmin home page as shown in Fig.2.

https://devops.tutorials24x7.com/blog/containerize-php-with-nginx-mysql-and-mongodb-using-docker-containers 5/11
8/18/22, 4:47 PM Containerize PHP with NGINX, MySQL, and MongoDB using Docker Containers | Tutorials24x7
HOME
ABOUT US
TERMS & CONDITIONS
PRIVACY POLICY

Affordable Access To Latest LC


HOME Open
Future Proof Your Lab With LC Refresh. Flexible Financing,ABOUT
Personalized
US Training & Support

Waters TERMS & CONDITIONS


PRIVACY POLICY

Fig 2

Now, login to phpMyAdmin using the username as root and the root password configured in the docker-
compose.yml. Also, leave the server blank. It should show the phpMyAdmin home page as shown in Fig
3.

Fig 3

Press Ctrl + C to stop the containers.

# Press Ctrl + C

Gracefully stopping... (press Ctrl+C again to force)

Stopping nginx ... done

Stopping php ... done

Stopping pma ... done

Stopping mysql ... done

Now, install the PHP extensions to access MySQL from the PHP source files by updating the Dockerfile as
shown below.

# docker/php/Dockerfile

FROM php:8.1

RUN apt-get update

RUN docker-php-ext-install pdo pdo_mysql mysqli

Also, run the build and up commands to again build the application and launch it. We can test MySQL
connectivity using PHP as shown below. You can also follow How To Connect MySQL Database With PHP.

# src/mysql.php

<?php

$hostname = "mysql";

$dbname = "helloworld";

$username = "helloworld";

$password = "db-password";

try {

https://devops.tutorials24x7.com/blog/containerize-php-with-nginx-mysql-and-mongodb-using-docker-containers 6/11
8/18/22, 4:47 PM Containerize PHP with NGINX, MySQL, and MongoDB using Docker Containers | Tutorials24x7
HOME
ABOUT US
TERMS &$username,
$conn = new PDO( "mysql:host=$hostname;dbname=$dbname", CONDITIONS $password

PRIVACY POLICY

Affordable
Access
// Configure To mode

PDO error Latest LC


HOME
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
Open
Future Proof Your Lab With LC Refresh. Flexible Financing,ABOUT
Personalized
US Training & Support

Waters TERMS & CONDITIONS


echo "Connected successfully";
PRIVACY POLICY
}

catch( PDOException $e ) {

echo "Failed to connect: " . $e->getMessage();

// Perform database operations

// Close the connection

$conn = null;

If we open the PHP file using the URL http://localhost/mysql.php, it should show the output as shown in
Fig 4.

Fig 4

This completes the installation and configuration of MySQL and phpMyAdmin.

Press Ctrl + C to stop the containers.

Install MongoDB and MongoDB Express

In this step, we will continue with our previous step and install MongoDB and MongoDB Express. Now,
update the docker-compose.yml as shown below.

# docker-compose.yml

version: "3.8"

services:

nginx:

container_name: nginx

build: ./docker/nginx

command: nginx -g "daemon off;"

links:

- php

ports:

- "80:80"

volumes:

- ./src:/var/www/html

php:

container_name: php

build: ./docker/php

links:

- mysql

- mongo

ports:

- "9000:9000"

volumes:

- ./src:/var/www/html

working_dir: /var/www/html

mysql:

image: mysql:8.0.27

container_name: mysql

environment:

MYSQL_ROOT_PASSWORD: '<root-password>'

MYSQL_DATABASE: helloworld

MYSQL_USER: helloworld

MYSQL_PASSWORD: '<db-password>'

ports:

- "3306:3306"

volumes:

- ./database/mysql:/var/lib/mysql

phpmyadmin:

image: phpmyadmin/phpmyadmin

container_name: pma

https://devops.tutorials24x7.com/blog/containerize-php-with-nginx-mysql-and-mongodb-using-docker-containers 7/11
8/18/22, 4:47 PM Containerize PHP with NGINX, MySQL, and MongoDB using Docker Containers | Tutorials24x7
links:
HOME
ABOUT US
TERMS & CONDITIONS
PRIVACY POLICY

- mysql

Affordable Access To Latest LC


environment:

PMA_HOST: mysql
HOME Open
Future Proof PMA_PORT:
Your Lab 3306

With LC Refresh. Flexible Financing,ABOUT


Personalized
US Training & Support

Waters TERMS & CONDITIONS


PMA_ARBITRARY: 1
PRIVACY POLICY
restart: always

ports:

- 8085:80

mongo:

image: mongo:5.0

container_name: mongo

environment:

- MONGO_INITDB_ROOT_USERNAME=root

- MONGO_INITDB_ROOT_PASSWORD=password

restart: unless-stopped

ports:

- "27017:27017"

volumes:

- ./database/mongodb/db:/data/db

- ./database/mongodb/dev.archive:/Databases/dev.archive

- ./database/mongodb/production:/Databases/production

mongo-express:

image: mongo-express

container_name: mexpress

environment:

- ME_CONFIG_MONGODB_ADMINUSERNAME=root

- ME_CONFIG_MONGODB_ADMINPASSWORD=password

- ME_CONFIG_MONGODB_URL=mongodb://root:password@mongo:27017/?authSource=admin
- ME_CONFIG_BASICAUTH_USERNAME=mexpress

- ME_CONFIG_BASICAUTH_PASSWORD=mexpress

links:

- mongo

restart: unless-stopped

ports:

- "8081:8081"

Replace the root password while configuring the docker-compose.yml. Also, install the PHP extensions to
access MongoDB from the PHP source files by updating the Dockerfile as shown below.

# docker/php/Dockerfile

FROM php:8.1

RUN apt-get update

RUN docker-php-ext-install pdo pdo_mysql mysqli

RUN apt-get install -y autoconf pkg-config libssl-dev

RUN pecl install mongodb

RUN echo "extension=mongodb.so" >> /usr/local/etc/php/conf.d/mongodb.ini

Now, run the build and up commands to again build the application and launch it. We can access
MongoDB using the URL - http://localhost:8081. It will ask for the basic authentication configured by us.
The home page should be similar as shown below.

Fig 5

This completes the installation and configuration of MongoDB for PHP.

Summary

This tutorial provided all the steps to containerize PHP with NGINX Web Server, MySQL, phpMyAdmin,
MongoDB, and MongoDB Express using Docker containers.

https://devops.tutorials24x7.com/blog/containerize-php-with-nginx-mysql-and-mongodb-using-docker-containers 8/11
8/18/22, 4:47 PM Containerize PHP with NGINX, MySQL, and MongoDB using Docker Containers | Tutorials24x7
HOME
ABOUT US
TERMS & CONDITIONS
PRIVACY POLICY

Write a Comment
Affordable Access To Latest LC
Name Write here...
HOME Open
Future Proof Your Lab With LC Refresh. Flexible Financing,ABOUT
Personalized
US Training & Support

WatersEmail TERMS & CONDITIONS


PRIVACY POLICY

Website Link

Captcha Key*

Click the captcha image to get new code.

Submit

Discussion Forum by DISQUS

ALSO ON TUTORIALS24X7

2 years ago • 1 comment 2 years ago • 1 comment


Guide To Design How To Install
Database For Android SDK
Online … Tools On …

https://devops.tutorials24x7.com/blog/containerize-php-with-nginx-mysql-and-mongodb-using-docker-containers 9/11
8/18/22, 4:47 PM Containerize PHP with NGINX, MySQL, and MongoDB using Docker Containers | Tutorials24x7
HOME
ABOUT US
TERMS & CONDITIONS
PRIVACY POLICY
Sponsored 

Affordable Access
Talent shortage To Latest
hampers Vietnam’s LC
move up the value chain
HOME Open
FutureTheProof
Business Times
Your Lab With LC Refresh. Flexible Financing,ABOUT
Personalized
US Training & Support

Waters TERMS & CONDITIONS


PRIVACY POLICY

Berdagang CFD Crypto Dengan Broker Dipercayai


IC Markets

The Hidden Secret for Making Men Look Slim Is Finally Out!
The Super Shaper

Unsold Mugs Practically Being Given Away


Discount Bargain Mugs | Search Ads

Suami ilustrasikan kehidupan sehari-hari bersama istri dalam 22 gambar,


usahakan jangan menangis!
5minstory.com

Wanita tercantik di Indonesia tahun 2021


BestFamilyMag

What do you think?


1 Response

Upvote Funny Love Surprised Angry Sad

Comments Community 🔒 Privacy Policy 


1 Login

 Favorite t Tweet f Share Sort by Best

Start the discussion…

LOG IN WITH
OR SIGN UP WITH DISQUS ?

Name

Links Featured Posts Newsletter

Blog Sign Up to receive updates from us.


Contact Us
Email *
Join Us
Feedback

Testimonial

https://devops.tutorials24x7.com/blog/containerize-php-with-nginx-mysql-and-mongodb-using-docker-containers 10/11
8/18/22, 4:47 PM Containerize PHP with NGINX, MySQL, and MongoDB using Docker Containers | Tutorials24x7
HOME
ABOUT US
TERMS & CONDITIONS
PRIVACY POLICY

Affordable Access To Latest LC


HOME Open
Future Proof Your Lab With LC Refresh. Flexible Financing,ABOUT
Personalized
US Training & Support

Waters TERMS & CONDITIONS


PRIVACY POLICY
Copyright © 2017 - 2022 Tutorials24x7. All Rights Reserved.

https://devops.tutorials24x7.com/blog/containerize-php-with-nginx-mysql-and-mongodb-using-docker-containers 11/11

You might also like