search
top

¿Qué es Docker? ¿Para qué se utiliza? Explicado de forma sencilla

Aviso: Este post no está pensado para usuarios avanzados de Docker, simplemente es una introducción para entender de forma muy sencilla ciertos conceptos sobre él. Ni siquiera voy a meterme en aspectos técnicos tales como: cómo se usa, cómo montar un contenedor de Docker, ejecutarlo, etc.

Ese no es el objetivo de este post, ya que a nivel de programación hay muchos tutoriales paso a paso sobre cómo utilizar Docker, incluso un tutorial interactivo hecho por sus propios creadores. 

Es muy probable que últimamente de una u otra forma hayas escuchado hablar de Docker en algún contexto: en una conferencia, a un desarrollador de tu empresa, a alguien de sistemas, cuando se habla de entornos, despliegues…

Y es que esta tecnología está bastante relacionada con el área de sistemas, con los entornos en los que se ejecutan las aplicaciones software.

Por ello, puede que al hablar de ella se utilicen palabras muy específicas, al igual que cuando se menciona Puppet (Simplifica drásticamente la administración de sistemas: Puppet en 10 min.), Chef, etc. que gente no familiarizada con estos temas no entiende.

Hoy mi objetivo con este post es que de forma clara, entiendas qué es Docker, por qué su uso se ha extendido tanto en estos años y qué beneficios aporta.

Con estas bases podrás investigar un poco más sobre Docker en la documentación oficial, foros, etc., y utilizar la herramienta de alguna manera, adaptándola a tus necesidades.

¿Qué es Docker?

La idea detrás de Docker es crear contenedores ligeros y portables para las aplicaciones software que puedan ejecutarse en cualquier máquina con Docker instalado, independientemente del sistema operativo que la máquina tenga por debajo, facilitando así también los despliegues.

¡Ala! Definición traducida de la documentación oficial, demasiada información en pocas frases, no me entero de nada. Bien, empecemos por lo primero ¿qué es un contenedor?

Este concepto ya es antiguo, y viene de Linux, pero por hacerte un símil con el mundo real, imagina en tu cabeza un contenedor de esos que suelen llevar los barcos de mercancías, que contiene distintos productos.

docker1

Es algo auto contenido en sí, que se puede llevar de un lado a otro de forma independiente, es portable.

Ahora, volviendo al software, para que podamos acceder como usuarios normales a una aplicación, dicha aplicación software necesita estar ejecutándose en una máquina, en un ordenador. Pero además, dependiendo del tipo de aplicación, dicho ordenador también necesita tener instaladas una serie de cosas para que la aplicación se ejecute correctamente: cierta versión de Java instalado, un servidor de aplicaciones (p.e tomcat, que es el software que realmente estará ejecutando mi aplicación y haciendo que pueda interactuar con ella).

Docker, me permite meter en un contenedor (“una caja”, algo auto contenido, cerrado) todas aquellas cosas que mi aplicación necesita para ser ejecutada (java, Maven, tomcat…) y la propia aplicación. Así yo me puedo llevar ese contenedor a cualquier máquina que tenga instalado Docker y ejecutar la aplicación sin tener que hacer nada más, ni preocuparme de qué versiones de software tiene instalada esa máquina, de si tiene los elementos necesarios para que funcione mi aplicación , de si son compatibles…

Yo ejecutaré mi aplicación software desde el contenedor de Docker, y dentro de él estarán todas las librerías y cosas que necesita dicha aplicación para funcionar correctamente.

En la fecha en la que se ha escrito el post, tienes que tener en cuenta que Docker utiliza ciertos aspectos de Linux, por lo que los contenedores de Docker no funcionan de forma nativa en Windows o OX. Solo funcionan en máquinas Linux, así que si necesitas ejecutar el contenedor sobre una máquina con otro sistema operativo distinto a Linux, deberás instalar una máquina virtual Linux. 

¿Qué beneficios tiene esto?

Docker es una herramienta diseñada para beneficiar tanto a desarrolladores, testers, como administradores de sistemas, en relación a las máquinas, a los entornos en sí donde se ejecutan las aplicaciones software, los procesos de despliegue, etc.

En el caso de los desarrolladores, el uso de Docker hace que puedan centrarse en desarrollar su código sin preocuparse de si dicho código funcionará en la máquina en la que se ejecutará.

Por ejemplo, sin utilizar Docker un posible escenario podría ser el siguiente (hay otras formas de solucionar este escenario, pero por poner un ejemplo claro):

