C贸mo Docker puede facilitarle la vida 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, incluido solo 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 se destruya y se vuelva a crear en cualquier momento, por lo que se perder谩n todos los datos guardados dentro del contenedor. Solo debe contener los binarios y el c贸digo necesarios para que se ejecute su aplicaci贸n, con cualquier dato permanente almacenado externamente, por ejemplo, en vol煤menes montados o en una base de datos en la nube.

    Existen varias ventajas de utilizar contenedores para desarrollar e implementar su aplicaci贸n:

    • Sin error humano: tiene un entorno predecible cada vez que implementa. En lugar de que el administrador de su sistema ejecute 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.
    • Entornos reproducibles: puede ejecutar un sistema muy cercano a la producci贸n en su m谩quina de desarrollo. Esto facilita mucho la b煤squeda de errores. Es mucho menos probable que se introduzca un error porque alguien olvid贸 ejecutar un comando en producci贸n. O como dice la vieja excusa: “Funcion贸 en mi m谩quina”.
    • Herramientas de administraci贸n de infraestructura: puede aprovechar las herramientas y tecnolog铆as que manejan el aprovisionamiento, las redes, el equilibrio de carga y el escalado de contenedores como Docker Swarm o Kubernetes.
    • Administraci贸n de dependencias: si tiene dos servicios que necesitan diferentes versiones de Python, por ejemplo, puede ejecutar ambos servicios en la misma m谩quina virtual pero en diferentes contenedores y sus dependencias no interferir谩n entre s铆.
    • Nuevos miembros del equipo: las empresas suelen tener un documento gigante, incorrecto e incompleto sobre c贸mo configurar la m谩quina de un desarrollador, lo que frustra much铆simo a los nuevos miembros del equipo. Los contenedores pueden ayudarlo a mejorar esto. Su entorno de desarrollo se puede configurar completamente con un script bash.

    Finalmente, 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 tambi茅n es una empresa que vende soluciones empresariales para contenedores. Sin embargo, el motor Docker y los productos de escritorio Docker son de uso gratuito. Usos del motor Docker contenedord, que es de c贸digo abierto.

    Instalaci贸n de Docker

    Puede instalar Docker Desktop en Windows y Mac. Esto viene con un mont贸n de herramientas 煤tiles, incluido Docker Compose:

    Puede instalar Docker Server en Linux. Y tambi茅n puede instalar otras herramientas por separado, como Docker Compose:

    Creaci贸n de 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 utilizando una serie de comandos en un archivo llamado Dockerfile. Estos comandos configuran la imagen y le dicen a Docker qu茅 comando ejecutar cuando se inicia el contenedor.

    Alpine Linux es una distribuci贸n de Linux liviana que es popular para contenedores debido a su peque帽o tama帽o y m铆nimo equipaje. Las distribuciones peque帽as son populares porque reducen el tiempo de construcci贸n de la imagen y brindan un control m谩s preciso sobre las dependencias que instala.

    Aqu铆 hay un ejemplo de un Dockerfile, que es tan simple como podr铆a ser:

    FROM alpine:3.9
    CMD echo "hello world"
    

    El primer comando usa el alpine:3.9 Imagen de Docker como base. Tomar谩 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 eso se puede cambiar si es necesario.

    El segundo comando es el comando a ejecutar para iniciar el contenedor. Aqu铆 solo estamos corriendo echo as铆 que esto saldr谩 Hello World a la consola. El contenedor solo permanecer谩 vivo mientras se ejecute este comando, por lo que en este caso saldr谩 inmediatamente y cerrar谩 el contenedor.

    Para los contenedores que necesitan ejecutarse continuamente, el comando final normalmente lanzar铆a un proceso que nunca se detiene, como un servidor web o un motor de base de datos.

    Ejecutando un contenedor desde su imagen

    Ejecute el siguiente comando en el mismo directorio que Dockerfile para crear la imagen del contenedor y etiqu茅tela 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 Docker pueden hacer mucho m谩s. Por ejemplo, pueden copiar archivos del sistema de archivos a la imagen y cambiar las im谩genes base para que se use 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 un proyecto de c贸digo abierto con un Dockerfile

    Hoy en d铆a, es cada vez m谩s com煤n que un proyecto de c贸digo abierto exponga un Dockerfile para facilitar la configuraci贸n y ver la aplicaci贸n en ejecuci贸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 exponer un Dockerfile, el proyecto tiene varias dependencias. Para un proyecto simple de Node.js, puede que no valga la pena, pero para algo que ejecute Node, Ruby y MySQL, puede hacer esto para facilitar un poco la vida a las personas que a煤n no los tienen 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:

    https://github.com/dotnet/dotnet-docker-samples/tree/master/aspnetapp

    El primer paso es clonar este repositorio para que lo tengamos localmente:

    $ git clone https://github.com/dotnet/dotnet-docker-samples
    

    Si no ha usado Git antes, puede instalarlo de aqu铆. No es importante que tenga mucho conocimiento de git ya que solo lo usamos para descargar el c贸digo fuente.

    Una vez clonado, abra el dotnet-docker-samples/aspnetapp carpeta, eche un vistazo a los archivos y observe que hay un Dockerfile. Que en el momento de escribir este art铆culo 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 edificio ASP.NET y procede a emitir comandos para copiar los archivos y compilarlos. Luego cambia las im谩genes a una de Microsoft para corriendo una aplicaci贸n ASP.NET, procede a copiar los archivos construidos en el directorio actual y luego ejecuta el tiempo de ejecuci贸n ASP.NET en ellos.

    Si nunca antes ha utilizado ASP.NET, pronto podr谩 decir que cre贸, instal贸 y ejecut贸 una aplicaci贸n ASP.NET. 隆Todo lo que habr铆a hecho es escribir 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 crear谩 la imagen y luego iniciar谩 un contenedor usando esa imagen, mapeando el puerto 8000 en su computadora al puerto 80 dentro de la imagen. Ahora puedes visitar http: // localhost: 8000 para ver esta aplicaci贸n en ejecuci贸n.

    Deber铆a ver algo como esto:

    Docker Compose

    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 livianos (a diferencia de las m谩quinas virtuales), lo que significa que no hay problema en tener un mont贸n de ellos ejecut谩ndose en la misma m谩quina haciendo cosas diferentes.

    La ventaja de m煤ltiples contenedores e im谩genes es que le brinda la oportunidad de dividirlos en diferentes m谩quinas virtuales o m谩quinas f铆sicas e incluso crear m煤ltiples contenedores a partir de la misma imagen en todas las m谩quinas para manejar la carga de aplicaciones adicional.

    El desaf铆o con varios contenedores es c贸mo configurarlos para que sepan c贸mo comunicarse entre s铆 a trav茅s de la red, con la seguridad adecuada, y c贸mo conectar el almacenamiento a esos contenedores. Afortunadamente, hay varias opciones diferentes para resolver este problema de “orquestar” contenedores.

    Quiz谩s la forma m谩s f谩cil de comenzar es con Docker Compose.

    Docker Compose usa un archivo que describe qu茅 componentes se necesitan para que un sistema funcione. Esto puede incluir contenedores, sistemas de archivos, puertos de red a exponer, etc.

    Aqu铆 hay un ejemplo docker-compose.yml archivo que describe dicha 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 de Docker Compose que se muestra arriba, ejecutamos dos contenedores. Uno se crea a partir de la carpeta local y el otro usa la imagen de Redis. Hay informaci贸n sobre qu茅 volumen montar, por ejemplo, la carpeta actual est谩 asignada /code dentro del contenedor web y la carpeta logvolume01 est谩 mapeado a /var/log dentro del contenedor.

    El comando docker-compose up se utiliza para iniciar los contenedores y montar los vol煤menes y obtener todo lo que ha descrito en el docker-compose.yml archivo en funcionamiento. Puede usar esto para entornos de desarrollo y producci贸n.

    Kubernetes

    Docker Compose es una gran herramienta para comenzar a pegar contenedores, pero tiene una funcionalidad limitada para entornos de producci贸n y se limita a ejecutarse en un solo host. Necesitar谩 una tecnolog铆a diferente para ejecutar en varias m谩quinas y manejar la tolerancia a fallas, el monitoreo y el escalado.

    Kubernetes es una arquitectura de contenedor de c贸digo abierto. Orquesta contenedores y tiene una amplia gama de caracter铆sticas, que incluyen creaci贸n din谩mica de contenedores, escalado, tolerancia a fallas, sondeo de contenedores en busca de signos de vida y equilibrio de carga. El nombre proviene del griego 魏蠀尾蔚蟻谓萎蟿畏蟼 que significa timonel. A veces se abrevia como K8s, aunque no estoy seguro de por qu茅, ya que para empezar no es un nombre muy largo.

    Kubernetes se puede instalar directamente en m谩quinas virtuales o f铆sicas. Alternativamente, los principales proveedores de nube, incluidos Google, AWS, Azure y Digital Ocean, brindan servicios administrados de Kubernetes que simplificar谩n la puesta en marcha de un cl煤ster.

    Familiarizarse con Kubernetes requiere algo de estudio. No tendr谩 mucho sentido si solo hackea sin algunos conocimientos b谩sicos. Hay un b谩sico curso gratuito de edX sobre esto, que he utilizado para ayudarme a comenzar con esto en el trabajo.

    Kubernetes no es la 煤nica tecnolog铆a para orquestar contenedores: tambi茅n existen 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 nube lo admiten, y recientemente Microsoft anunci贸 que est谩n retirando su propio servicio de contenedores de la mezcla, 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 de manera predecible en su m谩quina de desarrollo. Tambi茅n se usa en producci贸n, generalmente con un sistema de orquestaci贸n como Kubernetes, para proporcionar implementaciones predecibles de sus aplicaciones en los servidores. Si a煤n no ha probado Docker, le animo a que lo haga.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *