\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 <usuario>}, donde \texttt{<usuario>} 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 <name>} ó \texttt{docker rm <id>}. Este nombre
lo podemos asignar en la creación del contenedor (el subcomando \texttt{run})
añadiendo la opción \texttt{--name=<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
<name>:/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 <nicolas@ortegas.org>
\\
Este documento se distribuye bajo los términos y condiciones de la licencia
Creative Commons Attribution No Derivatives 4.0 International.

\end{document}
