\documentclass[12pt,a4paper]{article} \usepackage[spanish]{babel} \usepackage[ddmmyyyy]{datetime} \usepackage{hyperref} \usepackage{graphicx} \title{Ejercicio IV: Docker} \author{Nicolás A. Ortega Froysa} \begin{document} \maketitle \pagebreak \tableofcontents \pagebreak \section{Hoja De Control Del Documento} \begin{table}[h!] \begin{center} \caption{Documento/Archivo} \label{tab:document} \begin{tabular}{|l|c|l|c|} \hline {\bf Fecha Última Modificación} & \today & {\bf Versión/Revisión} & v01r04 \\ \hline {\bf Fecha Creación} & 10/11/2021 & \hfill & \hfill \\ \hline {\bf Fecha Finalización} & \today & \hfill & \hfill \\ \hline \end{tabular} \end{center} \end{table} \begin{table}[h!] \begin{center} \caption{Registro De Cambios} \label{tab:registro-cambios} \begin{tabular}{|c|c|c|} \hline {\bf Versión/Revisión} & {\bf Página(s)} & {\bf Descripción} \\ \hline v01r01 & Todas & Creación y elaboración del documento. \\ \hline v01r02 & 3-4 & Detallado de instalación y primer docker. \\ \hline v01r03 & 4-5 & Finalizar sección de «Primer Docker». \\ \hline v01r04 & 5-7 & Añadir secciones Apache y Conclusión \\ \hline \end{tabular} \end{center} \end{table} \begin{table}[h!] \begin{center} \caption{Autores Del Documento} \label{tab:autores} \begin{tabular}{|c|c|} \hline {\bf Apellidos, Nombre} & {\bf Curso} \\ \hline Ortega Froysa, Nicolás Andrés & 1 \\ \hline \end{tabular} \end{center} \end{table} \begin{table}[h!] \begin{center} \begin{tabular}{|p{4cm}|p{4cm}|p{4cm}|} \hline {\bf Preparado} & {\bf Revisado} & {\bf Aprobado} \\ \hline Ortega Froysa, Nicolás Andrés & \hfill & \hfill \\ \hline \end{tabular} \end{center} \end{table} \pagebreak \section{Instalación de Docker} Para poder instalar Docker podemos instalarlo en una máquina de arquitectura x86--64, ARM, s390x, y ppc64le, y de sistema operativo Linux, Windows, o macOS. Para esta práctica se usará una distribución de Linux denominada ArchLinux en la arquitectura ARM (aunque realmente los comandos serán los mismos en cualquier sistema de ArchLinux). ArchLinux se puede instalar siguiendo las instrucciones de la guía de instalación de ArchLinux en su Wiki.\footnotemark \footnotetext{\url{https://wiki.archlinux.org/title/Installation\_guide}} Cuando ya se tiene ArchLinux instalado, podemos instalar Docker fácilmente desde la línea de comando con el comando \texttt{pacman -S docker}. Esto instalará el programa de docker y todas sus dependencias, mas siendo ArchLinux no se inicializa automáticamente el servicio de Docker, así que es necesario iniciarlo manualmente. Suponiendo que estamos en un sistema que use systemd, podemos hacer esto mediante el comendo \texttt{systemctl start docker}. Si queremos que se inicialice al iniciar el sistema operativo, podemos ejecutar adicionalmente el comando \texttt{systemctl enable docker}. \section{Primer Contenedor: Hello World} Al tenerlo corriendo de fondo ya podemos empezar a tratar con él. Esto se hace por medio del comando \texttt{docker}. Para usarlo es necesario ejecutar como superusuario, que se puede hacer o cambiando al usuario \texttt{root}, o añadiendo \texttt{sudo} antes de todos los comandos. También existe la opción de añadir el usuario a un grupo especial, \texttt{docker}. Esto se puede hacer por medio del comando \texttt{usermod -aG docker }, donde \texttt{} es el nombre del usuario actual que queremos añadir al grupo. Este comando también se tiene que ejecutar como superusuario (y por lo tanto debe de ser \texttt{root} o usar \texttt{sudo}). Si ejecutamos el comando \texttt{docker image ls} podemos ver qué imágenes tenemos disponibles localmente en la máquina, que recién instalado no debería de haber ninguna. También podemos usar \texttt{docker ps -a} para ver qué contenedores tenemos corriendo. Esto nos servirá luego para gestionar los contenedores y las imágenes locales. \begin{figure}[h] \centering \includegraphics[width=0.75\linewidth]{imgs/04-hello-world-docker.png} \caption{Ejecución del container \texttt{hello-world}.} \label{fig:hello-world-docker} \end{figure} Ahora, para descargar e inicializar un contenedor lo hacemos directamente pidiendo que Docker corra la imagen que nos interesa. Para empezar usaremos la imagen \texttt{hello-world}. Para hacer esto ejecutamos el comando \texttt{docker run hello-world} y nos debe de salir un mensaje indicando que se ha ejecutado correctamente (figura \ref{fig:hello-world-docker}). \begin{figure} \centering \includegraphics[width=0.75\linewidth]{imgs/05-list-hello-docker.png} \caption{Lista de contenedores e imágenes.} \label{fig:list-hello-docker} \end{figure} Ahora, si volvemos a ejecutar el comando \texttt{docker ps -a}, nos mostrará que existe un nuevo contenedor en ejecución. Además, al ejecutar \texttt{docker image ls} nos muestra que se ha descargado además la imagen \texttt{hello-world}. Si miramos de nuevo la lista de contenedores corriendo, notaremos que tiene un atributo del {\em nombre} (\texttt{NAMES}). Aquí aparecerá el nombre que tiene el contenedor que podemos usar para referirnos a él, además del \texttt{CONTAINER ID}. El nombre del contenedor viene generado por una palabra y un apellido aleatorio, en nuestro caso \texttt{focused\_perlman} (figura \ref{fig:list-hello-docker}). Éstos luego los podemos usar para manejar los contenedores. E.g. podemos borrar un contenedor con el comando \texttt{docker rm } ó \texttt{docker rm }. Este nombre lo podemos asignar en la creación del contenedor (el subcomando \texttt{run}) añadiendo la opción \texttt{--name=}. En cuanto a la ID del contenedor, no es necesario especificar la ID entera (que puede ser larga y fácil de confundir) sino simplemente con poner los primeros caracteres de la cadena que sean únicas basta. \section{Contenedor de Servidor Apache} Los contenedores se suelen usar no para correr aplicaciones simples que te dan un resultado, como una calculadora, sino para proveer servicios en entornos controlados. Esto es muy útil para los servidores, que tienen que proveer servicios de una forma estable. Para poner a prueba esto, veremos cómo instalar un servicio de Apache (servidor web) en un contenedor. Para el ejercicio se ha propuesto el uso de la imagen \texttt{bitnami/apache}, mas este imagen no está disponible para la arquitectura de mi ordenador (ARMv7), así que tuve que buscar una alternativa, y encontré la imagen oficial de Apache: \texttt{httpd}.\footnotemark \footnotetext{\url{https://hub.docker.com/\_/httpd}} Así que para crear este contenedor usamos el comando de antes: \texttt{docker run -d -p 8888:80 httpd}. Veamos lo que hace cada elemento de este comando: \begin{itemize} \item \texttt{run}: como vimos antes, corre el contenedor, descargando y creándolo si no se ha creado ya. \item \texttt{-d}: un {\em detach} que permite correr el contenedor de fondo mientras la línea de comando queda libre para correr otros comandos. \item \texttt{-p 8888:80}: publicar el puerto 80 del contenedor al puerto 8888 del anfitrión. También se puede usar \texttt{-P} que asignará un puerto aleatorio. \item \texttt{httpd}: el nombre de la imagen que queremos usar en nuestro contenedor. \end{itemize} \begin{figure}[h] \centering \includegraphics[width=0.75\linewidth]{imgs/10-it-works.png} \caption{Acceso al servicio apache del contenedor.} \label{fig:it-works} \end{figure} Esto nos creará el nuevo contenedor y lo pondrá en funcionamiento. Si hemos usado la opción \texttt{-p 8888:80} entonces deberíamos poder acceder al servidor por medio de nuestro navegador haciendo una petición a \texttt{localhost:8888}. Si por el otro lado hemos usado \texttt{-P} nos dirá el puerto y reemplazamos el \texttt{8888} de la dirección anterior por el número real del puerto (figura \ref{fig:it-works}). \begin{figure}[h] \centering \includegraphics[width=0.75\linewidth]{imgs/12-view-new-index.png} \caption{Nueva página en el contenedor.} \label{fig:view-new-index} \end{figure} Aunque ahora hemos podido crear un servicio de web con nuestro contenedor, la pregunta sería cómo cambiar el contenido. Lo más fácil sería simplemente cambiar el archivo que hay dentro del contenedor en sí. Esto lo hacemos escribiendo nuestro propio archivo HTML, y después copiándolo a la dirección local dentro del contenedor. Esto se hace por medio del comando \texttt{docker cp index.html :/usr/local/apache2/htdocs/}. Si ahora volvemos a hacer una nueva petición a la página, y nos sale la nueva página que hemos creado (figura \ref{fig:view-new-index}). \section{Conclusión} Realmente hay más capacidades que tiene el Docker, especialmente para facilitar el copiar archivos del sistema anfitrión al sistema huésped. Aún así, se puede ver que tiene gran potencial. Los docker permiten crear servicios dentro de un entorno controlado, lo cual asegura más estabilidad -- algo vital para cualquier tipo de sistema en producción. También parece ser una herramienta con mucha potencial en cuanto a programación para dispositivos empotrados o lo también lo que se denomina {\em cross-compilation}, gracias a tener un entorno limpio y sin binarios innecesarios. \pagebreak \section{Derechos de Autor y Licencia} Copyright \copyright\ \the\year\ Nicolás A. Ortega Froysa \\ Este documento se distribuye bajo los términos y condiciones de la licencia Creative Commons Attribution No Derivatives 4.0 International. \end{document}