Introducció a Dockers

De Wiki personal d'en Guillem Serrat
La revisió el 15:01, 20 gen 2026 per Guseba (discussió | contribucions)
(dif.) ← Versió més antiga | Versió actual (dif.) | Versió més nova → (dif.)

Creació d'arxius i directoris

Primerament, crearem un directori amb els següents arxius que serà el nostre entorn de treball

6.2
└── php-docker-app
    ├── Dockerfile
    └── index.php

En el fitxer index.php introduirem el codi de la pràctica 2.11. Degut a que el nom del fitxer és diferent que el que era quan es va realitzar la pràctica, haurem de canviar:

  • L’acció del formulari a “index.php”
  • El “show source” del codi a “index.php
<!DOCTYPE html>
<html lang="ca">
    <head>
        <title>Exercici 11 Guillem Serrat</title>
        <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <form method="POST" action="index.php">
            <p>Nombre de files a realitzar: <input type="text" name="files" required/></p>
            <p>Símbol: <input type="text" name="simbol" required/></p>
            <p><button type="submit">Calcula</button></p>
        </form>

        <?php
            $files = $_POST["files"];
            $espai = " ";           // Espai buit
            $caracter = $espai . $_POST["simbol"];    // Caràcter per a la piràmide

            if (!empty($files)) {
                for ($i = 1; $i <= $files; $i++) { // Comença el bucle per tantes files s'hagin especificat
                    for ($j = $i; $j < $files; $j++) { // Imprimeix els espais inicials (Línia actual (j = i) fins a linias -1 ())
                        echo $espai;
                    }
                    for ($k = 1; $k <= $i; $k++) { // Imprimeix els símbols. Si la línia (i) és 1, imprimeix 1 simbol. Tants símbols com número de línia
                        echo $caracter;
                    }
                    echo "<br>\n"; // Nova línia
                }
            }
        ?>
        <h1>Codi en PHP</h1>
        <?php
        show_source("index.php");
        ?>
    </body>
</html>

Imatges de Docker

Una imatge de Docker conté els detalls del sistema operatiu o programari que executarà el contenidor Docker. La imatge de Docker es crea a partir d'un Dockerfile, el qual conté les instruccions necessàries per construir-la

Dins d’un Dockerfile hem de definir com a mínim una imatge base. Aquesta imatge pot ser un sistema operatiu (Debian, Ubuntu) o un programari en concret (Apache, Nginx, MariaDB, etc)

En aquest cas definim que la imatge és php:7.0-apache, és a dir, un servidor Apache preparat per treballar amb PHP. A més a més, amb la instrucció COPY estem indicant que tot el que hi ha en aquest directori (el fitxer index.php) es copiï al directori /var/www/html del contenidor Docker

# Dockerfile
FROM php:7.0-apache
COPY . /var/www/html

Un cop definit el Dockerfile, crearem la imatge

docker build -t php-app .

  1. El "." serveix per indicar que el Dockerfile es troba en el directori actual

Un cop hem creat la imatge, la podrem cercar amb l’ordre docker imatges, la qual mostrarà les imatges tan pròpies creades per un Dockerfile o públiques descarregades de Dockerhub

guseba@phpDebianAzure:/var/www/html/php/exercicis/practica6/6.2/php-docker-app$ docker images

                                                                                                   i Info →   U  In Use

IMAGE ID DISK USAGE CONTENT SIZE php-app:latest b5987dd03878 529MB 133MB

Creació de contenidors

Un cop tenim creada (o descarregada) una imatge de Docker podrem crear un nou contenidor a partir d'aquella imatge

docker run php-app & 
# Fem servir & per executar-ho en segon pla

Amb l'ordre docker ps -a podem comprovar els contenidors creats i el seu estat.

guseba@phpDebianAzure:/var/www/html/php/exercicis/practica6/6.2/php-docker-app$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c91de400d737 php-app "docker-php-entrypoi…" 43 hours ago Up 19 minutes 0.0.0.0:8089->80/tcp, [::]:8089->80/tcp epic_golick

Tot i això si comprovem els ports exportats, veurem que no apareix cap port 80 i per tant l’aplicació no serà accesible. Això és degut que al Dockerfile no hem especificat que el contenidor exportarà aquest port.

sebagu@sebagu-asix:/var/www/html/php/exercicis/practica6/6.2/php-docker-app$ sudo netstat -putan | grep 80

tcp 0 0 127.0.0.1:3306 0.0.0.0 :* LISTEN 1080/mariadb

sebagu@sebagu-asix:/var/www/html/php/exercicis/practica6/6.2/php-docker-app$

Exportació de ports

Per exportar ports del Docker hem d’especifcar-ho al Dockerfile, amb la instrucció EXPOSE

FROM php:7.0-apache
COPY . /var/www/html
EXPOSE 80

Degut a que hem modifcat el Dockerfile, la imatge generada anteriorment ja no és vàlida i n’hem de crear una de nova. En aquest cas especifcarem el mateix nom de la imatge però en versió 1.2

docker build -t php-app:1.2

Per generar el contenidor farem servir la mateixa ordre, afegint la flag -p <portHost>:<portDocker>

docker run -d -p 80:80 php-app:1.2

  1. Definim que el port 80 de la màquina host exposarà el port 80 del Docker, és a dir, si accedim a la màquina host pel port 80, realment accedirem al port 80 del Docker

Si ara tornem a comprovar els ports, veurem que estem exportant el port 80 amb un servei anomenat “docker-proxy”

sebagu@sebagu-asix:/var/www/html/php/exercicis/practica6/6.2/php-docker-app$ sudo netstat -putan | grep 80 tcp 0 0 127.0.0.1:3306 0.0.0.0 :* LISTEN 1080/mariadb tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 50750/docker-proxy tcp6 0 0  ::80  :::* LISTEN 50750/docker-proxy

sebagu@sebagu-asix:/var/www/html/php/exercicis/practica6/6.2/php-docker-app$