Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

?id=bf7e537a-c5c6-41df-8785-2bce04642d7c

Cómo empezar a desarrollar utilizando Docker

 Logotipo de Docker

Nota: este artículo es una traducción del artículo original, de Jakub Skalecki, y ha sido traducido con su permiso expreso. Puedes seguir a Jakub en Twitter y en LinkedIn
Debes saber también que tenemos disponible un magnífico curso de Docker en nuestro catálogo, por si te interesa aprender la herramienta a fondo.

En esta ocasión vamos a hablar de una gran herramienta que se usa mucho en el día a día trabajando como desarrollador. Se llama Docker. Antes de nada, aclarar que este post va dirigido a principiantes.

Sí, he oído hablar de Docker, ¿pero qué es en realidad?

Docker es una herramienta para crear y ejecutar "máquinas virtuales ligeras". Se distribuyen en paquetes que por regla general contienen:

  • Una pequeña distribución de Linux (aunque también trabaja con Windows),
  • todas las dependencias necesarias para que tu aplicación se ejecute,
  • y el código de tu aplicación.

Se llaman "imágenes Docker" y puedes pensar en ellas como "cajas negras ejecutables". Estas imágenes se pueden utilizar para crear un número arbitrario de "contenedores", procesos aislados con acceso a todas las dependencias preparadas. Una cosa importante es que cada contenedor es una copia exacta de una imagen, incluso si se inicia en un sistema operativo diferente. No importa qué tecnología o lenguaje se requiera para ejecutar tu aplicación, si tienes instalada la imagen y Docker, podrás ejecutarla.

Voy a procurar que este artículo sea breve y conciso, así que pasemos a las ventajas de usar Docker. Si quieres saber más, puedes consultar la este artículo + vídeo.

¿Por qué debería darle una oportunidad a Docker?

Recordemos, no tienes por qué entrar "de lleno".

Te aconsejo que vayas incorporando soporte con Docker en tu aplicación de manera progresiva. Empieza a usarlo en desarrollo. Comenta con los demás en tu equipo de desarrollo que pueden usar Docker, muéstrales cómo usarlo. Espera a ver qué pasa, acostumbraos a utilizarlo y familiarizaos con él. Cuando alguien pregunte "oye, ¿por qué diablos no hemos empezado a trabajar con esto antes?", ya quizás sea el momento de empezar a pensar cómo integrarlo en la fase de producción... Pero centrémonos en la fase de desarrollo por hoy.

En desarrollo, Docker te permite conservar toda la infraestructura en forma de código y compartirlo con todos los miembros de tu equipo. ¿Te suenan conversaciones de este estilo?:

(Tú): -"Oye Pedro, mi aplicación en desarrollo no arranca... ¿Has tocado algo?"-

Pedro: -"Ah, sí, se me olvidó comentarte. Tenemos un nuevo motor de base de datos. Además hay que instalarle el redis y los drivers. Es muy sencillo, échale un ojo a la documentación y lo haces en un minuto."-

Claro, siempre lleva más tiempo que ese "minuto". Si trabajas en un equipo muy grande, estas cosas pasan mucho más a menudo y se complica mucho identificar el origen de los problemas. Con Docker, para sincronizar los cambios solo hay que ejecutar docker-compose up --build, y en breves instantes la nueva versión de la pila de desarrollo estará en funcionamiento, independientemente de lo que haya cambiado. Además, el hecho de incorporar un nuevo programador en el equipo de desarrollo no supondrá trauma alguno, ya que todo será igual... Imagina cuánto tiempo se puede llegar a ahorrar.

Personalmente, trabajo con muchas tecnologías diferentes en paralelo, usando diferentes versiones de dependencias comunes (por ejemplo, bases de datos). Docker me permite aislarlas. También, independientemente de la tecnología, puedo trabajar siempre de la misma manera- docker-compose up- y para adelante...

