Salta el contingut

MP08 - UF3: Desplegament d'aplicacions web

Infraestructura LAMP amb Docker Compose

Una de les formes de tenir la infraestructura al núvol és tenint dispositius en màquines com ara AWS, Oracle Cloud, etc.

Però una de les eines que ens permet tenir diferents serveis en una màquina és utilitzar contenidors. Docker ens facilita la creació i utilització de contenidors en una màquina Linux. Quan utilitzem Docker, podem instanciar més d'un contenidor i podem fer que aquests es comuniquin entre ells per oferir-se serveis. Però l'eina de Docker que ens facilita la interacció entre diferents contenidors és Docker Compose.

La finalitat d'aquesta pràctica és veure com podem instal·lar docker en un Linux i crear tres serveis, cadascun en un contenidor diferent, que interaccionin entre ells i ens permetin executar aplicacions web que accedeixen a una base de dades relacional. Com a servidor web utilitzarem Apache i com a servidor de base de dades utilitzarem mysql. També posarem un contenidor amb un phpmyadmin.

Començarem per la instal·lació de Docker en un servidor Linux.

Instal·lació de Docker en Linux

Seguirem el tutorial de https://jacar.es/como-instalar-docker-en-ubuntu-22-04/.

Iniciarem la màquina que se'ns ha preparat

001

i hi accedirem a través de ssh amb la xarxa Wireguard activada.

ssh isard@10.2.18.220

Recordeu que podeu passar -li la vostra clau pública i entrareu sense password

scp .ssh\id_rsa.pub isard@>ssh isard@10.2.18.220:.

I començarem la instal·laació de Docker...

Afegim el repositori de Docker

amb les següents comandes:

Actualitzem el repositori
sudo apt update
Afegim uns paquets necessaris
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
Afegim la clau PGP del repositori de Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Aquesta execució ens diu que la comanda apt-key add no s'hauria d'utilitzar...

Podeu trobar les comandes a utilitzar, ara no hi entrarem, a la web https://askubuntu.com/questions/1286545/what-commands-exactly-should-replace-the-deprecated-apt-key. Si us hi fixeu ens fan descarregar la clau i desar-la, comprovar que és una clau, exportar-la en un format vàlid i finalment importar-la.

Afegim el repositori de Docker al sistema
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Actualitzem altra vegada els repositoris, ara que tenim el de Docker afegit
sudo apt update

Instal·lem Docker

Finalment instal·lem el paquet Docker
sudo apt install -y docker-ce
També instal·lem Docker-Compose
sudo apt install -y docker-compose

Podem fer la comprovació amb les comandes

Comprovacions
docker -v && docker-compose -v

Creació dels contenidors amb Docker Compose

Ara que tenim instal·lat el Docker i el Docker-Compose ja podrem crear els contenidors.

Docker permet crear contenidors que ofereixen serveis a partir de imatges creades per altres o per nosaltres mateixos a partir d'altres imatges. Per generar una imatge solem fer-ho a partir d'un fitxer anomenat Dockerfile. Si volem tenir diferents serveis en diferents contenidors i que aquests es vegin entre ells, caldrà crear diferents contenidors amb diferents fitxers Dockerfile, un per cada tipus de contenidor, i iniciar-los tot, d'un en un.

Docker-compose ens permet tenir, en un sol fitxer, docker-compose.yml, la configuració per a dferents contenidors que interactuaran entre ells. Al tenir-ho en un sol fitxer, tenim relacionats els que interactuen entre ells i al fer l'start del docker-compose ens iniciarà tots els contenidors alhora.

En aquesta única pràctica, utilitzarem docker-compose i crearem un conjunt de servidors que interactuaran enter ells creant el que anomenem una pila LAMP.

Per a fer aquesta pràctica seguirem el tutorial que podeu trobar a https://openwebinars.net/blog/infraestructura-lamp-con-docker-compose/.

Crearem una infraestructura com la de la imatge següent:

Lamp001

