No entiendo ni siquiera la diferencia básica entre los servicios en el título. ¿Estos servicios solo brindan software para ayudarlo a configurar/organizar/administrar sus VM, o también brindan infraestructura física para que se ejecuten sus VM? En otras palabras, ¿son solo interfaces convenientes entre los desarrolladores y AWS, Rackspace y Azure?
No exactamente.
Chef/Puppet son "lo mismo", son gestión de configuración. Si bien puede usarlos para administrar máquinas virtuales o nubes públicas/privadas, la mayoría de las personas no tienden a usarlos de esa manera. Son la gestión de la configuración. Por lo general, entran en juego después de que se enciende una máquina virtual para ponerlos en el estado deseado. Es decir, qué software se necesita en la máquina virtual, qué usuarios se deben agregar, qué configuración se necesita, etc. Por lo tanto, tiende a usarse para escalar infraestructura.
Vagrant, aunque también se puede usar para administrar máquinas virtuales y nubes públicas/privadas, generalmente solo se usa para entornos únicos. Proporciona un archivo cohesivo para crear una máquina virtual. Es similar a chef/títere de esa manera, pero no tiende a usarse a escala.
Docker es una bestia aparte. Tiene varios componentes, pero principalmente se usa para "empaquetar" (Nota: hace mucho más que eso, pero esa es una respuesta ELI5) software y requiere un sistema host (o infraestructura) para ejecutarse. Agrega un poco de seguridad a las aplicaciones, pero en su mayoría proporciona un "SO" consistente para que se ejecute una aplicación.
En la práctica, todos estos pueden utilizarse en un entorno. Aquí hay un ejemplo:
Digamos que tienes la aplicación FunTime. Tiene ocho desarrolladores que contribuyen a esto, y FunTime está diseñado para ejecutarse en una infraestructura escalable en AWS. Está diseñado para tener un front-end (FunTime-Front) y un back-end (FunTime-API) y requiere postgres. 4 desarrolladores trabajan en el front-end, cuatro desarrolladores trabajan en el back-end.
Yo haría lo siguiente (hay muchas maneras de despellejar a este gato, pero este es un ejemplo):
Usaría Docker para FunTime-Front y FunTime-API. Usaría Vagrant para configurar un entorno de desarrollo para los desarrolladores (para que puedan modificar varios componentes). Vagrant: iniciaría la VM localmente (o en una nube si es necesario), instalaría la ventana acoplable, desplegaría las imágenes de la ventana acoplable para FunTime-Front y FunTime-API, instalaría postgres y completaría postgres con datos ficticios, configuraría puertos de red para los diversos componentes
Ahora el desarrollador tiene la pila FunTime completa en su máquina local y no tiene que perder el tiempo configurando nada por sí mismo: simplemente puede escribir "vagrant up".
En el lado de la infraestructura, usaría chef (o marioneta) para configurar los entornos: producción, etapa y desarrollo (o lo que sea necesario), luego chef instalaría docker en los servidores de "aplicación", "postgres" en los servidores de postgres , aplicar configuraciones de seguridad, etc. De esta forma todos los servidores relacionados son iguales. Si tuviera que actualizar un servidor o agregar un parche, sería trivial con la gestión de la configuración.
En todos los casos se utilizaría Docker para que no haya diferencia de aplicación entre entornos, incluida la estación de trabajo de los desarrolladores.
Esto aseguraría que no escuche la excusa "¡Bueno, funciona en mi máquina local!" muy a menudo. Además, si hay una implementación fallida, revertir la aplicación sería MUY fácil con Docker.
Espero que eso proporcione un poco más de información sobre cómo podrían usarse.
Intentaré lanzar como en la conversación diaria,
Vagrant : para hacer que los entornos de desarrollo funcionen en la máquina del nuevo desarrollador en el mismo proyecto, idealmente en unos pocos minutos. Por lo general, se usa sobre virtualbox, pero se puede usar con diferentes proveedores de máquinas.
Docker : aquí no hay nada virtual, simplemente imagine un proceso real y las bibliotecas requeridas se guardan en un espacio aislado y luego se envían al servidor como un archivo. El uso de recursos se decide con el comando de ejecución.
Chef/Puppet : se puede usar para automatizar cualquier cosa que escriba en bash para configurar su proyecto (excepto las teclas de aplicación, etc.). Puede usarlos para crear imágenes acoplables o entornos vagabundos, por lo que no necesariamente tienen que existir en un servidor de producción físico. Véase Empacador .
AWS/Rackspace/Azure son proveedores de IaaS. En lenguaje sencillo, activan los servidores a medida que lo exige y le brindan acceso ssh. Por supuesto, proporcionan más que eso.
Adivina qué, se pueden usar uno dentro del otro.
Esas herramientas parecían facilitar la implementación, pero como regla general, no las use todas juntas a menos que ahorre tiempo para usted y su equipo. A veces, es mucho más fácil hacer girar un EC2 a mano y scp su proyecto con configuración manual. Puede automatizar más tarde.
La optimización prematura es la raíz de todos los males - Sir Tony Hoare
Chef : Chef es una plataforma de automatización para transformar su infraestructura en código. Por lo general, se denomina software de gestión de la configuración. Puede definir el estado con diferentes parámetros como sus archivos de configuración, s/w, herramientas, tipos de acceso y tipos de recursos, etc. Además, puede configurar diferentes máquinas con diferentes funcionalidades según sus necesidades.
Puppet : Puppet es una herramienta que le permite abstraer conceptos específicos de la máquina de destino y hacer que el proceso de configuración sea más independiente del sistema operativo. Permite instalar un paquete o ejecutar un servicio en segundo plano al inicio de forma independiente. Defina un comando, los paquetes que deben instalarse, las dependencias de los pasos, el contenido del archivo y otras cosas que necesitaría para que la máquina funcione sin problemas.
Vagrant : Vagrant es un proyecto que ayuda a generar máquinas virtuales. Comenzó como una línea de comando de VirtualBox, algo similar a Gemfile para VM. Puede elegir la imagen base para comenzar, red, IP, carpetas compartidas y poner todo en un archivo que cualquiera puede reutilizar para generar la misma máquina configurada. Vagrant tiene diferentes extensiones, opciones de aprovisionamiento y proveedores de VM. Puede ejecutar VirtualBox, VMware y es lo suficientemente extensible como para poder crear instancias en EC2.
Docker : Docker, permite empaquetar una aplicación con todas sus dependencias en una unidad estandarizada de desarrollo de software. Por lo tanto, reduce la fricción entre el desarrollador, el control de calidad y las pruebas. Cambia dinámicamente su aplicación, agregando nuevas capacidades todos los días, ampliando los servicios para cambiar rápidamente las áreas problemáticas. Docker se está colocando en un lugar emocionante como la interfaz para PaaS, ya sea redes, descubrimiento y descubrimiento de servicios con aplicaciones que no tienen que preocuparse por la infraestructura subyacente. Sí, todavía hay problemas con la ventana acoplable en producción (aunque todas las empresas importantes ya migraron su infraestructura a la ventana acoplable), pero, con suerte, veremos las soluciones a esos problemas, ya que el equipo de la ventana acoplable y los colaboradores trabajan arduamente en esos problemas. Como controlador Docker Volume permite que las soluciones de administración de datos de contenedores de terceros proporcionen volúmenes de datos para contenedores que operan con datos, como bases de datos, almacenes de clave-valor y otras aplicaciones con estado. Como puede ver, uno, rexray, como complemento de volumen y proporciona una funcionalidad de almacenamiento avanzada. emccode/rexray Finalmente estamos empezando a ponernos de acuerdo en algo más que imágenes y tiempo de ejecución.