Hay un lugar llamado Docker Hub. Es una tienda oficial con un montón de imágenes listas para ser utilizadas, que puedes emplear en tu "stack" de desarrollo. ¿Necesitas redis? ¿Postgres? ¿MySQL, Apache, PHP, nGinx, Python, Ruby, NodeJS? ¡Todo disponible en un clic!

Bien, la cosa promete. ¿Cómo empezar?

Primero: instala docker y docker-compose.

Puedes acceder a las instrucciones oficiales aquí y aquí.

Segundo: añade un Dockerfile propio a tu aplicación

Dockerfile contiene una lista de instrucciones que se tienen que ejecutar para preparar el entorno, para luego poder ejecutar tu aplicación. Por ejemplo, aquí copias tus archivos de proyecto, instalas todas las dependencias del sistema y la aplicación, haces los ajustes de configuración, etc... Por ejemplo, veamos un Dockerfile que se utiliza para un proyecto en Python:

FROM python:3.6

ENV PROJECT_ROOT=/srv
WORKDIR $PROJECT_ROOT

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

CMD ["python", "manage.py", "runserver"]

Por lo general no se necesita nada más sofisticado. Para encontrar instrucciones sobre cómo crear un Dockerfile para tu lenguaje de programación solo tienes que buscarlo en Google, hay muchísimos recursos sobre esto en particular.

Si quieres aprender sobre buenas prácticas, este artículo ya ha ayudado a muchas personas. También te puedes dirigir a la página oficial.

Tercero: crea un archivo docker-compose.yml.

Docker-compose es una herramienta genial que nos permite gestionar simultáneamente varias pilas de contenedores sin traumas. Este archivo especial le dice a docker-compose qué contenedores tienen que iniciarse.

Este es un ejemplo de docker-compose.yml que utilizo:

version: '2'
services:
redis:
  image: redis

database:
  image: postgres

app:
  build: .
  environment:
    DEBUG: 1
  ports:
    - 8000:8000
  volumes:
    - .:/srv
  command: python manage.py runserver

Este archivo indica que queremos que Redis y Postgres se creen usando imágenes oficiales, y que nuestra aplicación se cree desde Dockerfile en local, disponible desde la red de Docker externa a través del puerto 8000, con todos los archivos locales montados dentro del contenedor para facilitar el desarrollo. Se pueden encontrar todas las opciones aquí. En este ejemplo se usa la versión 2 porque la versión soporta Docker Swarm que no se necesita en desarrollo.

Ahora, cuando introduzcamos docker-compose up, esto es lo que va a suceder:

  1. Docker intentará descargar / crear todas las imágenes requeridas. Si usamos la opción image, se descargará de Internet, por defecto desde DockerHub. La opción build dará instrucciones a Docker de crear la imagen usando el Dockerfile ubicado en un directorio concreto, en nuestro caso . (dir actual). Si la imagen ya existe, no se volverá a comprobar automáticamente (para hacerlo, debemos añadir la bandera --build)
  2. Cuando las imágenes están disponibles, docker-compose comprobará si la configuración ha cambiado desde la última ejecución. Si no, se inician contenedores usados con anterioridad, y en caso contrario, se crean nuevos contenedores. La configuración de cosas como puertos, volúmenes, variables, redes, etc... se toman desde docker-compose.yml.
  3. Si no se indica lo contrario, se crea una red especial, abarcando todos los contenedores creados. Les permite referenciarse entre ellos usando nombres en vez de direcciones IP. Como muestra, en el ejemplo, la base de datos de la aplicación estará disponible en postgres:5432.
  4. Todos los contenedores se inician a la vez, y vemos logs de todos ellos.

Y eso es todo. Ahora toda la pila arranca automáticamente. Evidentemente deberás hacer cosas como crear automáticamente una base de datos si no existe, o volver a cargar el código de la aplicación tras un cambio para hacer que la experiencia de desarrollo sea más agradable. Lo importante aquí es que solo tienes que preparar esto una vez y todo el equipo de programación se beneficiará de ello inmediatamente.