– Pepe tiene en su ordenador instalado Java 8, y está programando una funcionalidad específica de la aplicación con algo que solo está disponible en esa versión de Java.

– José tiene instalado en su máquina Java 7, porque está en otro proyecto trabajando sobre otro código, pero Pepe quiere que José ejecute el código de su aplicación en su máquina. O José se instala Java 8, o la aplicación en su máquina fallará.

Este escenario desaparece con Docker. Para ejecutar la aplicación, Pepe se crea un contenedor de Docker con la aplicación, la versión 8 de Java y el resto de recursos necesarios, y se lo pasa a José.

José, teniendo Docker instalado en su ordenador, puede ejecutar la aplicación a través del contenedor, sin tener que instalar nada más.

Por eso Docker también es muy bueno para el testing, para tener entornos de pruebas. Por un lado, es muy sencillo crear y borrar un contenedor, además de que son muy ligeros, por lo que podemos ejecutar varios contenedores en una misma máquina (donde dicho contenedor tendría el entorno de nuestra aplicación: base de datos, servidor, librerías…). Por otro, un mismo contenedor funcionará en cualquier máquina Linux: un portátil, el ordenador de tu casa, máquinas alojadas en Amazon, tu propio servidor…

Esto además beneficia a la parte de sistemas, ya como los contenedores son más ligeros que las máquinas virtuales, se reduce el número de máquinas necesarias para tener un entorno.

Y lo que es mejor, Docker es open source.

Pero Docker también tiene otras ventajas. En el post de la semana que viene hablaré un poco más de cuáles son los principales elementos de Docker, y veremos otros beneficios que aporta la herramienta. 

¿Y qué diferencia a Docker respecto a una máquina virtual?

Puede que cuando he hablado de que en un mismo ordenador podemos tener varios contenedores Docker te hayas preguntado: ¿y esto no es lo mismo que una máquina virtual?

Realmente el concepto es algo similar, pero un contenedor no es lo mismo que una máquina virtual. Un contenedor es más ligero, ya que mientras que a una máquina virtual necesitas instalarle un sistema operativo para funcionar, un contenedor de Docker funciona utilizando el sistema operativo que tiene la máquina en la que se ejecuta el contenedor.

Digamos que el contenedor de Docker toma los recursos más básicos, que no cambian de un ordenador a otro del sistema operativo de la máquina en la que se ejecuta. Y los aspectos más específicos del sistema que pueden dar más problemas a la hora de llevar el software de un lado a otro, se meten en el interior del contenedor.

Para que te hagas una idea, el concepto de portabilidad de un contenedor de Docker es algo similar a la máquina virtual de Java.

Que un contenedor Docker tome los aspectos básicos de funcionamiento del sistema operativo de la máquina en la que se ejecuta lo vuelve más ligero que una máquina virtual.

La semana que viene…

Si quieres entender un poquito más de Docker, la semana que viene hablaré de los principales elementos que engloba: imágenes, contenedores, links…qué es cada cosa y para qué sirven, ya que dichos elementos nos proporcionan ciertos beneficios. Por último, veremos qué diferencia en cada caso a Docker con respecto a Puppet, Vagrant, Ansible o tecnologías de este tipo, y próximos pasos para profundizar en el uso de Docker.

Ana M. del Carmen García Oterino

Ana M. del Carmen García Oterino

Ingeniera Software QA at BQ
https://www.linkedin.com/in/amgarciao

Apasionada por la calidad del software (procesos, producto y equipos) y buenas prácticas en general.

Especializada en testing, automatización de pruebas e integración continua.
Ana M. del Carmen García Oterino