Tindrem tres contenidors:

  • www: serà el servidor web amb l'apache i el php. Es podrà accedir al servidor web pel port 80.

  • db: serà el servidor de bases de dades amb el mysql. Es podrà accedir al servidor de bases de dades pel port 3306.

  • phpmyadmin: serà el servidor web que contindrà el phpmyadmin. Es podrà accedir al servidor web pel port 8000.

    En realitat el servidor phpmyadmin funcionarà internament pel port 80 però tindrem mapejat aquest port del contenidor en el port 8000 de la màquina real.

Descarreguem el repositori docker-lamp del Github i així ja tindrem els fitxers descarregats

En el mateix HOME de l'usuari isard clonarem el repositori que ens proporcionen amb l comanda

git clone https://github.com/jersonmartinez/docker-lamp.git

Això ens crea la següent estructura de directoris que analitzarem detingudament.

docker-lamp
├── docker-lamp/conf
├── docker-lamp/docker-compose.yml
├── docker-lamp/Dockerfile
├── docker-lamp/dump
│   └── docker-lamp/dump/myDb.sql
├── docker-lamp/LICENSE
├── docker-lamp/README.md
└── docker-lamp/www
    └── docker-lamp/www/index.php

Mirarem els fitxers principals i la seva funció.

Dockerfile

