Exemple de docker amb nginx, PHP i MariaDB
Contingut
Creació del docker compost
Abans de començar
Assegureu-vos que no teniu funcionant un servidor web (per exemple Apache 2), o un altre docker, pel port 80 ni 8080. Ni una base de dades, o un altre docker, pel port 3306 (per exemple MariaDB o MySQL).
Podeu aturar el servei emprant systemctl fent servir l'opció stop i podeu fer que no es posi en marxa quan arrenca la màquina virtual amb disable.
jordi@asix2:~$ sudo netstat -atpun jordi@asix2:~$ sudo netstat -atpun | grep ":80 " jordi@asix2:~$ sudo netstat -atpun | grep ":8080" jordi@asix2:~$ sudo netstat -atpun | grep ":3306" jordi@asix2:~$ sudo netstat -atpun | grep docker
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 funció 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
Per a poder accedir a la base de dades ens caldrà la IP del seu docker. Per això cal fer els següents passos.
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
I un cop dins del docker:
mysql -u root -p (La contrasenya de root és fjeclot)
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 a provar l'accés a una taula de 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"; $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 (Mateix codi al núvol)