38 Respuestas to “¿Qué es Docker? ¿Para qué se utiliza? Explicado de forma sencilla”

  1. Antonio Tejero dice:

    Estamos empezando a utilizar esta tecnología y he de decir 2 cosas:
    – Abre un mundo de posibilidades.
    – Mucho cuidado con usarla en producción.

  2. Víctor dice:

    Creo que es muy parecido a Vagrant. Además el concepto de contenedores es igual o muy similar al de los “boxes”. ¿Es así?

    Saludos

    • Ana M. del Carmen García Oterino dice:

      Creo que son cosas diferentes, el concepto de Docker viene de los contenedores de Linux LXC (https://en.wikipedia.org/wiki/LXC):

      – Vagrant se ejecuta sobre VirtualBox, VMware, etc, se utiliza para gestionar máquinas virtuales. Y como aprovisionamiento (indicar qué quieres que tenga dicha máquina virtual) puedes utilizar Puppet, Chef, incluso un contenedor de Docker.

      – Docker no se ejecuta sobre una máquina virtual, sirve para crear contenedores y ejecutar tus aplicaciones en dichos contenedores. Por ejemplo, un contenedor con java, tomcat y tu aplicación dentro. Digamos que puedes ejecutar tus aplicaciones con todo lo que necesitan ahí dentro, incluso interactuar con ella. Después puedes mover dicho contenedor y ejecutarlo con docker en otra máquina.
      Docker solo se ejecuta sobre Linux, ya que toma ciertos recursos del sistema operativo, lo que le hace más ligero que una máquina virtual. Además se pueden versionar contenedores de Docker con cada cambio que hagas (instalar una nueva librería, un cambio en el código de la aplicación…). Incluso, si por ejemplo a nivel de Docker ya tienes una imagen de java 8, si te creas otro contenedor que dependa de ese no tendrás que volver a bajarte la imagen de Java 8.
      Por otra parte, si necesitas ejecutar contenedores de Docker sobre otros sistemas, tienes que o crearte una máquina virtual con Linux o usar Boot2Docker.

      – Si me apuras, compararía más Vagrant con Boot2Docker, una virtualización que me instala Linux y lo necesario para poder ejecutar Docker. Así que rizando el rizo, lo que podría hacer es ya que Docker solo se ejecuta sobre Linux, utilizar Vagrant para montar una máquina virtual Linux y sobre eso ejecutar los contenedores de Docker.

      No sé si me expliqué bien 😛

  3. Harry Wong dice:

    Un pregunta: del artículo interpreto que la tecnología de contenedores, que se puede simular mediante procedimientos, y métodos, sirve sólo para fases de desarrollo y pruebas? Gracias.

  4. Pedro de la Lastra dice:

    Suerte encontrar tu artículo. No había forma de aclararme con la info de wikipedia. Además que justo cuando estaba pensando en su diferencia con las VM zas llega tu explicación en el mismo artículo.

    Muy bueno y muy claro. Gracias

  5. Victor dice:

    Buenas Ana, muy buena la explicación conceptual. Solo hay algo que no entiendo muy bien, al final Docker es como una aplicación standalone (Una aplicación que tiene su servidor de aplicaciones, versión java, ¿la aplicación ya instalada?, y otros recursos que pueda necesitar la aplicación), que al final lo que realiza es copiarla en la máquina cliente de Linux para que pueda posteriormente ejecutarse. Mi duda es que si realmente Docker es un contenedor que al final copia el contenido en la maquina cliente.
    Saludos.

    • David dice:

      @Victor
      Docker es una aplicación, pero por sí sola no hace nada.

      Lo que docker hace es ejecutar contenedores, y dentro de los contenedores es donde tu pones lo que quieras: aplicaciones, datos, configuraciones, variables de entorno… lo que sea.

      Por tanto docker lo que hace es ejecutar un “pack” de cosas que de manera tradicional son laboriosas de instalar, tunear y ejecutar.

      Por ejemplo, si tienes que ejecutar una aplicacion que necesita una versión concreta de java, un servidor apache con el upload por fichero aumentado de 16 a 300 megas, una configuracion concreta del sistema y una aplicación, necesitarías instalar todo eso a mano, o si eres muy manitas, hacer un script que te haga todas esas cosas.

      El problema es que puede que tengas ya un apache instalado que requiere otra configuracion concreta para otra aplicacion, u otra version de java, u otra dependencia que choca con lo que quieres instalar tu. Además de manual, resultaría casi imposible instalar todo sin que entre en conflicto.

      Ejecutando contenedores te aseguras de 2 cosas:
      1) La persona que ejecuta el contenedor esta usando el mismo software y configuraciones que el creador del contenedor.
      2) Al ser los contenedores entornos aislados unos de otros, te evitas el que distintas configuraciones o softwares entren en conflicto en una misma máquina.

      No se si te ha quedado más claro o te he hecho más lío 😛

  6. Gustavo Cabral dice:

    Hola! Realmente excelente tu explicación, yo recien comienzo con esto y mi gran duda es, cómo accedo al contenedor? Es como conectarme por ssh?

    Muchisimas gracias por tu publicación, me ha abierto la cabeza!

  7. Nodemio dice:

    para acceder al contenedor, solo debes tener los 4 primeros digitios del id del contenedor y ejecutar en la linea de comando ‘docker exec -it bash’ reemplanzando el por tus digitos del contenedor, si quieres saber los digitios del contenedor (id) ejecuta la accion ‘docker ps’ y ahi te listara todos los docker que tienes en ejecucion.

  8. Pablo dice:

    Hola Ana, con docker es recomendable utilizarlo en producción o es solo un entorno para desarrollo?

    Saludos.

    Pablo

  9. Sidney Herrera dice:

    wao excelente forma de explicar, me cabo de enterar del concepto de docker y su utilización, voy a empezar desde 0, esto se pone bueno. Solo espero encontrar mas aportes como este

  10. Antonny k. dice:

    Excelente. Entendí completamente con vuestra explicación. Muchas gracias.

  11. pedro dice:

    Buen articulo,
    pd: la pagina es desordenada.

  12. Frank Luis Figueredo Castillo dice:

    Excelente artículo, mis felicitaciones y muchas gracias, me ayudo mucho para entender el docker.

    Saludos a todos y buen día

  13. Tadeo Baeza dice:

    Excelente artículo! De tanto buscar sobre docker este fue el único que me hizo razonar lo que es docker, muchas gracias.

  14. Erick dice:

    Consulta, se mantienen los puertos de tu aplicacion, base de datos, apache, etc. o deben ser diferentes en cada contenedor?

  15. Anónimo dice:

    Absolutamente bueno, muchas gracias por la explicacion =)

  16. Jose Manuel dice:

    Gracias por el post, estaba en la web oficial y no acababa de entenderlo :S. Muchas gracias :D, esta muy bien explicado.

  17. Emilio dice:

    ¡Genial artículo!

    He leído por mi cuenta varias cosas para entender y empezar a utilizar docker y por primera vez me ha quedado lo suficientemente claro para seguir y probar.

    Un saludo!

  18. Julian Hernandez dice:

    Ana María, Excelente explicación!

    Leí el artículo y quedó claro el concepto, ya que hay mucho contenido que dice muchas cosas pero no aterriza el verdadero uso y las diferencias vs máquinas virtuales.

    Saludos

  19. Matias dice:

    Ana mil gracias. Para los que recien ingresamos a la carrera nos conviene tu colaboracion.

  20. Rafael dice:

    Me quedo con grandes dudas sobre si eso resolvería mis casos:
    – Plataforma Linux con WinXP virtualizado con un software del que no haré publicidad porque nos dejaron tirados a los 4 años y ya no nos proporcionaban la clave de activación porque “esa versión ya no se mantenía”. La solución fue instalar Linux y virtualizar dicho WinXP porque no se puede volver a instalar el citado software (aún disponiendo de la licencia y factura correspondientes) y había que cambiar si o si de equipo. El problema VirtualBox hace pesada la carga de WinXP. ¿Sería Docker una solución liviana que permitiera “migrar” desde VB lo que se necesita de WinXP y la aplicación instalada?
    – Usuarios de Windows a los que les interesa el software libre están atados de manos corporativamente y no se les puede instalar Linux y así usar, por ejemplo Digikam, que es un administrador de fotos muy potente que usa bases de que genera a partir de las imágenes. ¿Sería Docker una solución para poder usar Digikam y que éste acceda con un buen rendimiento a las imágenes que se encuentran en el disco duro del anfitrión?

    Gracias

  21. cata dice:

    hola
    cuando se instala docker en empresas se convierte en licenciado comercial o es free?

    como es el modo de licenciamiento?

    en desarrollo no se cobra y en producción si?
    que se cobra soporte y licenciamiento?

  22. Yorman dice:

    que lenguaje utilizan para crear los contenedores docker que lenguaje debo usar para hacer una app de tipo docker java go ?

  23. Jose dice:

    Hola,

    Gracias, por la explicación,
    soy un neófito de este tema y quiero entender los pro y los contras..y diferencias.

    Creo que la confusión, que al menos tengo yo, es que a Java se le dice que corre en una maquina virtual y Virtual Box le dicen que es un maquina virtual, o sea la mismas palabras.
    Para mi maquina seria el hardware, en el caso de VBox imita a los circuitos integrados o placa madre, acaso la VM de java imita a los circuitos integrados de una placa madre?, si es así seria una maquina virtual del tipo VBox, pero sino imita a un hardware, seria un contenedor mas complejo nada más ?….Y en realidad existirían contenedores más complejos y menos complejos. Ergo Docker seria un contenedor menos complejo respecto al contenedor de Java, es así ? Java no debería decirse que se ejecuta en un Contenedor también ? o Java tiene un sistema operativo cargado ?

    Cual es la caída del rendimiento ? Ninguna ?
    Si existen varios contenedores cada uno con sus librerías o versiones de Java , entonces estarían corriendo tantas versiones de java como contenedores ? y si hay 2 contenedores con la misma versión se estarían ejecutando 2 veces la misma versión de java en 2 contenedores distintos?
    Si es así, no es un derroche de espacio, CPU y memoria..?…o se puede compartir una misma versión de librerías para varios contenedores?
    Creo que normalmente en un OS se crean tantas maquinas virtuales como programas se estén ejecutando, y no habría diferencia en eso….

    Algo que no encuentro en ningún lado es la comparación…entre Wine versus Docker en cuanto a rendimiento ,no a lo que hacen.
    Wine lleva las aplicaciones de windowws a Linux y dicen que es muy liviano no es una maquina virtual pues justamente usa los servicios del sistema operativo anfitrión en este caso Linux. El concepto es el mismo entonces usar los servicios del SO?.
    Pero en definitiva wine no es una maquina virtual ni tampoco un contenedor ? o seria un contenedor?
    Si copio la carpeta .wine de una maquina a otra no estoy llevando todo y funcionaria ? (nunca lo hice todavía, pero claro solo se puede tener una sola depende del linux..)

    Saludos y Gracias
    Jose

  24. Anónimo dice:

    Excelente explicación, muy sencillo! gracias

  25. MILTON OSSES dice:

    Bueno docker es a linux como zones es solaris o Jails es FreeBSD , asi que es una forma de virtualizar un systema operativo usando modulos de kernel sin tener que usar todo un sistema operativo completo asi que la dependencia del kernel es directamente proporcional es decir docker necesita del kernel de linux, zones necesita el kernel de solaris, la diferencia real que tiene docker es que llega en el momento del despliegue en la nube y automatiza muchos procesos y permite descargar ya contenedores desarollados … no se puede comparar docker de ninguna forma con Virtual Box y mucho menos con Java VM.

    Yo soy un ingeniero con mas de 10 años de experiencia en sistemas operativos llevo trabajando 8 años en Oracle (antes trabajé en Sun Microsystems) para los que no saben SunMicrosystems es el autor de Java y Solaris y en su momento compro a Virtual Box y a Mysql

    • Gabriel dice:

      Hola amigo, una pregunta:

      ¿Quién te preguntó si sos Ingeniero o no? ¿Acaso alguien te pregunto sobre tus años de experiencia o dónde trabajas?

      A nadie le interesa, asique no lo cuentes.

      Saludos!

      PD: Busca un foro donde la gente comparta su profesión y sus pasiones, acá estas comentando cosas equivocadas.

  26. Una plataforma de uso academico,tengo un servidor local hp con sistema operativo anfitrion centos 7. Se creo usando virtualbox 2 maquinas virtuales tambien con so centos7, una con servidores de aplicacion, lenguajes, etc. Y la 2 con sistemas gestores de base de datos. Se almacenan y despliegan proyectos en python,php, jsp con mysql, postgresql,mongodb…donde se crean usuarios donde c/u suben los proyectos. Se desea mitigar problematicas de disponibilidad, ante numero de peticiones y usuarios, falla electrica, seguridad de datos, caida servidor local,etc. Quiero crear un modelo hibrido usando doker, usandolo para distribuir carga, usarlo cuando el local falla, copias de respaldo, sincronizar y actualizar, por ejemplo apagar el local y el servicio siga funcionando con los datos, y aplicaciones existentes. Permitiendo desplegar, y hacer cambios. Y cuando se encienda o resuelva problema local, se tomen esos cambios al servidor local, de la manera mas automatica y transparente para el usuario final. Doker me puede servir?, con que herramientas y servicios?, como?….gracias.

  27. Anónimo dice:

    Muy bien explicado, enhorabuena y muchas gracias!

  28. fran dice:

    Gracias, excelente post.

  29. Ralph dice:

    Muy util la explicación, me quedo clara la idea y ya puedo iniciar en docker con más tranquilidad.

  30. Mario Bermudez dice:

    Nunaca habia podido entender bien el concepto de docker, pero con este articulo me queda perfectamente claro.

    Muchas gracias por tu aporte.

Dejar una respuesta

Tu dirección de correo electrónico no será publicada.

top