Tumgik
eseyp · 4 years
Link
Tumblr media
0 notes
eseyp · 4 years
Link
0 notes
eseyp · 4 years
Link
Tumblr media
0 notes
eseyp · 4 years
Link
Tumblr media
0 notes
eseyp · 4 years
Text
Ubuntu Docker Container como Stack LAMP (PARTE 1)
La idea es lanzar un contenedor con Ubuntu y correr servicios web en dicho contenedor.
Preparativos previos
Host
El siguiente proyecto se va a realizar en una máquina virtual (VirtualBox) con las siguientes características:
System Information Operating System Ubuntu 18.04.3 LTS 4.15.0-76-generic x86_64 Model innotek GmbH VirtualBox Motherboard Oracle Corporation VirtualBox BIOS innotek GmbH VirtualBox Processor Information Name Intel Core i5-7400 Topology 1 Processor, 2 Cores Identifier GenuineIntel Family 6 Model 158 Stepping 9 Base Frequency 3.00 GHz L1 Instruction Cache 32.0 KB x 2 L1 Data Cache 32.0 KB x 2 L2 Cache 256 KB x 2 L3 Cache 6.00 MB x 2 Memory Information Size 1.95 GB
Networking
Se configuró el adaptador de red de la VM como "adaptador puente" para que el host invitado esté dentro del mismo rango de red que el host anfitrión.
Con el comando ip avisualizamos el estado de red, donde enp0s3 es la placa de red de la VM.
mini@ubuntu:~$ ip a ... 2: enp0s3: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:a6:4f:5c brd ff:ff:ff:ff:ff:ff inet 192.168.1.39/24 brd 192.168.1.255 scope global dynamic ...
La dirección 192.168.1.39 es la dirección del host en el que correrán nuestros contenedores Docker.
Ubuntu image
Con docker descargamos la última version disponible de Ubuntu.
$ sudo docker pull ubuntu:latets
Podemos ver en formato de lista el total de imágenes descargadas.
mini@ubuntu:~$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 72300a873c2c 3 weeks ago 64.2MB
Terminología
Host Docker: La VM en la que se ejecutan los contenedores mini@ubuntu:~$.
Entorno
Puntos de montaje
Cuando se ejecuta un contenedor se crean volúmenes o storages propios del contenedor los cuales no son accesibles desde fuera. En el escenario de un servidor LAMP vamos a necesitar tener acceso a /var/www/html, para esto vamos crear un punto de montaje de los directorios que queramos acceder desde fuera.
Queremos que el directorio /var/www/html del contenedor esté montado en un directorio por fuera, es decir, en un directorio en el Host Docker, para ello vamos a crear un directorio que definiremos como parámetro al momento de lanzar el contenedor.
mini@ubuntu:~$ mkdir -p ~/ubuntu/www-data
Batir y hornear
Ubuntu container
Lanzamos el contenedor.
mini@ubuntu:~$ sudo docker run -it \ -p 80:80 \ -p 4444:22 \ --name ubuntuLAMP \ -v "$HOME/ubuntu/www-data":/var/www/html \ ubuntu /bin/bash
Las opciones son las siguientes:
-it Modo interactivo, básicamente permite la interacción con el intérprete de comandos del contenedor. De otra forma no podríamos usar bash y ejecutar comandos.
-p80:80 Indicamos que toda petición entrante al puerto 80 del host anfitrión redirija al puerto 80 del contenedor.
-p 4444:22 Abrimos el puerto 4444 para acceso SSH.
--name ubuntuLAMP Nombre que va a tener el contenedor (no confundir con el nombre de imágen).
-v "~/ubuntu/www-data":/var/www/html Se definen los puntos de montaje.
ubuntu /bin/bash Lanzamos la imagen Ubuntu y además enviamos la orden de ejecutar un intérprete de comandos, este parámetro es el que nos habilita una consola para introducir órdenes dentro del contenedor, recomiendo fuertemente leer información sobre chroot.
Apache Web Server y SSH
Cuando iniciamos el contenedor, y por causa del parámetro /bin/bash nuestro prompt va a cambiar a algo como esto:
root@d8156daf1a55:/#
Es muy importante saber que este no es un sistema operativo completo como tal, es el conjunto de programas, configuraciones y estructuras de directorios que comparten el kernel del Host Docker (nuevamente, leer sobre chroot), por lo tanto no bootea ni levanta servicios, a menos que demos la orden explícita (como veremos mas adelante).
Con el prompt indicando que estamos trabajando con el interprete del contenedor pasamos a instalar algunas herramientas y el servidor web.
root@d8156daf1a55:/# apt update && apt install -y vim nano ssh apache2
Terminada la instalción de paquetes vamos a listar los servicios.
NOTA: En un entorno chroot como un contenedor Docker no se bootea un sistema operativo, por lo tanto carecemos de herramientas como systemd.
root@d8156daf1a55:/# service --status-all | grep apache2 [ + ] apache-htcacheclean [ - ] apache2 [ - ] dbus [ ? ] hwclock.sh [ - ] procps [ - ] ssh
Los signos [ + ] indican que los servicios están ejecución, los [ - ] lo contrario, como se explicó, no tenemos un sistema que "enciendan los servicios" al inicio del sistema, porque (insisto), es un container con el conjunto de herramientas de un sistema operativo el cual no bootea ni inicia, solo ejecutamos programas en un entorno aislado (container/chroot) que se vale del kernel del sistema operativo anfitrión.
Iniciamos Apache2
root@d8156daf1a55:/# service apache2 start root@d8156daf1a55:/# service --status-all | grep apache2 [ + ] apache2
Iniciamos SSH
root@d8156daf1a55:/# service ssh start root@d8156daf1a55:/# service --status-all | grep ssh [ + ] ssh
El comando service ejecuta un script de control de servicios, los podemos encontrar en /etc.
root@d8156daf1a55:/# ls /etc/init.d/ apache-htcacheclean apache2 dbus hwclock.sh procps ssh
Para testear que apache esta sirviendo correctamente desde un navegador vamos a la URL http://192.168.1.39, claramente esta IP es la del host donde corren los contenedores (ver preparativos previo).
Para el caso de ssh es distinto, por que hemos hecho una redirección desde el puerto 4444 (correspondiente al Host Docker) hacia el 22 (correspondiente al contenedor de Ubuntu), por lo tanto para conectarnos mediante ssh sería así $ ssh -p 4444 [email protected]
NOTA: Al usuario root, por defecto, no se le permite login vía ssh por lo que habrá que activarlo o crear un usuario estándar.
MySQL
La siguiente componente del stack es el servicio de bases de datos.
root@d8156daf1a55:/# apt install mysql-server mysql-client
Encendemos el servicio.
root@d8156daf1a55:/# service mysql start root@d8156daf1a55:/# service --status-all | grep mysql [ + ] mysql
Finalmente testeamos conectarnos al servidor.
root@d8156daf1a55:/# mysql -u root
Tras la ejecución del comando deberíamos entrar en la consola de administración.
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 9 Server version: 5.7.29-0ubuntu0.18.04.1 (Ubuntu) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respectiveowners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
Para salir de lo consola solo damos la orden quit.
PHP
Por último instalamos php, módulos y dependencias, aunque no es el último paso.
root@d8156daf1a55:/# apt install php libapache2-mod-php php-mysql
Como se instalaron módulos que conectan entre si los servicios mysql, apache y el intérprete php es necesario reiniciar apache.
root@d8156daf1a55:/# service apache2 restart
Testing Stack LAMP
El clásico info.php, éste es un programa muy sencillo en php que genera un resumen acerca del servidor LAMP.
Creamos el archivo /var/www/html/info.php con el siguiente contenido.
<?php // Muestra toda la información, por defecto INFO_ALL phpinfo(); // // Muestra solamente la información de los módulos. // // phpinfo(8) hace exactamente lo mismo. phpinfo(INFO_MODULES); ?>
Testeamos nuestro stack accediendo a la URL .
http://192.168.1.39/info.php
Administración de Contenedores
En este punto ya tenemos nuestro Stack LAMP configurado corriendo dentro de un contendedor Ubuntu. Ahora nos queda ver algunos casos de administración y responder preguntas lógicas.
El último paso fue crear el archivo info.php, ciertamente ya no deberíamos estar "dentro" del container, por lo tanto salimos con exit.
root@d8156daf1a55:/# exit exit mini@ubuntu:~$
Hemos salido del contenedor, ahora desde el Host Docker me surgieron varias preguntas tales como ¿Como vuelvo a entrar? ¿Como controlo los servicios del contenedor? ¿Como veo los logs?
Estado del contenedor
Luego de haber salido del contenedor con exit vamos a ver el estado del contenedor.
mini@ubuntu:~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d8156daf1a55 ubuntu "/bin/bash" 20 hours ago Exited (130) 9 minutes ago ubuntuLAMP
Vemos que la columna STATUS nos indica que el contenedor está detenido con un Exited (130), esto es así por que desde el principio iniciamos el contenedor seguido de la ejecución del intérprete bash (del contenedor). Aunque suene abstracto, nunca nos "conectamos" o "entramos al contenedor", en realidad ejecutamos un intérprete de comandos que existe en un contenedor, por lo tanto es un proceso enjaulado mediante Docker junto con todo un árbol de directorios de un SO (Ubuntu) también enjaulados en el contenedor.
Entonces ¿Que pasa si enciendo el contenedor? ¿También se inician los servicios que hemos instalado? La respuesta es no, recordemos que no estamos iniciando un sistema operativo, un contenedor no bootea, podemos iniciar el contenedor y luego enviar órdenes desde fuera para ir activando los servicios.
Iniciamos el contenedor y verificamos el estado.
mini@ubuntu:~$ sudo docker start ubuntuLAMP ubuntuLAMP mini@ubuntu:~$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d8156daf1a55 ubuntu "/bin/bash" 20 hours ago Up 4 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:4444->22/tcp ubuntuLAMP
Ya tenemos el contenedor en Up pero si tratamos de conectarnos por ssh o acceder al servidor web no vamos a obtener ninguna respuesta, puesto que los servicios del contenedor no fueron iniciados.
Docker exec
Podríamos ejecutar el intérprete de comandos del contenedor para iniciar los servicios con el comando service.
mini@ubuntu:~$ sudo docker exec -ti ubuntuLAMP /bin/bash
Ya con el prompt indicando que estamos trabajando con el intérprete del contenedor.
root@d8156daf1a55:/# service --status-all [ + ] apache-htcacheclean [ - ] apache2 [ - ] dbus [ ? ] hwclock.sh [ - ] mysql [ - ] procps [ - ] ssh
Iniciamos los servicios,
root@d8156daf1a55:/# service apache2 start * Starting Apache httpd web server apache2 root@d8156daf1a55:/# service mysql start * Starting MySQL database server mysqld root@d8156daf1a55:/# exit
Otro método es usar docker exec para iniciar los servicios a partir de la ejecución de sus scripts de control.
Apache2
mini@ubuntu:~$ docker exec ubuntuLAMP bash -c "/etc/init.d/apache2 start" * Starting Apache httpd web server apache2
MySQL
mini@ubuntu:~$ docker exec ubuntuLAMP bash -c "/etc/init.d/mysql start" * Starting MySQL database server mysqld
SSH
mini@ubuntu:~$ docker exec ubuntuLAMP bash -c "/etc/init.d/ssh start" * Starting OpenBSD Secure Shell server sshd
Listamos los servicios en ejecución en el contenedor.
mini@ubuntu:~$ docker exec ubuntuLAMP service --status-all [ + ] apache-htcacheclean [ + ] apache2 [ - ] dbus [ ? ] hwclock.sh [ + ] mysql [ - ] procps [ + ] ssh
Este método de enviar comandos con docker exec me gusta particularmente por que permite hacer scripts desde sencillos a mas complejos para controlar los servicios del contenedor, usar Systemd, etc, etc. Pero ese será tema de la segunda parte.
/var/www/html
El directorio /var/www/html del contenedor esta montado en el directorio ubuntu/www-data en el Host Docker, esto es así para tener un directorio compartido entre el contenedor y el Host Docker, de esta forma podemos trabajar con nuestros sitios web sin necesidad de abrir un interprete en el contenedor, trabajamos en el directorio www-data.
mini@ubuntu:~$ ls ubuntu/www-data/ index.html info.php
También podemos inspeccionar el contenedor y observar el segmento mounts.
mini@ubuntu:~$ docker inspect ubuntuLAMP ... "Mounts": [ { "Type": "bind", "Source": "/home/mini/ubuntu/www-data", "Destination": "/var/www/html", "Mode": "", "RW": true, "Propagation": "rprivate" } ...
Resumen
Yo particularmente trabajo con espacios virtualizados, aunque la pequeña contra es la cantidad de recursos dados, por ejemplo crear una VPS implica reservar recursos computacionales que probablemente no sean utilizados, de hecho estaría ejecutando lotes de servicios sin razón alguna.
Esta guía surge por la curiosidad de un persona que me consultó sobre unos errores a la hora de levantar un Stack LAMP en un contenedor Ubuntu, así que me puse a dar con la respuesta y ciertamente estoy bastante satisfecho, primero que nada por que los procesos usan recursos de una infraestructura global, solo se ejecutan los servicios necesarios y es fácil de administrar.
0 notes
eseyp · 4 years
Text
ls for humans
la opción -l del comando ls imprime la salida en formato de lista, los campos mostrados son:
Campo 1
Tipo de fichero (primer caracter)
Permisos (siguientes 9 caracteres)
Campo 2
Contador de enlaces físicos
Campo 3 y 4
Usuario (owner)
Grupo
Campo 5
Tamaño de fichero en Bytes
Campo 6
fecha y hora creacion/modificacion
Campo 7
Nombre del ficheros
Por defecto el comando ls -l muestra el tamaño de los ficherons en Bytes, esto es asi ya que en tiempos de Unix los archivos no eran de gran tamaño y medirlos en Bytes era adecuado, hoy teniendo archivos de incluso Gigas de tamaño esta escala resulta problematica para consultas al vuelo.
sergio@athena:~$ ls -l files/ total 243976 -rw-rw-r-- 1 sergio sergio 512 mar 12 18:37 'file 01' -rw-rw-r-- 1 sergio sergio 3145728 mar 12 18:37 'file 02' -rw-rw-r-- 1 sergio sergio 12582912 mar 12 18:37 'file 03' -rw-rw-r-- 1 sergio sergio 233832448 mar 12 18:37 'file 04' -rw-rw-r-- 1 sergio sergio 249856 mar 12 18:38 'file 05' -rw-rw-r-- 1 sergio sergio 5120 mar 12 18:46 'file 06' -rw-rw-r-- 1 sergio sergio 12 mar 12 18:48 'file 07'
La opción -h (como con el comando du) cambia la escala segun el tamaño de lso ficheros.
sergio@athena:~$ ls -lh files/ total 239M -rw-rw-r-- 1 sergio sergio 512 mar 12 18:37 'file 01' -rw-rw-r-- 1 sergio sergio 3,0M mar 12 18:37 'file 02' -rw-rw-r-- 1 sergio sergio 12M mar 12 18:37 'file 03' -rw-rw-r-- 1 sergio sergio 223M mar 12 18:37 'file 04' -rw-rw-r-- 1 sergio sergio 244K mar 12 18:38 'file 05' -rw-rw-r-- 1 sergio sergio 5,0K mar 12 18:46 'file 06' -rw-rw-r-- 1 sergio sergio 12 mar 12 18:48 'file 07'
0 notes
eseyp · 5 years
Text
Bash: if file exist
Chequear la existencia de un archivo
if [[ -f "$FILE" ]]; then echo "$FILE exist" fi
0 notes
eseyp · 5 years
Text
Rsycn
Copia el contenido de del directorio path de forma recursiva manteniendo usuarios, atributos, etc. hacia el directorio de destino path
$ rsync -av ./source/path/ /dest/path
Copia el directorio path dentro del directorio dest de forma recursiva manteniedo usuarios, atributos, etc.
$ rsync -av ./some/path /dest
Exclusiones
--exclude=".*"
1 note · View note