Cómo Docker puede hacer tu vida más fácil como desarrollador

¿Qué es Docker?

Docker es una tecnología que le permite crear y ejecutar contenedores para sus aplicaciones. Los contenedores son entornos aislados que ejecutan una aplicación e incluyen sus dependencias. Por lo general, son mínimos, incluso lo que necesita para ejecutar su aplicación y nada más.
Los contenedores no están destinados a almacenar datos permanentes. Se espera que su contenedor sea destruido y recreado en cualquier momento, por lo que cualquier dato guardado dentro del contenedor se perderá. Simplemente debe contener los binarios y el código necesarios para que su aplicación se ejecute, con cualquier dato permanente almacenado externamente, por ejemplo, en volúmenes montados o en una base de datos en la nube.
Hay una serie de ventajas de usar contenedores para desarrollar e implementar su aplicación:
  1. Ningún error humano: tiene un entorno predecible cada vez que lo implementa. En lugar de que el administrador del sistema ejecute los comandos a través de SSH en un servidor virtual, ahora tiene un script documentado en su código fuente de lo que se implementa en su contenedor.
  2. Entornos reproducibles: puede ejecutar un sistema que está muy cerca de la producción en su máquina de desarrollo. Esto hace que encontrar errores sea mucho más fácil. Es mucho menos probable que se introduzca un error porque alguien se olvidó de ejecutar un comando en producción. O como dice la vieja excusa: "Funcionó en mi máquina".
  3. Herramientas de administración de infraestructura: puede aprovechar las herramientas y tecnologías que manejan el aprovisionamiento, la creación de redes, el equilibrio de carga y la escala de contenedores como Docker Swarm o Kubernetes.
  4. Administración de dependencias: si tiene dos servicios que necesitan versiones diferentes de Python, por ejemplo, puede ejecutar ambos servicios en la misma máquina virtual pero en diferentes contenedores y sus dependencias no se interferirán entre sí.
  5. Nuevos miembros del equipo: las empresas suelen tener un documento gigante, incorrecto e incompleto sobre cómo configurar una máquina de desarrollo que frustra a los nuevos miembros del equipo. Los contenedores pueden ayudarte a mejorar esto. Su entorno de desarrollo se puede configurar completamente con un script bash.
Por último, vale la pena mencionar que aunque Docker es casi sinónimo de contenedores, existen otras tecnologías de contenedores, como rkt . Nos centraremos en Docker en este artículo, pero es bueno saber que hay otras opciones.
Docker es también una empresa que vende soluciones empresariales para contenedores. Sin embargo, el motor Docker y los productos de escritorio Docker son de uso gratuito. El motor Docker utiliza Container , que es de código abierto.

Instalación de Docker

Puedes instalar Docker Desktop en Windows y Mac. Esto viene con un montón de herramientas útiles, incluyendo Docker Compose:
Puede instalar Docker Server en Linux. Y también puede instalar otras herramientas por separado, como Docker Compose:

Creando una imagen basada en Alpine Linux

Una imagen de Docker es un archivo binario que contiene los archivos necesarios para iniciar y ejecutar un contenedor de Docker. Las imágenes de Docker se crean mediante una serie de comandos en un archivo llamado DockerfileEstos comandos configuran la imagen y le dicen a Docker qué comando ejecutar cuando se inicia el contenedor.
Alpine Linux es una distribución liviana de Linux que es popular para los contenedores debido a su pequeño tamaño y su mínimo equipaje. Las distribuciones pequeñas son populares porque reducen el tiempo de construcción de la imagen y proporcionan un control más preciso sobre las dependencias que instala.
Aquí hay un ejemplo de un Dockerfile, que es tan simple como posiblemente podría obtener:
FROM alpine:3.9  
CMD echo "hello world"  
El primer comando utiliza la alpine:3.9imagen de Docker como base. Agarrará la imagen para esto y luego ejecutará el resto de los comandos en su contra. De forma predeterminada, Docker obtendrá estas imágenes del registro de Docker , pero se puede cambiar si es necesario.
El segundo comando es el comando que se ejecuta para iniciar el contenedor. Aquí solo estamos corriendo echopara que esto salga Hello Worlda la consola. El contenedor solo permanecerá activo mientras este comando se ejecute, por lo que, en este caso, saldrá y cerrará inmediatamente el contenedor.
Para los contenedores que necesitan ejecutarse continuamente, el comando final normalmente iniciará un proceso que nunca se detiene, como un servidor web o un motor de base de datos.

Ejecutando un contenedor desde tu imagen

Ejecute el siguiente comando en el mismo directorio que Dockerfile para crear la imagen del contenedor y etiquételo con la etiqueta "myimage":
$ docker build -t myimage .
El resultado de ejecutar esto es algo como esto:
Sending build context to Docker daemon  2.048kB  
Step 1/2 : FROM alpine:3.9  
3.9: Pulling from library/alpine  
bdf0201b3a05: Pull complete  
Digest: sha256:28ef97b8686a0b5399129e9b763d5b7e5ff03576aa5580d6f4182a49c5fe1913  
Status: Downloaded newer image for alpine:3.9  
 ---> cdf98d1859c1
Step 2/2 : CMD echo "hello world"  
 ---> Running in db62be8c00ca
Removing intermediate container db62be8c00ca  
 ---> d351cb9614ec
Successfully built d351cb9614ec  
Successfully tagged myimage:latest  
Luego, usando la etiqueta como referencia podemos ejecutar el contenedor:
$ docker run -t myimage
El resultado:
hello world  
Los archivos de Docker pueden hacer mucho más. Por ejemplo, pueden copiar archivos del sistema de archivos a la imagen y cambiar las imágenes de la base para que se utilice una imagen diferente como base para ejecutar el contenedor. Veremos un ejemplo de estas características en la siguiente sección.

Caso de uso: Ejecutar proyecto de código abierto con un Dockerfile

Es cada vez más común en la actualidad que un proyecto de código abierto exponga un archivo Docker para facilitar la configuración y la ejecución de la aplicación. Puede ayudar a los recién llegados a ejecutar el proyecto sin perder tiempo instalando innumerables dependencias en su computadora.
Si escribe software de código abierto, podría considerar la posibilidad de exponer un archivo de Dock, el proyecto tiene varias dependencias. Para un proyecto simple de Node.js puede que no valga la pena, pero para algo que ejecuta Node, Ruby y MySQL puede hacer esto para hacer la vida un poco más fácil para las personas que aún no tienen esos instalados.
En este ejemplo, vamos a tomar una aplicación de código abierto escrita en el marco .NET Core de Microsoft, y ejecutarla en Docker. La aplicación es un ejemplo hecho especialmente para Docker y se puede encontrar en el siguiente enlace:
El primer paso es clonar este repositorio para que lo tengamos localmente:
$ git clone https://github.com/dotnet/dotnet-docker-samples
Si no ha utilizado Git anteriormente, puede instalarlo desde aquí . No es importante que tenga mucho conocimiento de git, ya que solo lo estamos utilizando para descargar el código fuente.
Una vez clonado, abra la dotnet-docker-samples/aspnetappcarpeta, eche un vistazo a los archivos y observe que hay un Dockerfile. Que en el momento de escribir se ve así:
FROM microsoft/aspnetcore-build:2.0 AS build-env  
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.csproj ./  
RUN dotnet restore

# copy everything else and build
COPY . ./  
RUN dotnet publish -c Release -o out

# build runtime image
FROM microsoft/aspnetcore:2.0  
WORKDIR /app  
COPY --from=build-env /app/out .  
ENTRYPOINT ["dotnet", "aspnetapp.dll"]  
Este Dockerfile se basa en una imagen de Microsoft para crear aplicaciones ASP.NET y procede a emitir comandos para copiar en los archivos y compilarlos. Luego cambia las imágenes a una de Microsoft para ejecutar una aplicación ASP.NET, procede a copiar los archivos construidos en el directorio actual y luego ejecuta el tiempo de ejecución de ASP.NET contra ellos.
Si nunca ha usado ASP.NET, pronto podrá decir que creó, instaló y ejecutó una aplicación ASP.NET. ¡Todo lo que habrías hecho es teclear un par de comandos de Docker!
Para construir la imagen, ejecute los siguientes comandos desde la línea de comandos:
$ cd dotnet-docker-samples/aspnetapp
$ docker build -t aspnetapp .
$ docker run -it --rm -p 8000:80 aspnetapp
Esto construirá la imagen y luego iniciará un contenedor utilizando esa imagen, asignando el puerto 8000 en su computadora al puerto 80 dentro de la imagen. Ahora puede visitar http: // localhost: 8000 para ver esta aplicación en ejecución.
Debería ver algo como esto:
aplicación de contenedor aspnet en el navegador

