Primeros pasos con Docker: Instalación:
Para dar los primeros pasos en Docker hay que que tener en cuenta que existen dos ediciones. Community Edition es la edición gratuita, mientras que Enterprise Edition es una plataforma de contenedores certificada y compatible que trae complementos empresariales. Veremos cómo instalar y comenzar a usar Docker en un sistema Linux:
La instalación se va a realizar en Ubuntu. El primer paso es ir a docs.docker.com y hacer clic en obtener Download & Install. Seleccionar el sistema Linux y la versión correspondiente. El sistema Ubuntu debe ser de 64 bits y una de las versiones compatibles listadas en la web de instalación de Docker. Desinstalar la versión anterior si existe:
sudo apt-get remove docker docker-engine docker.io containerd runc
Se puede instalar usando el administrador de paquetes actualizando primero el repositorio, instalando los paquetes de requisitos previos, luego agregando las claves gpg oficiales de Dockers y luego instalando Docker. Pero existe un script que automatiza todo el proceso de instalación y funciona en la mayoría de los sistemas operativos. Ejecutar el comando para descargar una copia del script y luego el comando para ejecutar el script que instala Docker automáticamente:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
Una vez instalado, se puede ejecutar un contenedor simple para asegurarnos de que todo funcione como se esperaba. Hay que ir a Docker Hub en hub.docker.com. Hay una lista de imágenes Docker más populares, como en Nginx, Mongo DB, Alpine, Node JS, Redis, etc. Vamos a buscar una imagen divertida llamada Whalesay que es una aplicación simple que muestra a la ballena Docker diciendo algo. Copiar el comando de ejecución de la aplicación añadiendo sudo y cambiar el mensaje. Ejecutar el comando Docker
sudo docker run docker/whalesay cowsay Hola!
Más información en: https://docs.docker.com/install/linux/docker-ce/ubuntu/
Primeros pasos con Docker: Comandos básicos
docker run : se usa para ejecutar un contenedor desde una imagen. Si ejecuta el comando “docker run nginx” ejecutará una instancia de la aplicación nginx en el host docker si ya existe. Si la imagen no está presente en el host, la descarga de Docker Hub, pero esto solo se hace la primera vez. Pero si se ejecuta una imagen con servidor web u otra aplicación, se ejecuta en primer plano, lo que significa que estará conectado a la consola y verá la salida del servicio web en su pantalla. No podrá hacer nada más en esta consola. Puede ejecutar el contenedor en segundo plano con la opción -d “docker run -d kodekloud/simple-webapp”.
docker ps: enumera todos los contenedores en ejecución y alguna información básica sobre ellos, como el ID del contenedor, el nombre de la imagen que utilizamos para ejecutar los contenedores, el estado actual y el nombre del contenedor. Cada contenedor obtiene automáticamente una identificación aleatoria y el nombre creado para ello por Docker, que en este caso es “silly_sammet”. Para ver todos los contenedores aunque no estén ejecutandose, usar la opción -a (docker ps -a). Esto lista todos los contenedores en ejecución, los parados y los finalizados.
docker stop : para un contenedor, proporcionando ID o el nombre del contenedor. Si no se conoce el nombre, ejecutar el comando “docker ps” para obtenerlo. Una vez ejecutada la parada de “silly_sammet” se ejecuta “docker ps” para ver que no hay contenedores en ejecución. Sin embargo “docker ps -a” muestra el contenedor “silly_sammet” como terminado ¿y si no queremos que este contenedor esté ahí consumiendo espacio?. ¿Qué pasa si queremos deshacernos de él?
docker rm : elimina el contenedor permanentemente. Si se ejecuta “docker rm silly_sammet” y se lista de nuevo con el comando “docker ps -a” se ve que ya no está. Pero, ¿qué pasa con la imagen nginx que se descargó al principio? Ya no se está usando. ¿cómo nos deshacemos de esa imagen? Pero antes, veamos cómo listar las imágenes presentes en nuestro host
docker images: muestra una lista de imágenes disponibles y sus tamaños. Si lo ejecutamos, vemos que tenemos cuatro imagenes: nginx, redis, ubuntu y alpine.
docker rmi : elimina una imagen. Nos debemos asegurar que ningún contenedor se esté quedando sin esa imagen antes de intentar eliminar la imagen. Se debe detener y eliminar todos los contenedores dependientes para poder eliminar una imagen. Cuando ejecutamos el comando “docker run” al principio, se descargó la imagen de Ubuntu ya que no podía encontrar una localmente. ¿Qué pasa si simplemente queremos descargar la imagen y guardarla para que cuando ejecutemos el comando “docker run” no tengamos que esperar a que se descargue?
docker pull : extrae solo esa imagen y no ejecuta el contenedor. La orden “docker pull nginx” extrae un montón de comandos, extrae la imagen de Ubuntu y lo coloca en nuestro host.
docker exec: ejecuta un comando. ¿Qué pasaría si quisiéramos ejecutar un comando en un contenedor en ejecución? por ejemplo, cuando ejecuto el comando “docker ps” puedo ver que hay un contenedor en ejecución que usa la imagen de ubuntu y duerme durante 100 segundos, digamos que me gustaría ver el contenido de un archivo dentro de este contenedor particular. Podría usar el comando “docker exec” para ejecutar un comando en mi contenedor docker como imprimir el contenido del archivo /etc/hosts “docker exec distracted_mcclintock cat /etc/hosts”
Primeros pasos con Docker: Vida de un contenedor
Supongamos que quiere ejecutar un contenedor Docker desde una imagen de Ubuntu, cuando ejecuta el comando “docker run ubuntu”, se ejecuta una instancia de la imagen de ubuntu y termina inmediatamente. Si se listan los contenedores en ejecución, no vería el contenedor en ejecución. Si lista todos los contenedores, incluidos los que están detenidos, verá que el nuevo contenedor que ejecutó está en una etapa finalizada. Esta es la diferencia con las máquinas virtuales. Los contenedores no están destinados a alojar un sistema operativo. Los contenedores están destinados a ejecutar una tarea o proceso específico, cómo alojar una instancia de un servidor web o servidor de aplicaciones o una base de datos, o simplemente llevar a cabo algún tipo de tarea de cálculo o análisis.
Una vez que se completa la tarea, el contenedor termina. Un contenedor solo vive mientras el proceso dentro de él esté vivo. Si el servicio web dentro del contenedor se detiene o se bloquea, el contenedor se cierra. Es por eso que cuando se ejecuta un contenedor desde una imagen de ubuntu, se detiene inmediatamente porque Ubuntu es solo una imagen de un sistema operativo que se utiliza como imagen base para otras aplicaciones. No hay ningún proceso o aplicación ejecutándose en él por defecto.
Si la imagen no ejecuta ningún servicio, como es el caso de Ubuntu, puede indicarle a Docker que ejecute un proceso con el comando de ejecución de docker, por ejemplo, un comando de suspensión con una duración de cinco segundos: “docker run ubuntu sleep 5”. Cuando el contenedor se inicia, se ejecuta en el comando de suspensión y se queda en suspensión durante cinco segundos. El comando de suspensión termina y el contenedor se detiene. Lo que acabamos de ver es que estaba ejecutando un comando cuando ejecutamos el contenedor.
En la siguiente entrada Docker: Práctica básica puede ver los comandos descritos y conocer más sobre como utilizarlos.
Variables de entorno
Aunque no es un tema a cubrir en los primeros pasos con Docker, es posible que en su uso sea necesario conocer como utilizar las variables de entorno. Si queremos tener una aplicación que tenga información fuera del código, en un entorno, podemos hacerlo. Las variables de entorno pueden ser recogidas por las aplicaciones para modificar su funcionamiento. Por ejemplo, en Python se utiliza la función os.environ.get(‘VARIABLE’).
Si ejecutamos una imagen que contenga una aplicación que usa variables de entorno, podemos dar valores con el comando -e: «docker run -e VARIABLE=valor »
De esta forma la aplicación puede tener diferentes comportamientos cada vez que se crea el contenedor. Si el contenedor se está ejecutando, se puede ver el valor de la variable de entorno con el comando «docker inspect «
Almacén de imágenes
Cuando se ejecuta un comando como «docker pull <imagen>» Docker descarga una imagen desde un repositorio. En realidad, la especificación del nombre de la imagen completa sería «host:port/userAccount/imagen». Si no se especifica el host, por defecto se acude a docker.io y, de igual forma, si no se especifica cuenta de usuario, por defecto la cuenta de usuario es la misma que la imagen. Así, al ejecutar «docker pull ubuntu», realmente se acude a «docker pull docker.io/ubuntu/ubuntu:latest». Existen otros repositorios públicos como gcr.io (Goolge). Pero también existen repositorios privados para los que es necesario logarse. En este caso es necesario ejecutar la orden «docker login <host>» y escribir el usuario y la contraseña antes de poder trabajar con imagenes de repositorios privados.