Dockerfile
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
FROM php:8.0.0-apache
ARG DEBIAN_FRONTEND=noninteractive
RUN docker-php-ext-install mysqli
# Include alternative DB driver
# RUN docker-php-ext-install pdo
# RUN docker-php-ext-install pdo_mysql
RUN apt-get update \
    && apt-get install -y sendmail libpng-dev \
    && apt-get install -y libzip-dev \
    && apt-get install -y zlib1g-dev \
    && apt-get install -y libonig-dev \
    && rm -rf /var/lib/apt/lists/* \
    && docker-php-ext-install zip

RUN docker-php-ext-install mbstring
RUN docker-php-ext-install zip
RUN docker-php-ext-install gd

RUN a2enmod rewrite

EL fitxer Dockerfile és la base del servidor www.

  • a la línia 1 podem veure que parteix d'una imatge de php amb apache

  • a la línia 3 s'instal·la l'extensió del client mysql per php

  • de la línia 7 a la línia 13 s'instal·len altres llibreries

  • de la línia 14 a la línia 17 s'instal·len mòduls necessaris de php

  • a la línia 19 s'habilita el mòdul rewrite

Analitzant aquest fitxer, podeu, si cal, modificar-lo per tal d'afegir mòduls o configuracions pel que requereixi el vostre servidor web.

docker-compose.yml

docker-compose.yml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
version: "3.1"
services:
    db:
        image: mysql
        ports:
            - "3306:3306"
        command: --default-authentication-plugin=mysql_native_password
        environment:
            MYSQL_DATABASE: dbname
            MYSQL_PASSWORD: test
            MYSQL_ROOT_PASSWORD: test
        volumes:
            - ./dump:/docker-entrypoint-initdb.d
            - ./conf:/etc/mysql/conf.d
            - persistent:/var/lib/mysql
        networks:
            - default
    www:
        build: .
        ports:
            - "80:80"
        volumes:
            - ./www:/var/www/html
        links:
            - db
        networks:
            - default
    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        links:
            - db:db
        ports:
            - 8000:80
        environment:
            MYSQL_USER: root
            MYSQL_PASSWORD: test
            MYSQL_ROOT_PASSWORD: test
volumes:
    persistent:

Aquest fitxer és el que conté la informació dels tres contenidors/serveis que executarem. Podem veure la configuració de cada servidor a partir de les línies que inclouen els services. Línia 3, 18 i 28.

  • El servidor www

    • es crea a partir del fitxer Dockerfile que tenim al directori i això d'indica amb la directiva de la línia 19 build ..

    • exposa el port 80 i es mapeja al port 80 del servidor. Directiva ports

    • mapeja el directori del servidor ./www dins el contenidor en el directori /var/www/html. Això implica que la nostra pàgina web es troba al directori docker-lamp/www.

    • tindrà connexió cap el servidor db amb aquest mateix nom. No ens importa la IP que ens doni el docker-compose.

  • El servidor db

    • es crea a partir de la imatge mysql que es trobarà al repositori de Docker. Això d'indica amb la directiva de la línia 4 image.

    • exposa el port 3306 i es mapeja al port 3306 del servidor. Directiva ports

    • mapeja el directori del servidor ./dump dins el contenidor en el directori /docker-entrypoint-initdb.d.

    • mapeja el directori del servidor ./conf dins el contenidor en el directori /etc/mysql/conf.d.

    • fa que el directori /var/lib/mysql del contenidor es desi en un volum, per tant, no s'eliminarà si aturem i tornem a iniciar el servidor. Aquest volum s'anomena persistent i es defineix a la línia 39.

    • tindrà connexió cap el servidor db amb aquest mateix nom. No ens importa la IP que ens doni el docker-compose.

    • utilitza el mètode d'autenticació mysql native password que és més segur que utilitzar usuari i password. Es mostra a la línia 7: command: --default-authentication-plugin=mysql_native_password

    • a l'iniciar el contenidor, les línies 9 a 11 defineixen una base de dades que es crearà, dbname, l'usuari, test el password, test.

  • El servidor phpmyadmin

    • es crea a partir de la imatge phpmyadmin/phpmyadmin que es trobarà al repositori de Docker. Això d'indica amb la directiva de la línia 429 image.

    • exposa el port 80 i es mapeja al port 8000 del servidor. Directiva ports

    • tindrà connexió cap el servidor db amb aquest mateix nom. No ens importa la IP que ens doni el docker-compose.

    • configura el host, l'usuari i password del phpmyadmin per accedir al servidor, a les línies 35 a 37.

Posta en marxa dels servidors

Una vegada tenim la nostra configuració preparada i els fitxer al seu lloc, bàsicament els fitxers de la web al directori www i l'script de creació de taules de la base de dades al directori dump ja podem iniciar per primera vegada els servidors.

Per això utilitzarem la comanda

sudo docker-compose up -d

Totes les comandes docker-compose s'han d'executar des del directori docker-lamp.

Possible sortida de la comanda
isard@ubuntu:~/docker-lamp$ sudo docker-compose up -d
Creating network "docker-lamp_default" with the default driver
Creating volume "docker-lamp_persistent" with default driver
Pulling db (mysql:)...
latest: Pulling from library/mysql
bce031bc522d: Pull complete
cf7e9f463619: Pull complete
105f403783c7: Pull complete
878e53a613d8: Pull complete
2a362044e79f: Pull complete
6e4df4f73cfe: Pull complete
69263d634755: Pull complete
fe5e85549202: Pull complete
5c02229ce6f1: Pull complete
7320aa32bf42: Pull complete
Digest: sha256:4ef30b2c11a3366d7bb9ad95c70c0782ae435df52d046553ed931621ea36ffa5
Status: Downloaded newer image for mysql:latest
Building www
[+] Building 136.5s (11/11) FINISHED                                                                     docker:default
=> [internal] load build definition from Dockerfile                                                               0.0s
=> => transferring dockerfile: 611B                                                                               0.0s
=> [internal] load .dockerignore                                                                                  0.0s
=> => transferring context: 2B                                                                                    0.0s
=> [internal] load metadata for docker.io/library/php:8.0.0-apache                                                1.5s
=> [1/7] FROM docker.io/library/php:8.0.0-apache@sha256:d99955a6e712060827a9abd5f82c4218b82263e3a1ad609916efbca9  5.7s
=> => resolve docker.io/library/php:8.0.0-apache@sha256:d99955a6e712060827a9abd5f82c4218b82263e3a1ad609916efbca9  0.0s
=> => sha256:e97a1581dd7502f3108ff5460c5b7e4cabfe9ca1270d7ad31953a0ced7ec537e 12.91kB / 12.91kB                   0.0s
=> => sha256:db606474d60ce31604505c7d6dad9a66cb42f3818fca738832db2f2091cf89c9 225B / 225B                         0.2s
=> => sha256:afb30f0cd8e0ff78b5eecdc2d9365a50441ad83c5db5f1e87942d6426237fa56 76.65MB / 76.65MB                   1.0s
=> => sha256:d99955a6e712060827a9abd5f82c4218b82263e3a1ad609916efbca98b9fe768 1.86kB / 1.86kB                     0.0s
=> => sha256:6ec7b7d162b24bd6df88abde89ceb6d7bbc2be927f025c9dd061af2b0c328cfe 27.10MB / 27.10MB                   0.4s
=> => sha256:969206c3c9252899282deede1a4f9c34827944db3a388f708e93f504f7611194 3.04kB / 3.04kB                     0.0s
=> => sha256:3bb2e805159413e5278b859f7fbb86ddfc99e667cb705d5d5aec0a7c8ffcf1b5 225B / 225B                         0.3s
=> => sha256:4c761b44e2ccbff3f10b254b21bb00a52dfd26919ad9e3f7efcd569196e6c26b 18.68MB / 18.68MB                   0.6s
=> => extracting sha256:6ec7b7d162b24bd6df88abde89ceb6d7bbc2be927f025c9dd061af2b0c328cfe                          1.4s
=> => sha256:c2199db96575122fd559c29b619a2773fe9069e0266312a6369ac95f4464b1dd 434B / 434B                         0.5s
=> => sha256:1b9a9381eea8f93068e8043f18ea59b709c07256e2f90962931a1433fbdf5e79 487B / 487B                         0.7s
=> => sha256:3ca35111d640542cd6168619946a2d5c6c8c51aa2a127377d0454493088d4b90 11.06MB / 11.06MB                   1.6s
=> => sha256:e867c987304f3016276fa8490597fe9ecc75ea69b2382395d6f6454ab6d82fa8 493B / 493B                         1.4s
=> => sha256:b9389431ee45f8437f11bb465a30734c61c286e5fb1af3f3a4bf551a34d165d6 14.46MB / 14.46MB                   1.4s
=> => sha256:b3c527b355d636fb0c682be9b41700fe4dbffdaaedfe364ef57fb491800a92cf 2.27kB / 2.27kB                     1.7s
=> => sha256:673f280b653bb3e36609bc510f658fb1b07b6cf7c0a2bf5ee53f79e64d9d99eb 247B / 247B                         1.7s
=> => sha256:c3514500cfc58d1c9daaa70220a4255e25d539eba86d50d5afdc007b979d7bba 894B / 894B                         1.8s
=> => extracting sha256:db606474d60ce31604505c7d6dad9a66cb42f3818fca738832db2f2091cf89c9                          0.0s
=> => extracting sha256:afb30f0cd8e0ff78b5eecdc2d9365a50441ad83c5db5f1e87942d6426237fa56                          2.4s
=> => extracting sha256:3bb2e805159413e5278b859f7fbb86ddfc99e667cb705d5d5aec0a7c8ffcf1b5                          0.0s
=> => extracting sha256:4c761b44e2ccbff3f10b254b21bb00a52dfd26919ad9e3f7efcd569196e6c26b                          0.4s
=> => extracting sha256:c2199db96575122fd559c29b619a2773fe9069e0266312a6369ac95f4464b1dd                          0.0s
=> => extracting sha256:1b9a9381eea8f93068e8043f18ea59b709c07256e2f90962931a1433fbdf5e79                          0.0s
=> => extracting sha256:3ca35111d640542cd6168619946a2d5c6c8c51aa2a127377d0454493088d4b90                          0.1s
=> => extracting sha256:e867c987304f3016276fa8490597fe9ecc75ea69b2382395d6f6454ab6d82fa8                          0.0s
=> => extracting sha256:b9389431ee45f8437f11bb465a30734c61c286e5fb1af3f3a4bf551a34d165d6                          0.5s
=> => extracting sha256:b3c527b355d636fb0c682be9b41700fe4dbffdaaedfe364ef57fb491800a92cf                          0.0s
=> => extracting sha256:673f280b653bb3e36609bc510f658fb1b07b6cf7c0a2bf5ee53f79e64d9d99eb                          0.0s
=> => extracting sha256:c3514500cfc58d1c9daaa70220a4255e25d539eba86d50d5afdc007b979d7bba                          0.0s
=> [2/7] RUN docker-php-ext-install mysqli                                                                        8.7s
=> [3/7] RUN apt-get update     && apt-get install -y sendmail libpng-dev     && apt-get install -y libzip-dev   73.6s
=> [4/7] RUN docker-php-ext-install mbstring                                                                     25.2s
=> [5/7] RUN docker-php-ext-install zip                                                                           6.0s
=> [6/7] RUN docker-php-ext-install gd                                                                           14.6s
=> [7/7] RUN a2enmod rewrite                                                                                      0.7s
=> exporting to image                                                                                             0.1s
=> => exporting layers                                                                                            0.1s
=> => writing image sha256:2b3829254173bf99f40b40e331552729fdc27c2687ec2d7fba37560c7642465b                       0.0s
=> => naming to docker.io/library/docker-lamp_www                                                                 0.0s
WARNING: Image for service www was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Pulling phpmyadmin (phpmyadmin/phpmyadmin:)...
latest: Pulling from phpmyadmin/phpmyadmin
faef57eae888: Pull complete
989a1d6c052e: Pull complete
0705c9c2f22d: Pull complete
621478e043ce: Pull complete
98246dcca987: Pull complete
bfed8c155cb6: Pull complete
7a7c2e908867: Pull complete
d176994b625c: Pull complete
2d8ace6a2716: Pull complete
c70df516383c: Pull complete
15e1b44fe4c7: Pull complete
65e50d44e95a: Pull complete
77f68910bc0a: Pull complete
605dd3a6e332: Pull complete
99ce27188f07: Pull complete
74d64e32c5d5: Pull complete
ef5fc9928b9f: Pull complete
163f3256e112: Pull complete
Digest: sha256:67ba2550fd004399ab0b95b64021a88ea544011e566a9a1995180a3decb6410d
Status: Downloaded newer image for phpmyadmin/phpmyadmin:latest
Creating docker-lamp_db_1 ... done
Creating docker-lamp_phpmyadmin_1 ... done
Creating docker-lamp_www_1        ... done
isard@ubuntu:~/docker-lamp$

La primera vegada que executem aquesta comanda, es descarregaran les imatges d'internet, s'executaran els scripts RUN del fitxer Dockerfile i s'executaran els scripts de creació de bases de dades, uuaris i taules al servidor de base de dades.

Una vegada finalitzat el procés tindrem iniciats els tres contenidors que podrem observar amb la comanda

sudo docker-compose ps
Possible sortida del docker-compose ps
isard@ubuntu:~/docker-lamp$ sudo docker-compose ps
          Name                        Command               State                 Ports
-----------------------------------------------------------------------------------------------------
docker-lamp_db_1           docker-entrypoint.sh --def ...   Up      0.0.0.0:3306->3306/tcp, 33060/tcp
docker-lamp_phpmyadmin_1   /docker-entrypoint.sh apac ...   Up      0.0.0.0:8000->80/tcp
docker-lamp_www_1          docker-php-entrypoint apac ...   Up      0.0.0.0:80->80/tcp

o bé

sudo docker ps
Possible sortida del docker ps
isard@ubuntu:~/docker-lamp$ sudo docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED         STATUS         PORTS                               NAMES
dc460907b63b   docker-lamp_www         "docker-php-entrypoi…"   6 minutes ago   Up 6 minutes   0.0.0.0:80->80/tcp                  docker-lamp_www_1
ee6343184b41   phpmyadmin/phpmyadmin   "/docker-entrypoint.…"   6 minutes ago   Up 6 minutes   0.0.0.0:8000->80/tcp                docker-lamp_phpmyadmin_1
c2f8dc70f72b   mysql                   "docker-entrypoint.s…"   6 minutes ago   Up 6 minutes   0.0.0.0:3306->3306/tcp, 33060/tcp   docker-lamp_db_1
isard@ubuntu:~/docker-lamp$

Aquí podem veure els servidors iniciats amb la imatge que utilitzen i els ports que estan exposant.

Per tant, podrem :

web001 web002

Funciona? Com s'inicien els serveis i com s'ha creat la base de dades i les taules?

Per això cal mirar i saber bàsicament com treballen les imatges de docker. Les imatges de Docker estan en el hub de Docker, accessible a https://hub.docker.com/, però cal estar registrat.

  • El servidor www es crea a partir del fitxer Dockerfile on es defineix, a la línia 1 l'ús de la imatge php:8.0.0-apache que trobem a https://hub.docker.com/layers/library/php/8.0.0-apache/images/sha256-0445e078ac3160ab0ed76553498706b54cd0c03afd8be5f296d1b1a080ebce54?context=explore

  • El servidor db utilitza la imatge mysql que trobem a https://hub.docker.com/_/mysql on ens parla de les diferents variables d'entorn que podem utilitzar: MYSQL_ROOT_PASSWORD, MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD, MYSQL_RANDOM_ROOT_PASSWORD, MYSQL_ONETIME_PASSWORD, MYSQL_INITDB_SKIP_TZINFO.

    Una vegada hem executat el docker-compose, i se'ns ha descarregat la imatge, podem veure les opcions possibles executant la comanda

    sudo docker run -it --rm mysql:latest --verbose --help
    
    Per saber les imatges descarregades cal executar
    sudo docker images
    
    Possible sortida
    REPOSITORY              TAG       IMAGE ID       CREATED          SIZE
    docker-lamp_www         latest    cd7ff15979e6   21 minutes ago   425MB
    mysql                   latest    bc861cf238f2   4 weeks ago      619MB
    phpmyadmin/phpmyadmin   latest    933569f3a9f6   6 months ago     562MB
    
  • El servidor phpmyadmin utilitza la imatge phpmyadmin/phpmyadmin que trobem a https://hub.docker.com/r/phpmyadmin/phpmyadmin on ens indica:

    • Credentials

      phpMyAdmin connects using your MySQL server credentials. Please check your corresponding database server image for information on the default username and password or how to specify your own custom credentials during installation.

      The official MySQL and MariaDB images use the following environment variables to define these:

      MYSQL_ROOT_PASSWORD - This variable is mandatory and specifies the password that will be set for the root superuser account. MYSQL_USER, MYSQL_PASSWORD - These variables are optional, used in conjunction to create a new user and to set that user's password.

Cada servidor inicia sempre el seu servei i en el moment de la creació executa els fitxers de configuració.

Sembla ser que el de mysql carrega el fitxer .sql que es troba al seu directori, /docker-entrypoint-initdb.d, que per nosaltres és el directori dump, on hi ha el fitxer myDB.sql amb un script sql de creació de taules i inserts. Una taula i 4 registres, però, podria ser més complexe.

Aturada dels contenidors

Per aturar els contenidors podem utilitzar la comanda

sudo docker-compose stop
Possible sortida del docker-compose stop
isard@ubuntu:~/docker-lamp$ sudo docker-compose stop
Stopping docker-lamp_www_1        ... done
Stopping docker-lamp_phpmyadmin_1 ... done
Stopping docker-lamp_db_1         ... done

Ara, si intentem accedir als servidors veurem que aquests no contesten.

i podem veure que tenim els servidors aturats amb la comanda

sudo docker-compose ps
Possible sortida de docker-compose ps
isard@ubuntu:~/docker-lamp$ sudo docker-compose ps
          Name                        Command               State    Ports
--------------------------------------------------------------------------
docker-lamp_db_1           docker-entrypoint.sh --def ...   Exit 0
docker-lamp_phpmyadmin_1   /docker-entrypoint.sh apac ...   Exit 0
docker-lamp_www_1          docker-php-entrypoint apac ...   Exit 0

Tornem a iniciar els contenidors

Per tornar a iniciar els contenidors utilitzarem la comanda

sudo docker-compose start

Compte...

ja que per crear-los i iniciar-los la primera vegada hem utilitzat el paràmetre up i per iniciar els que tenim aturats utilitzarem el paràmetre start.

Utilitzeu la comanda

docker-compose --help

per veure més opcions.

Aquesta vegada ha trigat moltíssim menys.

Puc accedir a aquests contenidors d'alguna forma?

Sí, al final, docker-compose és una eina que permet executar i configurar diferents contenidors Docker en un sol fitxer; però cadascun dels contenidors és igualment accessible tal i com podem fer-ho amb comandes Docker-compose o amb comandes Docker. Anem a veure'n alguna:

Executem una comanda sense entrar al contenidor

Podem executar comandes del servidor, com si estiguéssim dins amb la comanda

docker-compose exec...
docker-compose exec <servei> <comanda>
Exemple docker-compose exec...
sudo docker-compose exec www pwd

Amb les comandes de Docker podem executar comandes interactives, per exemple obrir una shell o el client mysql. Per això podem especificar la opció -ti (interactiu)

docker exec...
docker exec <contenidor> -ti <comanda_interactiva>

Per referenciar el contenidor podem utilitzar el CONTAINER ID o bé el NAME que obtenim amb la comanda docker ps.

Obrim una shell al servidor www
sudo docker exec -ti docker-lamp_www_1 /bin/bash
Possible sortida
isard@ubuntu:~/docker-lamp$ sudo docker exec -ti docker-lamp_www_1 /bin/bash
root@dc460907b63b:/var/www/html# pwd
/var/www/html
root@dc460907b63b:/var/www/html# exit
exit

Fixeu-vos com ha canviat el PROMPT i ens indica el servidor al que estem dc460907b63b

Obrim el client mysql al servidor db
sudo docker exec -ti docker-lamp_db_1 mysql -u root -ptest
Obrim una shell al servidor phpmyadmin
sudo docker exec -ti docker-lamp_phpmyadmin_1 /bin/bash

Les imatges dels contenidors Docker solen tenir el mínim software instal·lat i per tant algunes comandes poden no funcionar.

Aturem el contenidor phpmyadmin

Per aturar un sol contenidor podem utilitzar comandes de Docker.

Aturem el contenidor phpmyadmin
sudo docker stop docker-lamp_phpmyadmin_1

i mirem com estem ...

docker-compose ps
sudo docker-compose ps
Possible sortida
          Name                        Command               State                  Ports
------------------------------------------------------------------------------------------------------
docker-lamp_db_1           docker-entrypoint.sh --def ...   Up       0.0.0.0:3306->3306/tcp, 33060/tcp
docker-lamp_phpmyadmin_1   /docker-entrypoint.sh apac ...   Exit 0
docker-lamp_www_1          docker-php-entrypoint apac ...   Up       0.0.0.0:80->80/tcp

Per tornar a iniciar-lo amb comandes de Docker.

Iniciem el contenidor phpmyadmin
sudo docker star docker-lamp_phpmyadmin_1

i mirem com estem ...

docker-compose ps
sudo docker-compose ps
Possible sortida
          Name                        Command               State                 Ports
-----------------------------------------------------------------------------------------------------
docker-lamp_db_1           docker-entrypoint.sh --def ...   Up      0.0.0.0:3306->3306/tcp, 33060/tcp
docker-lamp_phpmyadmin_1   /docker-entrypoint.sh apac ...   Up      0.0.0.0:8000->80/tcp
docker-lamp_www_1          docker-php-entrypoint apac ...   Up      0.0.0.0:80->80/tcp

Altres

Si modifiqueu els fitxers del directori www veureu els canvis immediatament a la web. Aquest directori està compartit entre el servidor i el contenidor. Així podem treballar sense instal·lacions complicades.

Caldria aprendre més sobre Docker i Docker-compose per tal de muntar serveis i servidors, de qualsevol cosa, en un moment. Només cal trobar la imatge adequada. Segurament en trobarem alguna de VueJS, etc. Només cal saber on posar els fitxers i les opcions de configuració.

Totes les comandes docker-compose s'han d'executar des del directori docker-lamp.