Primera versión candidata de Docker 1.12 se anunció en hace dos semanas. Varias novedades
previsto para esta versión.
Este blog mostrará cómo crear un Aplicación distribuida Bundle de Docker Compose y desplegarlo como Docker Stack en Enjambre Docker Modo. Muchas gracias a @friism por ayudarme a entender estos conceptos.
Veamos primero las características:
- Orquestación integrada: Una aplicación típica se define mediante un archivo Docker Compose. Esta definición consta de varios contenedores y se despliega en varios hosts. Esto evita el punto único de fallo (SPOF) y mantiene su aplicación
resistentes. Múltiples marcos de orquestación como Docker Swarm, Kubernetes y Mesos permiten orquestar estas aplicaciones. Sin embargo es una característica tan importante de la aplicación, Docker Engine ahora tiene orquestación incorporada.
Más detalles sobre este tema en un blog posterior. - Servicio: Un servicio replicado, distribuido y con equilibrio de carga puede crearse fácilmente utilizando
docker service create
comando. Se proporciona un "estado deseado" de la aplicación, como ejecutar 3 contenedores de Couchbase, y el comando
El motor Docker de autorreparación garantiza que muchos contenedores se ejecuten en el clúster. Si un contenedor se cae, se inicia otro. Si un nodo se cae, los contenedores en ese nodo se inician en un nodo diferente. Más información en
blog. - Seguridad de configuración cero: Docker 1.12 viene con TLS autenticado mutuamente, proporcionando autenticación, autorización y cifrado a las comunicaciones de cada nodo que participa en el enjambre, fuera de la caja. Más información en
un blog posterior. - Pila Docker y paquete de aplicaciones distribuidas: Distributed Application Bundle, o DAB, es un formato de imagen distribuible multiservicios. Siga leyendo para obtener más detalles.
Hasta ahora, puede tomar una Dockerfile
y crear una imagen a partir de ella utilizando la función construcción docker
comando. Un contenedor puede iniciarse utilizando el comando docker run
comando. Se pueden iniciar fácilmente varios contenedores dando
ese comando varias veces. O también puedes usar el archivo Docker Compose y escalar tus contenedores usando el comando docker-compose scale
mando.
La imagen es un formato portátil para un único contenedor. Paquete de aplicaciones distribuidas, o DAB, es un nuevo concepto introducido en Docker 1.12, es un formato portátil para múltiples contenedores. Cada bundle puede desplegarse como
a Pila en tiempo de ejecución.
Más información sobre DAB en docker.com/dab. Para simplificar, se puede establecer una analogía:
Dockerfile -> Imagen -> Contenedor
Docker Compose -> Paquete de aplicaciones distribuidas -> Docker Stack
Utilicemos un archivo Docker Compose, creemos un DAB a partir de él y despleguémoslo como Docker Stack.
Es importante señalar que se trata de una función experimental en 1.12-RC2.
Creación de un paquete de aplicaciones distribuidas desde Docker Compose
Docker Compose CLI añade un nuevo paquete
mando. Encontrará más información al respecto:
1 2 3 4 5 6 7 8 9 10 11 |
docker-componer paquete --ayuda Genere a Docker paquete de el Componga archivo. Local imágenes se sea empujado a a Docker registro, y remoto imágenes se sea tirado a buscar un imagen resumen. Utilización: paquete [opciones] Opciones: -o, --salida SENDERO Ruta a escriba a el paquete archivo a. Por defecto a ".dsb". |
Ahora, tomemos una definición de Docker Compose y creemos un DAB a partir de ella. Aquí está nuestra definición Docker Compose:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
versión: "2" servicios: db: nombre_contenedor: "db" imagen: arungupta/oreilly-couchbase:última puertos: - 8091:8091 - 8092:8092 - 8093:8093 - 11210:11210 web: imagen: arungupta/oreilly-mosca salvaje:última depende_de: - db medio ambiente: - COUCHBASE_URI=db puertos: - 8080:8080 |
Este archivo Compose inicia un servidor WildFly y un servidor Couchbase. En el servidor WildFly se predespliega una aplicación Java EE que se conecta al servidor Couchbase y permite realizar operaciones CRUD utilizando la API REST. La fuente de este archivo está en:
github.com/arun-gupta/oreilly-docker-book/blob/master/hello-javaee/docker-compose.yml. Genera un paquete de aplicaciones con él:
1 2 3 4 |
docker-componer paquete ADVERTENCIA: Sin soporte clave depende_de en servicios.web - ignorando ADVERTENCIA: Sin soporte clave 'nombre_contenedor' en servicios.db - ignorando Escribió paquete a hellojavaee.dsb |
depende_de
sólo crea dependencia entre dos servicios y hace que se inicien en un orden específico. Esto sólo asegura que el contenedor Docker se inicie, pero la aplicación dentro del contenedor puede tardar más en iniciarse. Así que este atributo sólo
resuelve parcialmente el problema. nombre_contenedor
da un nombre específico al contenedor. Depender de un nombre específico de contenedor es un acoplamiento estrecho y no permite escalar el contenedor. Así que ambas advertencias pueden ser ignoradas,
por ahora. Este comando genera un archivo utilizando el nombre del proyecto Compose, que es el nombre del directorio. Así que en nuestro caso, hellojavaee.dsb
se genera un archivo. Esta extensión de archivo ha sido renombrada a .dab
en RC3. El
paquete de aplicaciones:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
{ "servicios": { "db": { "Imagen": "arungupta/oreilly-couchbase@sha256:f150fcb9fca5392075c96f1baffc7f893858ba763f3c05cf0908ef2613cbf34c", "Redes: [ "por defecto" ], "Puertos": [ { "Puerto": 8091, "Protocolo": "tcp" }, { "Puerto": 8092, "Protocolo": "tcp" }, { "Puerto": 8093, "Protocolo": "tcp" }, { "Puerto": 11210, "Protocolo": "tcp" } ] }, "web": { "Env": [ "COUCHBASE_URI=db" ], "Imagen": "arungupta/oreilly-wildfly@sha256:d567ade7bb82ba8f15a85df0c6d692d85c15ec5a78d8826dfba92756babcb914", "Redes: [ "por defecto" ], "Puertos": [ { "Puerto": 8080, "Protocolo": "tcp" } ] } }, "version": "0.1" } |
Este archivo proporciona una descripción completa de los servicios incluidos en la aplicación. No estoy del todo seguro de que Distributed Application Bundle sea el nombre más apropiado, discútalo en #24250. En
Sería genial si otros formatos de contenedores, como Rkt, o incluso VMs pudieran ser soportados aquí. Pero por ahora, Docker es el único formato compatible.
Inicializar el modo enjambre en Docker
Como se mencionó anteriormente, el "estado deseado" ahora es mantenido por Docker Swarm. Y esto ya está integrado en Docker Engine. Los conceptos de Docker Swarm también han evolucionado y pueden leerse en Conceptos clave del modo enjambre. A
blog más detallado sobre esto vendrá más adelante. Pero para este blog, un nuevo comando enjambre docker
se añade ahora:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
docker enjambre --ayuda Utilización: docker enjambre COMANDO Gestione Docker Enjambre Opciones: --ayuda Imprimir uso Comandos: init Inicializar a Enjambre únase a Únete a a Enjambre como a nodo y/o director actualización Actualización el Enjambre dejar Deja a Enjambre inspeccionar Inspeccione el Enjambre Ejecutar 'docker swarm COMMAND --help' para más información en a comando. |
Inicialice un nodo Swarm (como gestor) en el motor Docker:
1 2 |
docker enjambre init Enjambre inicializado: actual nodo (ek9p1k8r8ox7iiua5c247skci) es ahora a director. |
Más información sobre este nodo en docker node inspect
autocomando.
La salida detallada es verbosa pero la sección relevante es:
1 2 3 4 5 |
"Spec": { "Rol": "manager", "Afiliación": "aceptado", "Disponibilidad": "activo" }, |
La salida muestra que el nodo es un gestor. Para un clúster de un solo nodo, este nodo también actuará como trabajador.
Se pueden obtener más detalles sobre el clúster utilizando la función docker swarm inspect
mando.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
docker enjambre inspeccionar [ { "ID": "1rcvu7m9mv2c8hiaijr7an9zk", "Versión": { "Índice": 1895 }, "CreadoEn": "2016-07-01T23:52:38.074748177Z", "UpdatedAt": "2016-07-02T04:54:32.79093117Z", "Spec": { "Nombre": "por defecto", "Política de aceptación: { "Políticas": [ { "Rol": "trabajador", "Autoaceptar": verdadero }, { "Rol": "manager", "Autoaceptar": falso } ] }, "Orquestación": { "TaskHistoryRetentionLimit": 10 }, "Balsa": { "SnapshotInterval": 10000, "LogEntriesForSlowFollowers": 500, "HeartbeatTick": 1, "ElectionTick": 3 }, "Despachador": { "HeartbeatPeriod": 5000000000 }, "CAConfig": { "NodeCertExpiry": 7776000000000000 } } } ] |
Política de aceptación
muestra que otros trabajador
Los nodos pueden unirse a este clúster, pero un administrador requiere una aprobación explícita.
Despliegue de una pila Docker
Crear una pila utilizando docker deploy
mando:
1 2 3 4 5 |
docker despliegue -f hellojavaee.dsb hellojavaee Cargando paquete de hellojavaee.dsb Creación de red hellojavaee_default Creación de servicio hellojavaee_db Creación de servicio hellojavaee_web |
El uso de los comandos puede simplificarse, como se explica en #24249. Consulte la lista de servicios:
1 2 3 4 |
docker servicio ls ID NOMBRE RÉPLICAS IMAGEN COMANDO 2g8kmrimztes hellojavaee_web 1/1 arungupta/oreilly-mosca salvaje@sha256:d567ade7bb82ba8f15a85df0c6d692d85c15ec5a78d8826dfba92756babcb914 46xhlb15cc60 hellojavaee_db 1/1 arungupta/oreilly-couchbase@sha256:f150fcb9fca5392075c96f1baffc7f893858ba763f3c05cf0908ef2613cbf34c |
La salida muestra que dos servicios, WildFly y Couchbase, se están ejecutando. Servicios también es un nuevo concepto introducido en Docker 1.12. Es lo que le da el
"estado deseado" y Docker Engine trabaja para dártelo. docker ps
muestra la lista de contenedores en ejecución:
1 2 3 |
CONTENEDOR ID IMAGEN COMANDO CREADO ESTADO PUERTOS NOMBRES 622756277f40 arungupta/oreilly-couchbase@sha256:f150fcb9fca5392075c96f1baffc7f893858ba763f3c05cf0908ef2613cbf34c "/entrypoint.sh /opt/" 3 segundos hace Arriba 1 segundos 8091-8093/tcp, 11207/tcp, 11210-11211/tcp, 18091-18092/tcp hellojavaee_db.1.19enwdt6i5m853m5675tx3z29 abf8703ed713 arungupta/oreilly-mosca salvaje@sha256:d567ade7bb82ba8f15a85df0c6d692d85c15ec5a78d8826dfba92756babcb914 "/opt/jboss/wildfly/b" 3 segundos hace Arriba 1 segundos 8080/tcp hellojavaee_web.1.70piloz6j4zt06co8htzisgyl |
El contenedor WildFly se inicia antes de que el contenedor Couchbase esté en funcionamiento. Esto significa que la aplicación Java EE intenta conectarse al servidor Couchbase y falla. Así que la aplicación nunca arranca con éxito.
Servicio Docker autorreparable
Docker Service mantiene el "estado deseado" de una aplicación. En nuestro caso, el estado deseado es asegurar que un, y sólo un, contenedor para el servicio se está ejecutando. Si eliminamos el contenedor, no el servicio, entonces el servicio se
arrancar automáticamente el contenedor de nuevo. Retire el contenedor como:
1 |
docker rm -f abf8703ed713 |
Nota, tienes que dar -f
porque el contenedor ya se está ejecutando. Los mecanismos de auto-reparación de Docker 1.12 entran en acción y reinician automáticamente el contenedor. Ahora si vuelves a listar los contenedores:
1 2 3 |
CONTENEDOR ID IMAGEN COMANDO CREADO ESTADO PUERTOS NOMBRES db483ac27e41 arungupta/oreilly-mosca salvaje@sha256:d567ade7bb82ba8f15a85df0c6d692d85c15ec5a78d8826dfba92756babcb914 "/opt/jboss/wildfly/b" 1 segundos hace Arriba Menos que a segundo 8080/tcp hellojavaee_web.1.ddvwdmojjysf46d4n3x4g8uv4 622756277f40 arungupta/oreilly-couchbase@sha256:f150fcb9fca5392075c96f1baffc7f893858ba763f3c05cf0908ef2613cbf34c "/entrypoint.sh /opt/" 26 segundos hace Arriba 25 segundos 8091-8093/tcp, 11207/tcp, 11210-11211/tcp, 18091-18092/tcp hellojavaee_db.1.19enwdt6i5m853m5675tx3z29 |
Esto muestra que se ha iniciado un nuevo contenedor. Inspeccione el servicio WildFly:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
docker servicio inspeccionar hellojavaee_web [ { "ID": "54otfi6dc9bis7z6gc6ubynwc", "Versión": { "Índice": 328 }, "CreadoEn": "2016-07-02T01:36:35.735767569Z", "UpdatedAt": "2016-07-02T01:36:35.739240775Z", "Spec": { "Nombre": "hellojavaee_web", "Etiquetas": { "com.docker.stack.namespace": "hellojavaee" }, "TaskTemplate": { "ContainerSpec": { "Imagen": "arungupta/oreilly-wildfly@sha256:d567ade7bb82ba8f15a85df0c6d692d85c15ec5a78d8826dfba92756babcb914", "Env": [ "COUCHBASE_URI=db" ] } }, "Modo": { "Replicado": { "Réplicas": 1 } }, "Redes: [ { "Objetivo": "epw57lz7txtfchmbf6u0cimis", "Alias": [ "web" ] } ], "EndpointSpec": { "Modo": "vip", "Puertos": [ { "Protocolo": "tcp", "TargetPort": 8080 } ] } }, "Punto final": { "Spec": {}, "Puertos": [ { "Protocolo": "tcp", "TargetPort": 8080, "PuertoPublicado": 30004 } ], "VirtualIPs": [ { "NetworkID": "9lpz688ir3pzexubkcb828ikg", "Dirección": "10.255.0.5/16" }, { "NetworkID": "epw57lz7txtfchmbf6u0cimis", "Dirección": "10.0.0.4/24" } ] } } ] |
Swarm asigna un puerto aleatorio al servicio, o éste puede actualizarse manualmente utilizando actualización del servicio docker
comando. En nuestro caso, el puerto 8080
del contenedor se asigna a 30004
puerto en el host.
Verificar la aplicación
Compruebe que la aplicación se ha desplegado correctamente:
1 2 |
rizo http://localhost:30004/libros/recursos/libro [{"libros":0}] |
Añade un nuevo libro a la aplicación:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
rizo -v > -H "Content-Type: application/json" > -X POST -d '{ > "isbn": "978-1-4919-1889-0", > "name": "Minecraft Modding with Forge", > "coste": 29.99 > }' > http://localhost:30004/libros/recursos/libro * Prueba ::1... * Conectado a localhost (::1) puerto 30004 (#0) > POST /libros/recursos/Libro HTTP/1.1 > Anfitrión: localhost:30004 > Usuario-Agente: rizo/7.43.0 > Acepte: */* > Contenido-Tipo: aplicación/json > Contenido-Longitud: 92 > * cargar completamente enviado fuera de: 92 fuera de 92 bytes < HTTP/1.1 200 OK < Conexión: guarda-vivo < X-Powered-Por: Resaca/1 < Servidor: WildFly/10 < Contenido-Tipo: aplicación/octeto-flujo < Contenido-Longitud: 88 < Fecha: Sáb, 02 Julio 2016 01:39:49 GMT < * Conexión #0 a host localhost dejado intacto {"nombre":"Minecraft Mhttp://localhost:30004/books/resources/book-1-4919-1889-0"} |
Vuelve a verificar los libros:
1 2 |
rizo http://localhost:30004/libros/recursos/libro [{"libros":{"nombre":"Modificación de Minecraft con Forge","coste":29.99,"id":"1","isbn":"978-1-4919-1889-0"}}, {"libros":1}] |
Más información sobre esta aplicación Java EE en github.com/arun-gupta/oreilly-docker-book/tree/master/hello-javaee.
Este blog muestra cómo crear un paquete de aplicaciones distribuidas desde Docker Compose y desplegarlo como Docker Stack en modo Docker Swarm.
Referencias de servicios y pilas Docker
- Crear servicio Docker
- Libro GRATUITO de O'Reilly: Docker para desarrolladores Java
- Couchbase en contenedores
- Portal para desarrolladores de Couchbase
- Haga preguntas sobre @couchbasedev o Stackoverflow