Cuándo usar Docker-Compose y cuándo usar Docker-Swarm

82

Estoy tratando de comprender las diferencias o similitudes entre Docker-Compose y Docker-Swarm .

Al leer la documentación, he entendido que docker-compose proporciona un mecanismo para unir diferentes contenedores y trabajar en colaboración, como un solo servicio (supongo que está usando la misma funcionalidad que el comando --link utilizado para vincular dos contenedores)

Además, mi comprensión de docker-swarm es que le permite administrar un clúster de diferentes docker-hosts , cada uno de los cuales ejecuta varias instancias de contenedor de algunas imágenes de docker. Podríamos definir conexiones como redes superpuestas entre diferentes contenedores en el enjambre (incluso si se encuentran a través de dos docker-hosts en el enjambre) para conectarlos como una unidad.

Lo que estoy tratando de entender es si docker-swarm ha tenido éxito en el docker-compose y las redes superpuestas son la nueva forma (recomendada) de conectar contenedores.

¿O es que docker-compose sigue siendo una parte integral de toda la familia de docker y se espera y es aconsejable usarlo para conectar contenedores para trabajar en colaboración? Si es así, ¿Docker-compose funciona con contenedores en diferentes nodos en el enjambre?

¿O es que las redes superpuestas sirven para conectar contenedores a través de diferentes hosts en el enjambre y Docker-compose es para crear enlaces internos?

Además, también veo que se menciona en la documentación de la ventana acoplable que los enlaces ya no se recomiendan y que pronto serán obsoletos.

¿¿¿Estoy un poco confundido???

¡Muchas gracias!

Shabirmean
fuente
9
¿Ninguna de las respuestas responde a su pregunta? si es así, seleccione la casilla de verificación para aceptar uno de ellos como su respuesta.
JoeG

Respuestas:

102

Probablemente sea útil comenzar con algunas definiciones:

  • docker-compose : comando utilizado para configurar y administrar un grupo de contenedores relacionados. Es una interfaz de la misma API utilizada por la docker cli, por lo que puede reproducir su comportamiento con comandos como docker run.
  • docker-compose.yml : archivo de definición para un grupo de contenedores, utilizado por docker-compose y ahora también por el modo swarm.
  • Modo de enjambre : se utiliza para administrar un grupo de motores de ventana acoplable como una sola entidad y proporcionar orquestación (tratando constantemente de corregir cualquier diferencia entre el estado actual y el estado de destino).
  • servicio : uno o más contenedores para la misma imagen y configuración dentro del enjambre, múltiples contenedores proporcionan escalabilidad.
  • pila : uno o más servicios dentro de un enjambre, estos pueden definirse usando un DAB o un archivo docker-compose.yml.
  • red puente : red administrada por un solo motor de ventana acoplable donde varios contenedores pueden comunicarse entre sí. Puede tener varias redes administradas por un motor y los contenedores se pueden conectar a cero o más redes.
  • red superpuesta : similar a una red puente pero que abarca varios motores de ventana acoplable. Estos requieren un almacén de clave / valor para mantener su estado. El modo enjambre proporciona esto, pero si el modo enjambre está desactivado, también puede usar etcd, cónsul o guardián del zoológico.
  • enlaces : un método para conectar contenedores que es anterior a la red puenteada. Ya no se recomienda su uso.
  • enjambre clásico : un predecesor del modo enjambre integrado que se ejecuta como un contenedor, permite que varios motores aparezcan como uno, pero no proporciona orquestación ni incluye su propio almacén de k / v.

Para responder a las preguntas:

¿Docker-swarm ha tenido éxito en docker-compose y las redes de superposición son la nueva forma (recomendada) de conectar contenedores?

¿O es que docker-compose sigue siendo una parte integral de toda la familia de docker y se espera y es aconsejable usarlo para conectar contenedores para trabajar en colaboración? Si es así, ¿Docker-compose funciona con contenedores en diferentes nodos en el enjambre?

Proporcionan una funcionalidad diferente y seguirán cumpliendo un propósito. docker-compose no puede iniciar contenedores dentro del modo swarm, pero se puede usar una versión más reciente del archivo docker-compose.yml (versión 3) para definir una pila directamente en modo swarm sin usar docker-compose. docker-compose es necesario para administrar contenedores fuera del modo de enjambre, en un solo motor de docker o con enjambre clásico.

¿O es que las redes superpuestas sirven para conectar contenedores a través de diferentes hosts en el enjambre y Docker-compose es para crear enlaces internos?

Además, también veo que se menciona en la documentación de la ventana acoplable que los enlaces ya no se recomiendan y que pronto serán obsoletos.

docker-compose, que comienza con la versión 2 del archivo yml, conecta varios contenedores de forma predeterminada con una nueva red puenteada por proyecto (el proyecto tiene por defecto el nombre del directorio). Con el enjambre clásico, eso sería predeterminado en una red superpuesta usando una tienda k / v externa. Y con una pila de modo de enjambre, esta sería una red superpuesta.

El uso de redes acoplables es la forma preferida de que los contenedores se comuniquen entre sí. Desea una red por grupo de contenedores que desea aislar del resto de su entorno de Docker. docker-compose automatiza esta creación de red, pero también puede hacerlo desde la línea de comandos con docker networks create.

Los enlaces han sido reemplazados en gran medida por redes acoplables con descubrimiento de DNS incorporado. Cuando elimina enlaces de su docker-compose.yml, es posible que deba reemplazarlos con una depends_onsección para hacer cumplir el orden de inicio del contenedor. De lo contrario, hay muy pocos escenarios en los que la vinculación tenga sentido y todo el uso que he visto proviene de alguien que sigue documentación desactualizada.

BMitch
fuente
3
Esto es útil. ¿Podría definirlo DAB?
Matthew James Briggs
3
El DAB fue un formato de archivo experimental que nunca ganó terreno. Básicamente, ahora es un archivo docker-compose.yml v3. docs.docker.com/compose/bundles/#bundle-file-format
BMitch
22

componen o enjambre o enjambre redes superpuestas

Descubrirá que necesita usar todo lo anterior si está haciendo otra cosa que no sea una demostración en su computadora portátil, etc.

Deliberadamente separé las redes de superposición de enjambre y enjambre, porque no necesita usar ambas, pero no puede obtener una red de superposición sin tener un enjambre debajo de ella.

Redactar sirve para reunir varios contenedores. Ahora tiene sentido que estén relacionados entre sí, aunque puede que no lo estén. Pero supongamos un caso típico cuando los contenedores son para servicios que están relacionados entre sí, entonces querrá que se hablen entre sí de alguna manera, pero controlen cómo se comunican entre sí mediante redes. Por ejemplo, tome una aplicación de 3 niveles que tenga un servidor web, un servidor de aplicaciones y una base de datos. Supongamos que los tres componentes están acoplados y está utilizando componer para mostrarlos juntos en lugar de ejecutarlos.docker run..tres veces con diferentes parámetros, etc. Los tres aparecerían, pero querría controlar cómo se conectan entre sí. Desea que el servidor web pueda hablar con el servidor de aplicaciones, pero no directamente con la base de datos. Y querrá que el servidor de aplicaciones hable (haga ping) al contenedor del servidor db y también al servidor web. Todas las conexiones son bidireccionales, pero están restringidas solo a los servicios con los que desea poder comunicarse entre sí. Para tal arreglo, normalmente configuraría 2 redes, digamos frontendy backend. Los contenedores web y de aplicaciones están conectados a la red frontend. La aplicación y los contenedores de base de datos están conectados a la red de backend. Debido a que no existe una red común entre los contenedores db y web, no pueden tocarse (hacer ping) entre sí, que es su intención.

Ahora, si desea que estos 3 servicios puedan ejecutarse en su clúster de cientos de máquinas, y también desea escalar entre ellos, necesitaría una red que abarque varios hosts. Ahí es donde entra en juego la superposición de redes (en enjambre). La superposición de redes no es más que una creación de redes de múltiples hosts sobre la tecnología VxLAN. No es necesario que conozca VxLAN, excepto que es una topología de red estándar que se admite en casi todas las infraestructuras de redes modernas.

Espero que aclare.

Editar: ¡No vi que ya recibieras una respuesta!

Anoop
fuente
1
Gracias @Anoop. Así que supongo que es correcto si digo redactar y enjambre, ambos usan una descripción de servicio basada en .yaml para iniciar servicios y ambos usan redes definidas por el usuario creadas para conectar estos servicios. La única diferencia es que compose es para un conjunto de contenedores que se ejecutan en un solo host-docker y swarm es para una plataforma de múltiples hosts.
Shabirmean
Sí, pero puede mezclar y combinar, es decir, puede usar el mismo archivo de redacción para apuntar a un clúster de enjambre en lugar de un solo host acoplable. Es extremadamente flexible de esa manera.
Anoop
8

Creo que tienes la mayor parte del conocimiento correcto en cuanto a lo que es cada uno, pero se requieren algunos ajustes.

Tiene razón en docker-compose es abrir aplicaciones de varios contenedores. Antes solías hacer docker run ..para comenzar cada contenedor. Por lo general, las aplicaciones modernas que adoptan el paradigma de los microservicios pueden estar compuestas por docenas de servicios y su uso se docker run ..volverá muy tedioso muy pronto. Por lo tanto, docker-compose le permite expresar todos los contenedores y sus propiedades y cómo se conectan entre sí como un archivo yamlo jsonpara que pueda administrarlo de una manera más fácil.

Entonces, docker-compose es la parte de orquestación de contenedores en el ecosistema de docker.

Los enlaces son diferentes, son solo una parte de los docker runcomandos de docker-compose o y están obsoletos a favor software defined networksde los cuales overlay networksson solo uno de ellos.

Swarm es el componente de programación en Docker. Qué es la programación: no es más que averiguar dónde "colocar" sus contenedores en su grupo de hosts de Docker. Puede tener un clúster de cientos de servidores y puede tener cientos de contenedores, cada uno de los cuales encapsula un servicio para una docena de aplicaciones diferentes. Ahora, ¿cómo deberían distribuirse estos contenedores en su clúster de cientos de servidores, si algunos contenedores deben colocarse solo en ciertos hosts porque satisfacen un criterio particular o tal vez deberían estar más cerca (o no) de otros contenedores que de alguna manera están relacionados ... todos estos son parte del componente de programación que realiza Docker Swarm.

Le sugiero que consulte la documentación de introducción en docker.com aquí: https://docs.docker.com/engine/getstarted-voting-app/

Anoop
fuente
Muchas gracias. Yo había hecho ese tutorial. Estoy tratando de averiguar si existe una recomendación específica por parte de los propios desarrolladores de la ventana acoplable sobre lo que se debe usar para conectar contenedores que están estrechamente relacionados: componer o enjambre de redes superpuestas . El dilema que tengo es que la idea de conectar contenedores a través de una red no me parece lo mismo que conectarlos mediante algo como componer (¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿O SON LO MISMO ??? "). ¿Es que componer como el enlace de contenedores es más seguro que la conexión de estilo de red superpuesta?
Shabirmean