Cuando hablamos dedesarrollo de software es común tener diversos ambientes, por ejemplo:
Y otra cosa común en el mundo del desarrollo es tener divergencias entre estos ambientes.
Quién nunca escuchó la frase:
<!--En mi maquina funciona!-->
En este artículo vamos a abordar Docker como una alternativa para minimizar esta divergencia.
Docker es un sistema de virtualización no convencional. Pero, ¿qué quiere decir esto? en virtualización convencionales tenemos un software instalado en la máquina HOST que gerencia las máquinas virtuales ej.: VirtualBox, VMWare, Parallels y etc...
Para cada máquina virtual tenemos una instalación completa del sistema operacional (S.O) que queremos virtualizar, además de tener el propio hardware virtualizado.
Por ejemplo si yo necesito de una biblioteca común para todas las máquinas virtuales, tengo que instalar en cada una de ellas.
Docker utiliza un abordage diferente, él utiliza el concepto de container. ¿Qué sería container?
Si pensamos en transportes de cargas, el container fue una revolución en esta área. Antes de ellos el tiempo de carga y descarga en un barco era gigantesco y el trabajo se hacía manualmente. Sin contar (debido la quiebra o deterioración), desvio y otros problemas.
Con la llegada de los containers fue posible transportar mercadorías de una forma más segura, de fácil manipulación, con poca o sin necesitar mano de obra en la carga o descarga. Y es justamente eso lo que Docker intenta hacer con nuestros softwares.
Imagine nuestro software como una mercadoria a ser transportada como por ejemplo, del ambiente de Desarrollo para Producción
Para hacer eso necesitamos garantizar que nuestro ambiente de Producción tenga todos los requisitos previos instalados, de preferencia una versión del S.O(sistema operacional) parecida con la del ambiente de Desarrollo entre otros cuidados que deben ser tomados(relacionados con permisos, servícios dependientes, etc...).
Con Docker tenemos un container con nuestro software, este container es llevado entero para el otro ambiente.
De esta manera, no necesitaríamos preocuparnos con requisitos previos instalados en otros ambientes, o sea, versión del S.O(sistema operacional) permisos y si quisiéramos también podríamos tener containers para los servicios dependientes. De esta forma minimizamos mucho la divergencia entre los ambientes.
Esta idea de container es bastante antígua, al principio Docker utilizaba internamente un proyecto llamado LXC (Linux Container).
El proyecto LXC usa en segundo plano diversas funcionalidades presentes en el Kernel de Linux. A continuación, colocaré una lista de algunas de estas funcionalidades:
Ahora que tenemos una noción de lo que es y para que utilizamos Docker, vamos a hacer el download de la herramienta y vamos a empezar en este mundo de los containers.
Actualmente Docker está disponible en dos versiones: Docker Community Edition(CE) y Docker Enterprise Edition(EE).
En ambas versiones tenemos acceso a todas las API, la principal diferencia entre las dos versiones es el perfil deseado de aplicación. En EE tenemos un ambiente homologado por Docker con todas la infraestructura certificada, segura y pensada para el mundo enterprise. En la versión CE podemos llegar al mismo nível que EE pero de una forma manual.
En este link puedes encontrar las distribuiciones para downloads en cada sistema operacional disponible y los pasos para su instalación.
Hecha la instalación, ejecute este comando en el termianal docker --version
. Si la instalación es exitosa deberá aparecer en la pantalla, algo igual a esto Docker version 17.03.1-ce, build c6d412e.
Docker trabaja con el concepto de imágenes, o sea, para colocar un container en funcionamento este necesita tener la imagen en host.
Las imágenes pueden ser bajadas de un repositorio (la nomenclatura para este repositorio es registry) o creadas localmente y compiladas. Este es el link para el registry del Docker.
En este registry podemos tener imágenes oficiales y no oficiales. Además podemos crear nuestras propias imágenes, también es posible hacer upload de ellas en un registry.
Para bajar una imagen podemos usar el comando docker pull
y el nombre de la imagen que queremos bajar. Vamos a bajar la imagen del Ubuntu, para eso ejecute el siguiente comando en el terminal: docker pull ubuntu
.
[caption id="attachment_7091" align="aligncenter" width="750"]
Resultado
docker pull ubuntu[/caption]
Aqui Docker bajó nuestra imagen. Perciban que una imagen es compuesta de varias capas, por este motivo tuve que hacer varios Downloads/Pulls.
Para listar todas las imágenes podemos usar el comando docker imagenes
. El retorno de ese comando es algo semejante a:
El nombre de la imagen es exhibido en la columna REPOSITORY
, cada imagen tiene un identificador único que es exibido en la columna `IMAGEN ID
. La columna TAG
indica la "versión" de la imagen del ubuntu
. El latest
quiere decir que es la última "versión" de la imagen (la más reciente).
A partir de la imagen podemos iniciar cuantos containers queramos através del comando docker run
.
Para accesar a un terminal de Ubuntu podemos utilizar el comandodocker run -i -t ubuntu
o docker run -it ubuntu
. El parametro -i
indica que queremos un container interactivo, el -t
indica que queremos anexar el terminal virtual tty
del container a nuestro host.
Para ver los containers en ejecución podemos utilizar el comando docker ps
(en otro terminal o aba), y él exhibirá un retorno igual a este:
Aquí tenemos informaciones sobre los containers en ejecución, como id, imagen base, comando inicial, hace cuanto tiempo fue creado, status, cuáles puertas estan disponibles y/o mapeadas para el acceso y el nombre del mismo. Cuando no especificamos un nombre al iniciarlo, será generado un nombre aleatoriamente.
Cuando cerramos un container dejará de ser exhibido en la salida del comando docker ps
, pero no significa que el container ya no existe. Para verificar los containers existentes que fueran cerrados podemos utilizar el comando docker ps -a
y tendremos una salida igual a esta:
Como el propio status
del container informa, el mismo ya salió de ejecución y en este caso salió con el status 0
(o sea salió normalmente).
Para remover el container podemos utilizar el comando docker rm
e informar el id del container o su nombre. En nuestro caso podemos ejecutar el comando docker rm 43aac92b4c99
o docker rm dreamy_bassi
para remover el container por completo.
Caso tengamos la necesidad de remover todos los containers (en ejecución o cerrados) podemos usar el comando docker rm $(docker ps -qa)
. La opción -q
del comando docker ps
tiene como salida solamente los ids de los containers, esta lista de ids es pasada para el docker rm
y de esta manera serán removidos todos los containers.
Solo será posible remover un container caso el mismo no esté en ejecución, de lo contrario tenemos que encerrar el container para removerlo.
En este momento podemos pensar que Docker es mágico (y lo es...). A partir de una imagen él puede rodar uno o más containers con poco esfuerzo, ¿ pero cómo son creadas las imágenes?
Una imagen puede ser creada a partir de un archivo de definición llamado de Dockerfile
, en este archivo usamos algunas directivas para declarar lo que tendremos en nuestra imagen. Por ejemplo, se miramos la definición de imagen del Ubuntu podemos ver algo igual a esto:
FROM scratch ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz / . . . RUN mkdir -p /run/systemd && echo 'docker' > /run/systemd/container
CMD \["/bin/bash"\]
Para ver el Dockerfile completo consulte aquí.
Con un archivo Dockerfile
podemos compilar el comando docker build
. Al compilar el archivo Dockerfile
creamos una imagen, pero eso es un tema para el proximo artículo.
Conozca nuestro curso de docker en Alura Latam.
Fernando Furtado
Fernando es desarrollador con enfasis en Java, mientras, ya hice proyectos para mobiles (iOS), donde actuó con lenguajes, como: Objective-C y Swift. En su trabajo, siempre consulta buenas practicas como pruebas o design de codigo (Design Pattern y SOLID, entre otros).
Este artículo fue adecuado para Alura Latam por: Ingrid Cristina Pereira da Silva
Cursos de Programación, Front End, Data Science, Innovación y Gestión.
Luri es nuestra inteligencia artificial que resuelve dudas, da ejemplos prácticos y ayuda a profundizar aún más durante las clases. Puedes conversar con Luri hasta 100 mensajes por semana
Paga en moneda local en los siguientes países
Cursos de Programación, Front End, Data Science, Innovación y Gestión.
Luri es nuestra inteligencia artificial que resuelve dudas, da ejemplos prácticos y ayuda a profundizar aún más durante las clases. Puedes conversar con Luri hasta 100 mensajes por semana
Paga en moneda local en los siguientes países
Cursos de Programación, Front End, Data Science, Innovación y Gestión.
Luri es nuestra inteligencia artificial que resuelve dudas, da ejemplos prácticos y ayuda a profundizar aún más durante las clases. Puedes conversar con Luri hasta 100 mensajes por semana
Puedes realizar el pago de tus planes en moneda local en los siguientes países:
País | |||||||
---|---|---|---|---|---|---|---|
Plan Semestral |
487.37
BOB |
68358.72
CLP |
308854.24
COP |
65.90
USD |
260.86
PEN |
1428.58
MXN |
3016.99
UYU |
Plan Anual |
738.82
BOB |
103627.26
CLP |
468202.41
COP |
99.90
USD |
395.45
PEN |
2165.64
MXN |
4573.56
UYU |
Plan Anual + Boost |
Acceso a todos
los cursos
Estudia las 24 horas,
dónde y cuándo quieras
Nuevos cursos
cada semana