Exemple de docker amb Apache, PHP i MariaDB

De binefa.com
Salta a la navegació Salta a la cerca

Creació del docker compost

Abans de començar

Assegureu-vos que no teniu funcionant un servidor web (per exemple Apache 2) pel port 80 ni una base de dades pel port 3306 (per exemple MariaDB o MySQL).

Resum dels primers passos

jordi@asix2:~$ mkdir lemp
jordi@asix2:~$ mkdir lemp/{nginx-conf,php-files}
jordi@asix2:~$ tree lemp
lemp
├── docker-compose.yml
├── nginx-conf
│   └── nginx.conf
├── php-dockerfile
└── php-files
   ├── 00_connect.php
   └── index.php
3 directories, 5 files
jordi@asix2:~$ cd lemp
jordi@asix2:~/lemp$ nano docker-compose.yml
jordi@asix2:~/lemp$ nano php-dockerfile
jordi@asix2:~/lemp$ nano php-files/index.php
jordi@asix2:~/lemp$ nano nginx-conf/nginx.conf
jordi@asix2:~/lemp$ docker-compose up -d

php-dockerfile

FROM php:8.1-fpm

# Installing dependencies for the PHP modules
RUN apt-get update && \
   apt-get install -y zip libzip-dev libpng-dev

# Installing additional PHP modules
RUN docker-php-ext-install mysqli pdo pdo_mysql gd zip

docker-compose.yml

version: '3.8'

# Services
services:
   # PHP Service
   php:
       build:
           dockerfile: php-dockerfile
       volumes:
           - './php-files:/var/www/html'
       depends_on:
           - mariadb
   # Nginx Service
   nginx:
       image: nginx:latest
       ports:
           - 80:80
       links:
           - 'php'
       volumes:
           - './php-files:/var/www/html'
           - './nginx-conf:/etc/nginx/conf.d'
       depends_on:
           - php
   # MariaDB Service
   mariadb:
       image: mariadb:10.9
       environment:
           MYSQL_ROOT_PASSWORD: fjeclot
       volumes:
           - mysqldata:/var/lib/mysql
   # phpMyAdmin Service
   phpmyadmin:
       image: phpmyadmin/phpmyadmin:latest
       ports:
           - 8080:80
       environment:
           PMA_HOST: mariadb
       depends_on:
           - mariadb
# Volumes
volumes:
 mysqldata:

nginx.conf

server {
   listen 80 default_server;
   listen [::]:80 default_server;
    
   server_name localhost;

   root /var/www/html;
   index index.php index.html;

   location / {
       try_files $uri $uri/ /index.php?$args;
   }

   location ~* \.php$ {
       fastcgi_pass php:9000;
       include fastcgi_params;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param SCRIPT_NAME $fastcgi_script_name;
   }
}

index.php

<?php phpinfo(); ?>

En marxa

Creeu el docker. En fucnió de la vostra xarxa pot durar una mica més dels 62 segons que apareixen a aquesta captura:

jordi@asix2:~/lemp$ docker-compose up -d
[+] Building 62.0s (7/7) FINISHED
...

Podeu accedir-hi anant a http://localhost

Accés al docker de la base de dades MariaDB

Si el nom del vostre docker MariaDB és lemp-mariadb-1:

docker exec -it lemp-mariadb-1 bash -l

Podem saber la IP interna de la base de dades:

root@ab445bde0f6e:/# ip a

Us ha de sortir una IP similar a 172.18.0.2, potser amb el darrer número canviat

Per accedir a la base dades:

docker exec -it lemp-mariadb-1 bash -l

Creeu la taula amb la que voleu treballar:

MariaDB [(none)]> CREATE DATABASE aula311;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| aula311            |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.002 sec)

MariaDB [aula311]> exit
Bye

Codi 00_connect.php per provar l'accés a la base de dades

<!doctype html>
<HTML lang="ca">
<HEAD>
  <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
  <TITLE>Connexió a la base de dades</TITLE>
</HEAD>
<BODY>
<?php
$prg = "00_connect.php";
// Example (PDO) at https://www.w3schools.com/php/php_mysql_connect.asp
$servername = "172.18.0.2"; // docker inspect lemp-mariadb-1 | grep IPAddress
$username = "root"; // Poseu un usuari de la BD en comptes de root 
$password = "fjeclot"; 

try {
 $conn = new PDO("mysql:host=$servername;dbname=aula311", $username, $password);
 // set the PDO error mode to exception
 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 echo "Connectat a la base de dades.";
} catch(PDOException $e) {
 echo "No es pot connectar. Motiu: " . $e->getMessage();
}
?>
</BODY>
</HTML>

Podeu accedir-hi anant a http://localhost/00_connect.php

Font

How to Set Up Nginx, MariaDB, and PHP with Docker Compose