Práctica con el comando run de Docker

En esta demostración, veremos algunas de las opciones avanzadas del comando “run” que vimos en el artículo Opciones del comando run de Docker.

En primer lugar ejecutamos “docker run ubuntu cat /etc/*release*” para ver la versión de ubuntu ejecutándose. Si se quiere ejecutar otra versión de este sistema operativo en particular hay que ir al sitio https://hub.docker.com/, entrar en el repositorio que se está usando (ubuntu) y ver la lista de etiquetas compatibles. Si no especifica ninguna etiqueta se asumirá que es la última etiqueta. Es por eso que se descargó la última imagen. Si desea ejecutar otra versión hay que agregar la etiqueta al nombre de la imagen: docker run ubuntu:17.10 cat /etc/*release. La etiqueta puede ser cualquiera de las listadas para la misma versión (“17.10”, “artful-20170728”, “artful” o “devel”). De esta manera, se pueden etiquetar las imágenes de manera diferente para diferentes propósitos, ya sea para versionar, etc.

Lo siguiente es ver los modos de conexión y desconexión. Vamos a ejecutar un contenedor ubuntu y mantenerlo vivo por 15 segundos usando el comando sleep. Por lo tanto, ejecutará el comando de suspensión durante 15 segundos y va a salir del contenedor. Si se ejecuta, no se ve ninguna respuesta y aunque se haga Ctrl+C no sale de la ejecución. Así que estamos atascados hasta que el sistema operativo o el contenedor salgan automáticamente cuando pasen los 15 segundos. Si tuviera que ejecutar una aplicación real en lugar del comando de prueba sleep, no se podría salir. La consola solo mostraría la salida de esa aplicación que esta ejecutándose. Esta es la forma predeterminada en que se ejecuta un contenedor. Tampoco importa, ya que se puede usar otro terminal para acceder al host docker y ejecutar una parada haciendo “docker stop <ID>” y luego volver al terminal original. 

Segundo plano

Pero la próxima vez que se ejecute el contenedor, se puede ejecutar en segundo plano o en un modo separado, especificando el parámetro -d: “docker run -d ubuntu sleep 1500”.  Al ejecutarlo mostrará el ID (largo) del contenedor, el mismo que aparece cuando se ejecuta el comando “docker ps” pero solo los primeros caracteres. Si se quiere llevar el proceso ejecutado en segundo plano de nuevo a primer plano, se ejecuta el comando “docker attach <ID>”, pero volveremos  a la misma situación de que nada funciona realmente.

Para esta práctica con el comando run de Docker vamos a ver otro ejemplo con una imagen llamada “timer” que simplemente imprime la hora actual en la pantalla cada segundo: “docker run timer”. Esto funciona infinitamente, el contenedor nunca se detiene ya que se ejecuta en primer plano. Si se ejecuta en segundo plano con el parámetro -d se puede ver con el comando “ps” que se está ejecutando pero no se puede ver el resultado. Si se ejecuta el comando “docker attach”  con el ID del contenedor, se podrá ver de nuevo la salida que genera.

Práctica con el comando run de Docker para ejecutar Jenkins

Practica con el comando run de Docker y JenkinsExploremos algunas imágenes adicionales de Docker en hub.docker.com. Algo que me interesa es Jenkins, un sistema de compilación que no conozco y me gustaría probar. Jenkins es un servidor de entrega e integración continua. Supongamos que he trabajado antes y solo quiero jugar con él para tener experiencia práctica. Entonces, en lugar de seguir las instrucciones de instalación e instalar muchas dependencias en mi ordenador, lo que me gustaría hacer es simplemente ejecutar Jenkins como un contenedor y jugar con él. EN el repositorio se pueden ver instrucciones sobre cómo ejecutar jenkins. El nombre es solo “jenkins”, lo que ayuda a comenzar simplemente ejecutando un contenedor con “jenkins”: “docker run jenkins”. Con esto se deberían extraer las imágenes y capas de jenkins y ejecutar una instancia de jenkins.

Ejecución

Jenkins es un servidor web. Lo que esperamos es que una vez que implementemos este contenedor en particular, esperamos ir a un sitio web con un navegador y acceder a la interfaz de usuario web. Ahora, ¿cómo puedo acceder? si voy a la interfaz de usuario de mi host y muestro el host donde se ejecuta Docker haciendo “docker ps” se puede ver que se está ejecutando jenkins y está en el puerto 8080 y 50000. Como Jenkins tiene un interfaz de usuario web, se puede ir a la IP interna y el puerto.

También se puede asignar un puerto a mi host acoplable y acceder usando la IP externa. Para acceder utilizando la IP interna debe estar dentro del host docker. Para saber cual es usar el comando “docker inspect <ID>”. Entre toda la información mostrada, abajo, en la sección de “Networks”, verá el apartado “bridge” y la dirección IP.  Así que pongo esa dirección y el puerto 8080 para ir a la página de jenkins. Una vez ejecutándose Jenkins en el navegador, solo hay que seguir las instrucciones. Se puede observar que después de ejecutar el comando “docker run” hay un usuario administrador creado y una contraseña generada automáticamente, por lo que usaría esta contraseña para desbloquear e iniciar configuraciones en los jenkins.

Cómo acceder externamente

Si abro una página web y voy a la IP de mi host docker que es 192.168.1.14 y si intento acceder al servidor jenkins usando esa dirección IP, no podré acceder . Esto se debe a que ese puerto o servicio en particular no está escuchando en el host del acoplador. Para hacer eso, se debe agregar un mapeo de puertos. Pero no se puede agregar una asignación de puertos mientras el servicio se está ejecutando. Por esto, debe detenerse y ejecutar el mismo comando de ejecución de Docker, pero mapeando desde el puerto 8080 hasta el puerto en el host docker: “docker run -p 8080:8080 jenkins” Ahora debería poder ver la página de jenkins. 

De esta forma no es necesario saber cómo instalar dependencias o seguir muchas instrucciones o instalar binarios, etc. Para comenzar con jenkins o cualquier aplicación como esa es tan fácil como ejecutar el contenedor docker para esa aplicación en particular.

Asignación de volúmenes

Hemos realizado la asignación de puertos, pero también podemos asignar un volumen. Esto es para que jenkins almacene los datos en un directorio en el host. De manera predeterminada, jenkins almacenará los datos en nuestra página de inicio de jenkins dentro del contenedor de jenkins. Si desea guardar esa información, debe asignar un volumen. 

Para demostrar esto, instalar los complementos sugeridos de jenkins y hacer algunos cambios de configuración en mi Jenkins como puede ser un cambio de configuración y una contraseña, etc. Aunque instalar complementos también son cambios de configuración. Por lo tanto, quiero ver que los cambios que se realizan, si se detiene el contenedor y se reinicia o elimina y, de nuevo, ejecuta otra instancia de jenkins y aún se podrá ver los cambios realizados. Para conservar esos datos en los contenedoresse tiene que mapear el volumen. Para ello voy a crear un directorio local llamado my-jenkins-data. Lo que haré es, cuando ejecute el contenedor Docker la próxima vez, asignar ese volumen a la ubicación donde el contenedor docker de jenkins almacena sus datos de manera predeterminada que está en la home de jenkins: “docker run -p 8080:8080 -v /root/my-jenkins-data:/var/jenkins_home jenkins”

Es posible que exista un problema de permisos, por lo que es necesario especificar en la ejecución otro usuario con la opción -u:  “docker run -p 8080:8080 -v /root/my-jenkins-data:/var/jenkins_home -u root jenkins”.

Esto es todo en esta práctica con el comando run de Docker.