Container with Apache, PHP and MySql
Create a new file named docker-composer.yml
version: "3.8"
services:
php:
container_name: php8apache
image: php:8.1-apache
volumes:
- ./html:/var/www/html
ports:
- 8080:80
version: “3.8” is the docker compose version to use
services: is the section where to specify all the pieces of our composition
php: is the service name, you can name it as you want
container_name is an optional filed in which you specify the name of this service container
image: php:8.1-apache, means that our service will be implemented starting from php image and version 8.1-apache
volumes: – ./html:/var/www/html in this case we are associating our local folder ./html to the container folder /var/www/html
ports: – 8080:80 we are binding the local port 8080 to the container port 80
To execute the container with docker compose let’s type the following code:
docker-compose up -d
After it finishes to download artifacts we can try to reach the address http://localhost:8080
Try to personalize the index.php page in the folder ./html adding a index.php file
Add MySql service
At the bottom of our docker yaml file we should add a new mysql service:
version: "3.8"
services:
php:
container_name: php8apache
image: php:8.1-apache
volumes:
- ./html:/var/www/html
ports:
- 8080:80
depends_on:
- mysql
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: thisIsTheRootPwd
MYSQL_DATABASE: fconsulting
MYSQL_USER: fconsuser
MYSQL_PASSWORD: fconspassword
ports:
- "9906:3306"
We added the mysql section defining environment parameters and ports to map
The image used is mysql (:latest)
Moreover we added also the depend_on parameter in the php section, because our php service depends on the mysql service to work.
But that is not enough, because, like we would do in a normal environment, we need to install in our container also the php library to make php work with mysql.
To do so we need a Dockerfile in which we specify the php-apache version + the libraries we need.
So create a Dockerfile in the same folder of docker-compose.yaml (actually you can create this docker file wherever you want) and put this code:
FROM php:8.1-apache
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
RUN apt-get update && apt-get upgrade -y
FROM php:8.1-apache is the image that we already specified in the docker-compose file
RUN … are the linux commands to download libraries and download updates
Because we are using a Dockerfile to download the image we should update the docker compose file removing, from php section, the “imagine” section replacing it with the docker section:
version: "3.8"
services:
php:
container_name: php8apache
build:
context: .
dockerfile: Dockerfile
volumes:
- ./html:/var/www/html
ports:
- 8080:80
depends_on:
- mysql
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: thisIsTheRootPwd
MYSQL_DATABASE: fconsulting
MYSQL_USER: fconsuser
MYSQL_PASSWORD: fconspassword
ports:
- "9906:3306"
in the build section we specify from which dockerfile to read the imagine and eventually all the other instruction to build our layer.
Now it’s ok.
Add PhpMyAdmin
What is MySql without PhpMyAdmin? Nothing! 😛
So let’s add PhP My Admin to the docker compose:
version: "3.8"
services:
php:
container_name: php8apache
build:
context: .
dockerfile: Dockerfile
volumes:
- ./html:/var/www/html
ports:
- 8080:80
depends_on:
- mysql
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: thisIsTheRootPwd
MYSQL_DATABASE: fconsulting
MYSQL_USER: fconsuser
MYSQL_PASSWORD: fconspassword
ports:
- "9906:3306"
phpmyadmin:
image: phpmyadmin
ports:
- '8090:80'
environment:
PMA_HOST: mysql
depends_on:
- mysql
imagine: phpmyadmin (:latest) is the original phpmyadmin imagine from docker hub
ports: – ‘8090:80’, I chose 8090 but feel free to use whatever port you want
environment: PMA_HOST, mysql it is the reference to which db to use with phpmyadmin
depends_on: – mysql, this service depends on mysql server
To access with phpmyadmin use root as user and the MYSQL_ROOT_PASSWORD as password.
That’s it