En el tema anterior vimos lo básico para empezar a usar Docker. En este tema vamos a ver aspectos mas avanzados de Docker y trucos a tener en cuenta para usarlo.
Mas información:
Docker permite crear redes aisladas entre los distintos contenedores. De esa forma , si un contenedor es atacado, no se tendrá acceso por red al resto de los contenedores sino únicamente a los de su propia red.
Orden | Explicación |
---|---|
docker network create | Crea una red |
docker network rm | Borrar una red |
docker network ls | Ver las redes que hay |
docker network connect | Conecta un contenedor a una red |
docker network disconnect | Desconecta un contenedor de una red |
Para trabajar con redes, lo que debemos hacer es
docker network create nombreDeLaRed
docker network connect nombreDeLaRed nombreDelContenedor
docker container run
con la opción --network=nombreDeLaRed
docker container run \ -dit \ -v /opt/mariadb:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=root \ -p 4000:3306 \ --network=nombreDeLaRed \ --name prueba_mariadb \ mariadb:10.1
¿Recuerdas la cabecera Host
de HTTP? Servía para indicar a que servidor web iba dirigida la petición ya que en una misma máquina se ponían varios servidores web.
Pues vamos ahora a configurar Docker para que todos los servidores compartan el mismo puerto (el 80). Para ello vamos a usar un servidor proxy llamado Nginx. Obviamente, Nginx va estar dentro de otro contenedor de Docker. La imagen a usar es jwilder/nginx-proxy con tag 0.7.0.
Para arrancar el servidor usamos la siguiente orden:
sudo docker container run \ -dit \ -p 80:80 \ --restart always \ -v /var/run/docker.sock:/tmp/docker.sock:ro \ --name nginx-proxy \ nginxproxy/nginx-proxy:1.1.0
Como vemos no tiene nada de especial excepto la línea -v /var/run/docker.sock:/tmp/docker.sock:ro
pero solo decir que es para que Nginx pueda acceder al Docker real de la máquina real.
Y ahora , ¿Como arrancamos nuestro servidores web? Pues simplemente hay que añadir dos parámetros y quitar uno.
-p puertoExterno:puertoInterno
ya que ahora el contenedor no se va a exponer al exterior. -e VIRTUAL_PORT=puertoInterno
: Siendo puertoInterno donde está escuchando nuestro servidor Web. Esa información la sabremos por la documentación -e VIRTUAL_HOST=nombreDominio
: Siendo nombreDominio el nombre del dominio que queremos que gestione el servidor que estamos arrancando.Veamos el siguiente ejemplo:
sudo docker container run \ -dit \ -v /home/alumno/lorenzo/httpd:/var/www/html \ -e VIRTUAL_PORT=80 -e VIRTUAL_HOST=lorenzo.daw2.pve3.fpmislata.com \ --name lorenzo_apache \ php:8.1-apache-bullseye
Vemos que el servidor está escuchando en el puerto 80 y va a gestionar las peticiones del dominio lorenzo.daw2.pve3.fpmislata.com que lleguen a Nginx.
Mas información:
Ahora para que funcione el proxy con nginx ya no podemos acceder a la máquina real con la IP sino que habrá que usar el nombre de dominio. Si no tenemos acceso a un nombre de dominio real, podemos simular nosotros uno modificando el fichero hosts
de la máquina donde vayamos a hacer la petición.
El fichero hosts simplemente contiene IPs y nombre e dominio que usará nuestro ordenador. De esa forma simularemos tener un dominio.
En los siguientes artículos se explica como modificar el fichero hosts
Para desplegar una aplicación PHP en Apache vamos a usar la imagen PHP con apache. Tag: 7.2-apache. Esta imagen no viene con los drivers para MariaDB/MySQL ni con el módulo de Apache de mod_rewrite
. Por lo tanto si queremos hacer uso de ellos , deberemos instalarlos cada vez que creemos la imagen. Para ello se usan las siguientes órdenes:
docker container exec -it nombreContenedor docker-php-ext-install pdo pdo_mysql docker container exec -it nombreContenedor a2enmod rewrite docker container restart nombreContenedor
Para acabar es necesario indicar que para crear la carpeta "dist" a desplegar suele ser necesario instalar software adicionas como por ejemplo NodeJS o PHP. Veamos como instalar algunas de esas herramientas en Linux
apt install php
apt install curl php-cli php-mbstring git unzip php-xml curl -sS https://getcomposer.org/installer -o composer-setup.php php composer-setup.php --install-dir=/usr/local/bin --filename=composer composer
apt install nodejs apt install npm nodejs -v * SASS
sudo npm install -g sass * Eliminar Apache
sudo service apache2 stop sudo apt-get purge apache2 apache2-utils apache2.2-bin apache2-bin apache2-common sudo apt-get autoremove whereis apache2 sudo rm -rf /etc/apache2
Crea un contenedor llamado "maria_a" que sean de MariaDB:
Crea un contenedor llamado "maria_b" que sean de MariaDB:
Crea un contenedores llamado "apache_a" que sean del servidor web Apache con PHP:
.env
para guardar los datos de conexión a la base de datos
Crea un contenedores llamado "apache_b" que sean del servidor web Apache con PHP:
.env
para guardar los datos de conexión a la base de datos
Modifica únicamente el fichero .env
de cada servidor para que ahora se conecten a la otra base de datos. Deberá funcionar todo sin problemas.
Vuelve a dejar las conexiones como estaban antes del ejercicio.
Crea ahora dos redes llamadas:
Vuelve a crear los 4 contenedores de antes pero de forma que cada uno esté asociado a una red distinta.
Contenedor | Red |
---|---|
apache_a | red_a |
maria_a | red_a |
apache_b | red_b |
maria_b | red_b |
Prueba que los 2 servidores web siguen funcionando y accediendo a sus bases de datos correspondientes.
Modifica únicamente el fichero .env
de cada servidor para que ahora se conecten a la otra base de datos. No deberán poder conectarse
Vuelve a dejar las conexiones como estaban antes del ejercicio, es decir todas conectadas a "prueba_red".
Hasta ahora para acceder a cada servidor web usabas los puertos 3010
y 3020
. Vamos ahora a usar el servidor Proxy Nginx para que a ambos se pueda acceder por nombre de dominio y todos por el puerto 80. Para ello ya no vamos a usar nuestra máquina sino que vamos a usar la máquina que nos proporciona el centro, a la que nos tenemos que conectar por VPN. En esa máquina ya hemos instalado Nginx como proxy.
En esa máquina haz lo siguiente
VIRTUAL_HOST
vale "tuNombre.daw2.pve2.fpmislata.com"VIRTUAL_PORT
vale "80" /opt/tuNombre/docker/apache
/opt/tuNombre/docker/apache
/opt/tuNombre/docker/mariadb
Prueba a navegar la siguientes url (y deberá funcionar):
Crea un proyecto Web en GitHub llamado "ejemplodaw" en los que haya lo siguiente:
El proyecto es similar al anterior solo que ahora también hay código SASS.
Incluye en el proyecto un script de bash llamado deploy.sh
para desplegar el proyecto en docker. El script se ejecutará con npm run deploy
. El script hará lo siguiente:
src
a dist
dist
el código SASSdist
a /opt/tuNombre/docker/apache
En la máquina real ves a la carpeta /opt/tuNombre
y haz un git clone del proyecto que acabas de crear en GitHub. Se creará la carpeta /opt/tuNombre/ejemplodaw
.
Para probar que todo funciona haz cambios en el SASS en master , súbelos a GitHub y ejecuta dentro de la máquina Linux lo siguiente:
cd /opt/tuNombre/ejemplodaw git fetch --prune --force git checkout master git merge --ff-only origin/master npm run deploy
Prueba a navegar a http://tuNombre.daw2.pve2.fpmislata.com y se verán los cambios.