Queremos ejecutar en un contenedor docker la aplicación web escrita en PHP: bookMedik.
Tarea 1
Ejecución de la aplicación web PHP bookMedik en docker
- Queremos ejecutar en un contenedor docker la aplicación web escrita en PHP: bookMedik (https://github.com/evilnapsis/bookmedik).
- Es necesario tener un contenedor con mariadb donde vamos a crear la base de datos y los datos de la aplicación. El script para generar la base de datos y los registros lo encuentras en el repositorio y se llama schema.sql. Debes crear un usuario con su contraseña en la base de datos. La base de datos se llama bookmedik y se crea al ejecutar el script.
- Ejecuta el contenedor mariadb y carga los datos del script schema.sql. Para más información.
- El contenedor mariadb debe tener un volumen para guardar la base de datos.
- Crea una imagen docker con la aplicación desde una imagen base de debian o ubuntu. Ten en cuenta que el fichero de configuración de la base de datos (core\controller\Database.php) lo tienes que configurar utilizando las variables de entorno del contenedor mariadb. (Nota: Para obtener las variables de entorno en PHP usar la función getenv. Para más infomación).
- La imagen la tienes que crear en tu máquina con el comando docker build.
- Crea un contenedor a partir de la imagen anterior, enlazado con el contenedor mariadb, y comprueba que está funcionando (Usuario: admin, contraseña: admin)
- El contenedor que creas debe tener un volumen para guardar los logs de apache2.
Creamos la red del contenedor:
1
2
root@bookmedik:~/tarea1# docker network create bookmedik
156229b4609abda50303cc7cd7e355bbdf317087f4c511e1a6ca93addd592b89
Contenedor de la base de datos:
1
root@bookmedik:~/tarea1# docker run -d --name servidor_mysql --network bookmedik -e MYSQL_DATABASE=bookmedik -e MYSQL_USER=bookmedik -e MYSQL_PASSWORD=bookmedik -e MYSQL_ROOT_PASSWORD=asdasd mariadb
Cargamos los datos en la base de datos
1
root@bookmedik:~/tarea1/bookmedik# cat schema.sql | docker exec -i servidor_mysql /usr/bin/mysql -u root --password=asdasd bookmedik
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
root@bookmedik:~/tarea1# nano Dockerfile
FROM debian
RUN apt-get update && apt-get install -y apache2 libapache2-mod-php7.3 php7.3 php7.3-mysql && apt-get clean && rm -rf /var/lib/apt/lists/*
RUN rm /var/www/html/index.html
ENV APACHE_SERVER_NAME www.bookmedikernesto.com
ENV MARIADB_USER bookmedik
ENV MARIADB_PASS bookmedik
ENV MARIADB_HOST servidor_mysql
EXPOSE 80
COPY ./bookmedik /var/www/html
ADD script.sh /usr/local/bin/script.sh
RUN chmod +x /usr/local/bin/script.sh
CMD ["/usr/local/bin/script.sh"]
Script:
1
2
3
4
5
6
root@docker:~# cat script.sh
#!/bin/bash
sed -i 's/$this->user="root";/$this->user="'${MARIADB_USER}'";/g' /var/www/html/core/controller/Database.php
sed -i 's/$this->pass="";/$this->pass="'${MARIADB_PASS}'";/g' /var/www/html/core/controller/Database.php
sed -i 's/$this->host="localhost";/$this->host="'${MARIADB_HOST}'";/g' /var/www/html/core/controller/Database.php
apache2ctl -D FOREGROUND
Imagen y contenedor:
1
2
3
root@docker:~# docker build -t ernestovazquez/bookmedik:v1 .
root@bookmedik:~/tarea1# docker run -d --name bookmedik --network bookmedik -p 80:80 ernestovazquez/bookmedik:v1
Volumen de la base de datos:
1
root@docker:~# docker run -d --name servidor_mysql --network bookmedik -v /opt/bbdd_mariadb:/var/lib/mysql -e MYSQL_DATABASE=bookmedik -e MYSQL_USER=bookmedik -e MYSQL_PASSWORD=bookmedik -e MYSQL_ROOT_PASSWORD=bookmedik mariadb
Log para apache
1
2
3
root@docker:~# docker run -d --name bookmedik --network bookmedik -v /opt/logs_apache2:/var/log/apache2 -p 80:80 ernestovazquez/bookmedik:v1
root@docker:~/bookmedik# cat schema.sql | docker exec -i servidor_mysql /usr/bin/mysql -u root --password=asdasd bookmedik
Vemos de nuevo la web:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@docker:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e82d5e331fab ernestovazquez/bookmedik:v1 "/usr/local/bin/scri…" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp bookmedik
f25dbff87579 mariadb "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 3306/tcp servidor_mysql
root@docker:~# docker rm -f f25dbff87579
f25dbff87579
root@docker:~# docker rm -f e82d5e331fab
e82d5e331fab
root@docker:~# docker run -d --name servidor_mysql --network bookmedik -v /opt/bbdd_mariadb:/var/lib/mysql -e MYSQL_DATABASE=bookmedik -e MYSQL_USER=bookmedik -e MYSQL_PASSWORD=bookmedik -e MYSQL_ROOT_PASSWORD=asdasd mariadb
a59e9e77e97f3881bfec19853d0cad9ca7a738f42e2ee329310bc60fee4b659f
root@docker:~# docker run -d --name bookmedik --network bookmedik -v /opt/logs_apache2:/var/log/apache2 -p 80:80 ernestovazquez/bookmedik:v1
ae3d89739b7ad7ed843caa7ec4657f4699d2cd85e86f0b29625129209af2e4d6
Tarea 2
Ejecución de una aplicación web PHP con imagenes de PHP y apache2 de DockerHub
- Realiza la imagen docker de la aplicación a partir de la imagen oficial PHP que encuentras en docker hub. Lee la documentación de la imagen para configurar una imagen con apache2 y php, además seguramente tengas que instalar alguna extensión de php.
- Crea esta imagen en docker hub.
- Crea un script con docker compose que levante el escenario con los dos contenedores.
Ahora vamos a crear un script con docker compose que levante el escenario con los dos contenedores.
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
version: '3.1'
services:
bookmedikt2:
container_name: bookmedikt2
image: php:7.4.3-apache
restart: always
environment:
MARIADB_USER: bookmedik
MARIADB_PASS: bookmedik
MARIADB_HOST: mysqlt2
ports:
- 80:80
volumes:
- /opt/logs_apache2:/var/log/apache2
- ./script.sh:/usr/local/bin/script.sh
- ./bookmedik:/var/www/html
command: >
bash /usr/local/bin/script.sh
mysqlt2:
container_name: mysqlt2
image: mariadb
restart: always
environment:
MYSQL_DATABASE: bookmedik
MYSQL_USER: bookmedik
MYSQL_PASSWORD: bookmedik
MYSQL_ROOT_PASSWORD: asdasd
volumes:
- /opt/mariat2:/var/lib/mysql
Dockerfile:
1
2
3
4
5
6
7
8
9
10
11
12
FROM php:7.4.3-apache
ENV MARIADB_USER bookmedik
ENV MARIADB_PASS bookmedik
ENV MARIADB_HOST mysqlt2
RUN docker-php-ext-install pdo pdo_mysql mysqli json
RUN a2enmod rewrite
EXPOSE 80
WORKDIR /var/www/html
COPY ./bookmedik /var/www/html
ADD script.sh /usr/local/bin/script.sh
RUN chmod +x /usr/local/bin/script.sh
CMD ["/usr/local/bin/script.sh"]
Añadimos la siguiente linea al script que hemos creado anteriormente:
1
docker-php-ext-install pdo pdo_mysql mysqli json
Levantamos docker-compose:
1
2
3
4
5
6
7
8
9
10
11
root@docker:~/tarea2# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@docker:~/tarea2# docker-compose up -d
Creating bookmedikt2 ... done
Creating mysqlt2 ... done
root@docker:~/tarea2# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
03c7ae76bdd2 mariadb "docker-entrypoint.s…" 39 seconds ago Up 38 seconds 3306/tcp mysqlt2
d6d8997f2cfc php:7.4.3-apache "docker-php-entrypoi…" 39 seconds ago Up 38 seconds 0.0.0.0:80->80/tcp bookmedikt2
https://github.com/ernestovazquez/docker-tarea2
Tarea 3
Ejecución de un CMS en docker
- En este caso queremos usar un contenedor que utilice nginx para servir la aplicación PHP. Puedes crear la imagen desde una imagen base debian o ubuntu o desde la imagen oficial de nginx.
- Vamos a crear otro contenedor que sirva php-fpm.
- Y finalmente nuestro contenedor con la aplicación.
- Crea un script con docker compose que levante el escenario con los tres contenedores.
A lo mejor te puede ayudar el siguiente enlace: Dockerise your PHP application with Nginx and PHP7-FPM
Creamos el docker-compose:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '3.1'
services:
db:
container_name: nginxdb
image: mariadb
restart: always
environment:
MYSQL_USER: bookmedik
MYSQL_PASSWORD: bookmedik
MYSQL_DATABASE: bookmedik
MYSQL_ROOT_PASSWORD: root
volumes:
- /opt/mariat3:/var/lib/mysql
Levantamos el contenedor:
1
2
3
root@docker:~/tarea3# docker-compose up -d
Creating network "tarea3_default" with the default driver
Creating nginxdb ... done
Comprobaciones:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@docker:~/tarea3/bookmedik# cat schema.sql | docker exec -i nginxdb /usr/bin/mysql -u root --password=root
root@docker:~/tarea3/bookmedik# docker exec -it nginxdb bash
MariaDB [bookmedik]> show tables;
+---------------------+
| Tables_in_bookmedik |
+---------------------+
| category |
| medic |
| pacient |
| payment |
| reservation |
| status |
| user |
+---------------------+
7 rows in set (0.001 sec)
Creación del Dockerfile:
1
2
3
4
5
6
7
8
9
root@docker:~/tarea3# nano Dockerfile
FROM php:7-fpm
RUN docker-php-ext-install mysqli
ENV MYSQL_USER bookmedik
ENV MYSQL_PASSWORD bookmedik
ENV MYSQL_HOST nginxdb
ENV MYSQL_DB bookmedik
EXPOSE 9000
Creamos la imagen.
root@docker:~/tarea3# docker build -t ernestovazquez/tarea3:v1 .
Editamos el docker-compose:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@docker:~/tarea3# nano docker-compose.yml
fpm:
container_name: nginxfpm
image: ernestovazquez/tarea3:v1
volumes:
- /opt/mariat3:/var/www/html
app:
container_name: bookmedik
image: nginx:latest
ports:
- 80:80
volumes:
- /opt/mariat3:/var/www/html
- ./bookmedik.conf:/etc/nginx/conf.d/default.conf
Por último levantamos los nuevos contenedores:
1
root@docker:~/tarea3# docker-compose up -d
Tarea 4
- A partir de una imagen base (que no sea una imagen con el CMS), genera una imagen que despliegue un CMS PHP (que no sea wordpress). El contenedor que se crea a partir de esta imagen se tendrá que enlazar con un contenedor mariadb o postgreSQL.
- Crea los volúmenes necesarios para que la información que se guarda sea persistente.
Tarea 5
Ejecución de un CMS en docker con una imagen de DockerHub
- Busca una imagen oficial de un CMS PHP en docker hub (distinto al que has instalado en la tarea anterior, ni wordpress), y crea los contenedores necesarios para servir el CMS, siguiendo la documentación de docker hub.
Creamos el docker-compose:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
version: '3'
services:
mediawiki:
image: mediawiki
restart: always
ports:
- 8080:80
links:
- database
volumes:
- /var/www/html/images
- ./LocalSettings.php:/var/www/html/LocalSettings.php
database:
image: mariadb
restart: always
environment:
MYSQL_DATABASE: my_wiki
MYSQL_USER: wikiuser
MYSQL_PASSWORD: example
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
Lanzamos los contenedores con:
1
2
3
root@docker:~/mediawiki# docker-compose up -d
Creating mediawiki_database_1 ... done
Creating mediawiki_mediawiki_1 ... done
Nos descargamos el fichero y lo ponemos en el mismo directorio que el docker-compose.
1
2
root@docker:~/mediawiki# ls
docker-compose.yml LocalSettings.php
Cargamos de nuevo el docker-compose:
1
2
3
4
5
mediawiki_database_1 is up-to-date
Recreating mediawiki_mediawiki_1 ... done
root@docker:~/mediawiki# ls
docker-compose.yml LocalSettings.php
Ya tendremos nuestra página cargada e instalada.