Docker 101: cómo pasar de la creación a la implementación

Docker es un cambio de juego y ha alterado mucho el mundo del desarrollo de aplicaciones. Aprenda las habilidades vitales necesarias para trabajar con esta tecnología de contenedores hoy.

¿Qué es Docker?

En términos simples, Docker es una herramienta que permite a los desarrolladores crear, implementar y ejecutar aplicaciones en contenedores. La contenedorización es el uso de contenedores de Linux para implementar aplicaciones.

Entonces, ¿por qué Docker es tan bueno y por qué nosotros, como desarrolladores, deberíamos molestarnos en aprenderlo?

Razón Explicación
Flexible Incluso las aplicaciones más complejas se pueden contener en contenedores.
Ligero Los contenedores aprovechan y comparten el núcleo del host.
Intercambiable Puede implementar actualizaciones y mejoras sobre la marcha.
Portátil Puede crear localmente, implementar en la nube y ejecutar en cualquier lugar.
Escalable Puede aumentar y distribuir automáticamente las réplicas de contenedores.
Apilable Puede apilar servicios verticalmente y sobre la marcha.

Ahora que sabemos por qué Docker es tan importante, instalémoslo en nuestra máquina local.

Regístrese para obtener una cuenta en Docker Hub y descargue la aplicación gratuita Docker Desktop.

¿En qué se diferencia Docker de las máquinas virtuales tradicionales?

Un contenedor se ejecuta de forma nativa en Linux y comparte el kernel de la máquina host con otros contenedores. Se ejecuta como un proceso discreto, no ocupa más memoria que cualquier otro ejecutable, lo que significa que es muy ligero.

Por el contrario, una máquina virtual (VM) ejecuta un sistema operativo "invitado" completo con acceso virtual a los recursos del host a través de un hipervisor. En general, las VM proporcionan un entorno con más recursos de los que necesitan la mayoría de las aplicaciones.

Cuando se trabaja con Docker, un `Dockerfile` define lo que sucede en el entorno dentro de su contenedor. El acceso a recursos como interfaces de red y unidades de disco se virtualiza dentro de este entorno, que está aislado del resto de su sistema. Esto significa que debe mapear puertos al mundo exterior y ser específico sobre qué archivos desea "copiar" en ese entorno. Sin embargo, después de hacer eso, puede esperar que la compilación de su aplicación definida en este `Dockerfile` se comporte exactamente igual donde sea que se ejecute.

Comandos de Docker

Para probar que tiene una versión en ejecución de Docker, ejecute el siguiente comando:

docker --version

Para probar que su instalación está funcionando perfectamente, intente ejecutar la imagen simple de Docker hello-world :

docker run hello-world

Si todo está configurado correctamente, debería ver un resultado similar al siguiente:

Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world ca4f61b1923c: Pull complete Digest: sha256:ca0eeb6fb05351dfc8759c20733c91def84cb8007aa89a5bf606bc8b315b9fc7 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. ... 

Para ver la imagen de Docker de hello-world que se descargó en su computadora, use el comando de listado de imágenes de Docker:

docker image ls

¡Increíble! Ya ha comenzado a desarrollar aplicaciones en contenedores con Docker. A continuación, se muestran algunos comandos básicos útiles de Docker:

## List Docker CLI commands docker docker container --help ## Display Docker version and info docker --version docker version docker info ## Execute Docker image docker run hello-world ## List Docker images docker image ls ## List Docker containers (running, all, all in quiet mode) docker container ls docker container ls --all docker container ls -aq 
La contenerización hace que CI / CD sea transparente. Por ejemplo:
  • las aplicaciones no tienen dependencias del sistema
  • las actualizaciones se pueden enviar a cualquier parte de una aplicación distribuida
  • La densidad de recursos se puede optimizar.
  • Con Docker, escalar su aplicación es una cuestión de generar nuevos ejecutables, no ejecutar hosts de VM pesados.

Construyamos una aplicación web Node.js usando Docker

Lo primero que hacemos es crear un package.jsonarchivo. Podemos hacer esto rápidamente simplemente ejecutando el siguiente comando:

npm init -y 

Esto crea el archivo de arriba con ciertos campos esenciales ya completados o en blanco.

Su archivo debería verse así:

{ "name": "app-name", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" } 

A continuación, instalamos express.js, que según el sitio web oficial, es un " framework web minimalista, rápido y sin supervisión para Node.js ".

Hacemos esto ejecutando el siguiente comando en una terminal:

npm install express --save 

El comando anterior agrega el express.jsmarco a nuestra aplicación, con el indicador --save actuando como una instrucción para que la aplicación lo use express.jscomo dependencia.

Ahora, vaya a su package.jsony cambie el "main": "index.js"par clave-valor a lo siguiente:

"main": "app.js" 

A continuación, cree un .gitignorearchivo con el siguiente comando:

touch .gitignore 

Luego agregue la siguiente línea:

node_modules/ 

Esto evita que la carpeta node_modules, que es esencial para el node.jsdesarrollo, sea rastreada git.

Ahora agregue el siguiente código al app.jsarchivo:

const express = require('express'); const app = express(); const PORT = 8080; const HOST = '0.0.0.0'; app.get('/', (req, res) => { res.send( ` 

Home

Docker is awesome!

Next Page ` ) }); app.get('/more', (req, res) => { res.send( `

Page Two

Node.js is pretty great too!!

Back Home ` ) }); app.listen(PORT, HOST); console.log(`Running on //${HOST}:${PORT}`);

Para que esto se ejecute en su máquina local, ejecute el siguiente comando en la carpeta de la aplicación:

npm start 

Encontrará la aplicación ejecutándose en //0.0.0.0:8080/

¡Increíble!

Congratulations

Felicidades por haber llegado tan lejos

En el Dockerverse

Ahora crea un Dockerfilecon el siguiente comando:

touch Dockerfile 

Luego agregue el siguiente código:

# An official Docker image for Node.js FROM node:10-alpine # Working directory for the containerised application WORKDIR /src/app # This copies significant package.json files to the current directory COPY package*.json ./ # Install essential Node.js dependencies RUN npm install COPY . . # Opens up this port on the Docker container EXPOSE 8080 # This starts the Docker application CMD [ "npm", "start" ] 

Los comentarios anteriores intentan explicar qué hace cada Dockerfilecomando.

Además, agregue un dockerignorearchivo para evitar la contenedorización de ciertos componentes de la aplicación.

Coloque esto dentro del dockerignorearchivo:

node_modules npm-debug.log Dockerfile* docker-compose* .dockerignore .git .gitignore README.md LICENSE 

Cómo implementar

El es el nombre que le asigna a su aplicación Docker, y es básicamente un indicador de versión para su imagen de Docker.

  • docker build -t image-name:tag .

Ejecute esto para acceder a su cuenta de Docker desde su terminal.

  • docker login

Cree un repositorio en Docker Hub.

Tag for upload to registry.

  • docker tag username/repository:tag

Upload the tagged image to the registry.

  • docker push username/repository:tag

Run the deployed Docker container on your local machine by connecting its PORTS. Target the exposed 8080 port, and assign it to port 10203 on your machine.

  • docker run -p 10203:8080 username/repository:tag

That's it! You have built and deployed a containerised Node.js web application.

All the code above can be found in this Github repository.

Originally posted here on blog.ninte.dev