Docker componer

Un problema que encontrará rápidamente al ejecutar un solo contenedor es que no es fácil configurar un contenedor para hacer un montón de cosas diferentes, como procesar archivos PHP, alojar una base de datos MySQL y actuar como un servidor web usando NGINX.
También es innecesario porque los contenedores son muy ligeros (a diferencia de las máquinas virtuales), lo que significa que no hay problemas para que un grupo de ellos funcione en la misma máquina haciendo cosas diferentes.
La ventaja de múltiples contenedores e imágenes es que le da la oportunidad de dividirlos en diferentes máquinas virtuales o máquinas físicas e incluso crear múltiples contenedores desde la misma imagen en máquinas para manejar la carga de aplicaciones adicionales.
El desafío con los múltiples contenedores es cómo configurarlos para que sepan cómo comunicarse entre ellos a través de la red, con la seguridad adecuada y cómo conectar el almacenamiento a esos contenedores. Afortunadamente, hay una serie de opciones diferentes para resolver este problema de "orquestación" de contenedores.
Quizás la forma más fácil de comenzar es con Docker Compose .
Docker Compose utiliza un archivo que describe los componentes necesarios para que un sistema se ejecute. Esto puede incluir contenedores, sistemas de archivos, puertos de red a ser expuestos, y así sucesivamente.
Aquí hay un docker-compose.ymlarchivo de ejemplo que describe tal configuración:
version: '3'  
services:  
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
volumes:  
  logvolume01: {}
En el archivo Docker Compose que se muestra arriba, ejecutamos dos contenedores. Uno está construido a partir de la carpeta local, y el otro utiliza la imagen de Redis. Hay información sobre qué volumen se debe montar, por ejemplo, la carpeta actual se asigna /codedentro del contenedor web y la carpeta logvolume01se asigna /var/logdentro del contenedor.
El comando docker-compose upse utiliza para iniciar los contenedores y montar los volúmenes y obtener todo lo que ha descrito en el docker-compose.ymlarchivo en funcionamiento. Puede utilizar esto tanto para entornos de desarrollo como de producción.

Kubernetes

Docker Compose es una excelente herramienta para comenzar a pegar contenedores juntos, pero su funcionalidad está limitada para entornos de producción y se limita a ejecutar en un solo host. Necesitará una tecnología diferente para ejecutarse en múltiples máquinas y manejar la tolerancia a fallas, el monitoreo y la escala.
Kubernetes es una arquitectura de contenedor de código abierto. Organiza contenedores y tiene una amplia gama de características, que incluyen creación dinámica de contenedores, escalado, tolerancia a fallas, contenedores de sondeo para detectar signos de vida útil y balanceo de carga. El nombre proviene del griego κυβερνήτης que significa timonel. A veces se abrevia como K8, aunque no estoy seguro de por qué no es un nombre muy largo para empezar.
Kubernetes se puede instalar directamente en máquinas virtuales o físicas. Como alternativa, los principales proveedores de la nube, incluidos Google, AWS, Azure y Digital Ocean, brindan servicios Kubernetes administrados que simplificarán la puesta en marcha de un clúster.
Familiarizarse con Kubernetes requiere un poco de estudio. No tendrá mucho sentido si solo haces piruetas sin algún conocimiento del terreno. Hay un curso básico gratuito de edX sobre esto, que he usado para ayudarme a comenzar con esto en el trabajo.
Kubernetes no es la única tecnología para organizar contenedores: también hay Docker Swarm, Vagrant, Monad y Openshift y muchos más. Creo que Kubernetes ofrece una 'apuesta segura' en términos de soporte en el futuro a partir de 2019. Todos los principales proveedores de la nube lo respaldan, y recientemente Microsoft anunció que están retirando su propio servicio de contenedores, a favor de Kubernetes. .

Conclusión

Docker puede hacer su vida más cómoda como desarrollador de software. Se puede utilizar para ejecutar diferentes entornos previsiblemente en su máquina de desarrollador. También se usa en producción, generalmente con un sistema de orquestación como Kubernetes, para proporcionar implementaciones predecibles de sus aplicaciones a los servidores. Si aún no has probado Docker, te animo a que lo hagas.

Acerca de: Programator

Somos Instinto Programador

0 comentarios:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Con tecnología de Blogger.