Aviso: a la hora de programar, probablemente debas usar siempre la opción volumes en tu archivo docker-compose.yml, montando los archivos locales en el contenedor. Sin esta opción, tendrás que rehacer el contenedor cada vez que haya algún cambio.

Uso típico

Estos son algunos de los comandos más utilizados en el día a día.

  • Empezando a trabajar: docker-compose up o docker-compose up --rebuild si sabes que algunas dependencias han cambiado.

  • Ejecutando comandos una sola vez: depende de si necesitamos disponibles otros contenedores, como la base de datos, o no. Si es así, arranca la pila con un comando anterior, y en otro ventana de terminal ejecuta docker-compose exec $SERVICE_NAME $COMMAND. Si no, solo usa docker-compose run --rm $SERVICE_NAME $COMMAND (yo recomiendo el "flag" --rm para eliminarlo después del comando)

  • Eliminar todo lo creado por docker-compose: docker-compose down. Eliminará todos los contenedores, imágenes y redes.

  • Eliminar un contenedor con todos los datos asociados: docker-compose rm -v $SERVICE_NAME (muy útil si quieres restablecer completamente una base de datos).

¡Esto es todo por ahora!

Espero que este artículo haya sido muy útil para empezar con Docker. Si te gusta esta post, no dudes en compartirlo.

Fecha de publicación:
campusMVP campusMVP es la mejor forma de aprender a programar online y en español. En nuestros cursos solamente encontrarás contenidos propios de alta calidad (teoría+vídeos+prácticas) creados y tutelados por los principales expertos del sector. Nosotros vamos mucho más allá de una simple colección de vídeos colgados en Internet porque nuestro principal objetivo es que tú aprendas. Ver todos los posts de campusMVP
Archivado en: Herramientas

Boletín campusMVP.es

Solo cosas útiles. Una vez al mes.

🚀 Únete a miles de desarrolladores

DATE DE ALTA

x No me interesa | x Ya soy suscriptor

La mejor formación online para desarrolladores como tú

Comentarios (8) -

Esto de Docker me parece super interesante, pero la verdad... que todavía me quedan mil dudas de como usarlo.

¿Tenéis pensado hacer algún curso sobre el tema? (Sobre todo si está orientado a usarse con .NET :)

Responder

Algo de eso hay en el horizonte :-)

Pero no te podemos decir para cuándo.

Saludos.

Responder

Hola Carlos:

Por si acaso no te has enterado, y dado que lo preguntaste en el comentario al que te estamos respondiendo, en campusMVP ya tenemos disponible un excelente curso de Docker que además incluye Kubernetes: www.campusmvp.es/.../...s-en-contenedores_237.aspx

Saludos.

Responder

Muchas gracias por la información. Analizando posibilidades para hacerlo... Gracias !!

Responder

David Palacios
David Palacios

Una de las poca guías útiles que he encontrado y que van al grano. En principio creía que iba no era necesario generarse manualmente el Dockerfile y docker-compose, pensé que toda esta configuración la cogeria automaticamente.

Puede ser un engorro tener que "encontrar" a mano toda la configuración necesaria que hiciste en su día para lanzar un proyecto. Eso sí, una vez tienes la imagen creada, es totalmente útil y ahorra horas.

Gracias por la guía!

Responder

Buenas Soy nuevo en esto de Docker, y me encuentro con este error, que puedo hacer? :S

docker: error during connect: Post http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.39/containers/create: open //./pipe/docker_engine: El sistema no puede encontrar el archivo especificado. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.

Responder

Hola como puedo hacer esto mira
tengo un contenedor en docker con solo una aplicacion en java y otro contenedor con la base de datos como podria conectarlos a ambos

Responder

una de las explicaciones mas precisas que he encontrado hasta el momento

Responder

Agregar comentario

Los datos anteriores se utilizarán exclusivamente para permitirte hacer el comentario y, si lo seleccionas, notificarte de nuevos comentarios en este artículo, pero no se procesarán ni se utilizarán para ningún otro propósito. Lee nuestra política de privacidad.