¿Con qué frecuencia tuvo que configurar entornos de servidor para implementar su aplicación (por ejemplo, un sitio web)? Seguramente más a menudo de lo que me gustaría.
En el mejor de los casos, tenía un script que hacía todo esto automáticamente. En el peor de los casos, podría verse así:
- instalar la base de datos D versión xxx
- instalar el servidor web N versión xx, etc.
La gestión ambiental configurada de esta manera se vuelve muy intensiva en recursos con el tiempo. Cualquier cambio, incluso menor en la configuración significa al menos:
- que cada desarrollador debe estar al tanto de estos cambios
- todos estos cambios deben agregarse de manera segura al entorno de producción
Es difícil rastrear tales cambios y administrarlos sin herramientas especiales. De todos modos, hay problemas con la configuración de las dependencias del entorno. A medida que avanza el desarrollo, más difícil resulta encontrar y solucionar estos problemas.
Arriba, describí lo que se llama bloqueo de proveedores. Para el desarrollo de aplicaciones, en particular de tipo servidor, este fenómeno se convierte en un gran problema. En este artículo, consideraremos una de las posibles soluciones:
Docker . Aprenderá a crear, implementar y ejecutar una aplicación basada en ella.
/ Descargo de responsabilidad: / Esta no es una revisión del Docker. Al final de este artículo hay una lista de literatura útil que describe cómo trabajar mejor con Docker. Este es el primer punto de entrada para los desarrolladores que planean implementar aplicaciones node.js utilizando contenedores Docker.
Mientras desarrollaba
uno de mis proyectos , me enfrenté a la falta de artículos detallados, lo que dio lugar a un número considerable de bicicletas. Esta publicación llega un poco tarde tratando de corregir la falta de información sobre el tema.
¿Qué es y con qué come?
En palabras simples, Docker es una abstracción de contenedores LXC. Esto significa que los procesos iniciados con Docker solo se verán a sí mismos y a sus descendientes. Dichos procesos se denominan contenedores Docker.
Para poder crear algún tipo de abstracción basada en dichos contenedores, existe una imagen en Docker (/ docker image /). Según la imagen de Docker, puede configurar y crear contenedores.
Hay miles de imágenes Docker listas para usar con bases de datos preinstaladas, servidores web y otros elementos importantes. Otra ventaja de Docker es que es una herramienta muy económica para el consumo de memoria, ya que utiliza solo los recursos que necesita.
Acércate
No nos detendremos en la
instalación durante mucho tiempo. El proceso en los últimos lanzamientos se ha simplificado a unos pocos clics / equipos.
En este artículo, analizaremos la implementación de una aplicación Docker utilizando el ejemplo de una aplicación Node.js del lado del servidor. Aquí está su código fuente primitivo:
// index const http = require('http'); const server = http.createServer(function(req, res) { res.write('hello world from Docker'); res.end(); }); server.listen(3000, function() { console.log('server in docker container is started on port : 3000'); });
Tenemos al menos dos formas de empaquetar una aplicación en un contenedor Docker:
- crear y ejecutar un contenedor desde una imagen existente usando la herramienta de interfaz de línea de comandos;
- cree su propia imagen basada en la muestra terminada.
El segundo método se usa con más frecuencia.
Para comenzar, descargue la imagen oficial de node.js:
docker pull node
El comando docker pull descarga una imagen Docker. Después de eso, puede ejecutar el comando docker run. Esto creará y ejecutará el contenedor basado en la imagen descargada.
docker run -it -d --rm -v "$PWD":/app -w=/app -p 80:3000 node node index.js
Este comando iniciará el archivo index.js, asignará 3000 puertos a 80 y mostrará la identificación del contenedor creado. Ya mejor! Pero en una CLI no llegarás lejos. Creemos un Dockerfile para nuestro servidor.
FROM node WORKDIR /app RUN cp . /app CMD ["node", "index.js"]
Este Dockerfile describe la imagen de la que se hereda la versión actual, así como el directorio en el que los comandos del contenedor y el comando del archivo de copia comenzarán desde el directorio en el que se inicia el ensamblaje de la imagen. La última línea indica qué comando se ejecutará en el contenedor creado.
A continuación, necesitamos construir una imagen a partir de este Dockerfile que implementaremos:
docker build -t username / helloworld-with-docker: 0.1.0 . Este comando crea una nueva imagen, la marca con
username / helloworld-with-docker y crea una etiqueta 0.1.0.
Nuestro contenedor está listo. Podemos ejecutarlo con el comando docker run. Por lo tanto, resolvemos el problema de bloqueo del proveedor. El lanzamiento de la aplicación ya no depende del entorno. El código se entrega junto con la imagen de Docker. Estos dos criterios nos permiten implementar la aplicación en cualquier lugar donde podamos ejecutar Docker.
Implementar
El primer 99% no es tan terrible como el 99% restante.
Después de haber completado todas las instrucciones anteriores, el proceso de implementación en sí se convierte en una cuestión de tecnología y su entorno de desarrollo. Consideraremos 2 opciones para implementar Docker:
- despliegue manual de la imagen de Docker;
- despliegue utilizando Travis-CI.
En cada caso, consideraremos entregar la imagen a un entorno independiente, por ejemplo, el servidor de preparación de su producto.
Despliegue manual
Esta opción es buena si no tiene ningún entorno de integración continua. Primero debe cargar la imagen de Docker en una ubicación accesible por el servidor de ensayo. En nuestro caso, será un DockerHub. Para cada usuario, proporciona de forma gratuita un repositorio de imágenes privadas y un número ilimitado de repositorios públicos.
Inicie sesión para acceder a nuestro DockerHub:
docker login -e username@gmail.com -u username -p userpass
Cargamos nuestra imagen allí:
docker push username / helloworld-with-docker: 0.1.0.A continuación, vaya al servidor de ensayo (le recuerdo que Docker ya debe estar preinstalado en él).
Para implementar nuestra aplicación en el servidor, necesitamos ejecutar solo un comando:
docker run -d --rm -p 80:3000 username/helloworld-with-docker:0.1.0.
¡Y eso es todo! Consulte el registro local de imágenes. Si no encuentra el resultado que desea, ingrese
username / helloworld-with-docker para verificar el registro de DockerHub. Se puede encontrar una imagen con este nombre en el registro, ya que ya la hemos subido allí. Docker lo descarga, crea un contenedor sobre la base y lanza su aplicación en él.
Ahora, cada vez que necesite actualizar la versión de su aplicación, puede presionar con una nueva etiqueta y simplemente reiniciar el contenedor en el servidor cada vez.
PD: Este método no se recomienda si es posible usar Travis-CI.
Implementar con Travis-CI
Primero, agregue los datos de DockerHub a Travis-CI. Se almacenarán en variables de entorno.
travis encrypt DOCKER_EMAIL=email@gmail.com travis encrypt DOCKER_USER=username travis encrypt DOCKER_PASS=password
Luego agregamos las claves recibidas al archivo .travis.yml. También agregaremos un comentario a cada clave para distinguirlas en el futuro.
env: global: - secure: "UkF2CHX0lUZ...VI/LE=" # DOCKER_EMAIL - secure: "Z3fdBNPt5hR...VI/LE=" # DOCKER_USER - secure: "F4XbD6WybHC...VI/LE=" # DOCKER_PASS
A continuación, debemos iniciar sesión y descargar la imagen:
after_success: - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS - docker build -f Dockerfile -t username/hello-world-with-travis. - docker tag username/hello-world-with-travis 0.1.0 - docker push username/hello-world-with-travis
Además, la entrega de imágenes se puede iniciar desde Travis-CI de varias maneras:
- manualmente
- a través de conexión ssh;
- servicios de implementación en línea (Deploy Bot, deployhq);
- AWS CLI;
- Kubernates;
- Herramientas para la implementación de Docker.
Resumen
En este artículo, examinamos la preparación y el despliegue de Docker usando un servidor simple node.js como ejemplo de dos maneras: automática y automatizada usando Travis-CI. Espero que este artículo te haya beneficiado.