223 lines
9.4 KiB
TeX
223 lines
9.4 KiB
TeX
\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
|
|
|
|
\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}
|