Implementar nuevas versiones de una image instantáneamente

Me gustaría tener 3 versiones de mi contenedor ejecutándose en cualquier momento (en la misma máquina). Algo como esto:

  • versión v7 (etapa)
  • versión v6 (en vivo)
  • versión v5 (viejo)

entonces me gustaría asignar esto a 3 urls:

  • v7.example.com
  • v6.example.com
  • v5.example.com

Y también, una cuarta url, que se refiere a la versión actual (o pnetworkingeterminada):

www.example.com (que se asigna a http: // v6 .mydomain.com)

Presumiblemente, podría tomar algún paso de configuration que cambiaría la versión "pnetworkingeterminada" de v6 a v7. Ese paso debería ser instantáneamente y atómico.

La idea es que implementar la próxima versión de una aplicación es un paso distinto de la activación de esa versión (activar, es decir, hacer que esa versión sea la pnetworkingeterminada).

Por lo tanto, una implementación (o una reversión) simplemente sería una cuestión de cambiar la versión pnetworkingeterminada a la versión siguiente (o anterior).

Google App Engine admite este tipo de patrón y realmente me gusta.

Alguien ha establecido algo como esto usando Docker? Agradecería cualquier consejo sobre cómo hacerlo. Gracias.

Haría esto con un proxy inverso frente a los contenedores que ejecutan su aplicación web.

Ejemplo utilizando la image jwilder / nginx-proxy

Digamos que la dirección IP del host del 11.22.33.44 es 11.22.33.44 .

Digamos que las imágenes de su docker son:

  • mywebapp:5 para v5
  • mywebapp:6 para v6
  • mywebapp:7 para v7

Primero, asegúrese de que su DNS esté configurado para que v5.example.com , v6.example.com , v7.example.com y www.example.com resuelvan todos a 11.22.33.44 .

Inicie un jwilder / nginx-proxy en su host de docker:

 docker run -d --name reverseproxy -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro -e DEFAULT_HOST=www.example.com jwilder/nginx-proxy 

Establezca v6 como el pnetworkingeterminado

Comience los contenedores de webapps:

 docker run -d -name webapp5 -e VIRTUAL_HOST="v5.example.com" mywebapp:5 docker run -d -name webapp6 -e VIRTUAL_HOST="v6.example.com,www.example.com" mywebapp:6 docker run -d -name webapp7 -e VIRTUAL_HOST="v7.example.com" mywebapp:7 

El jwilder / nginx-proxy usará el valor de la variable de entorno VIRTUAL_HOST para actualizar su configuration y enrutar las requestes al contenedor correcto.

Cómo hacer que v7 sea el nuevo pnetworkingeterminado

Primero, elimine el contenedor webapp7 y cree uno nuevo con www.example.com agregado a la variable VIRTUAL_HOST :

 docker rm webapp7 docker run -d -name webapp7 -e VIRTUAL_HOST="v7.example.com,www.example.com" mywebapp:7 

En este estado, el proxy inverso cargará consultas de saldo para www.example.com a ambos contenedores de webapp6 y de webapp7 .

Finalmente, elimine webapp6 contenedor y finalmente webapp6 , pero sin www.example.com en el valor VIRTUAL_HOST :

 docker rm webapp6 docker run -d -name webapp6 -e VIRTUAL_HOST="v6.example.com" mywebapp:7 

Pensé que compartiría lo que terminé haciendo. Tomé el consejo de Thomasleveil para usar nginx. Pero en lugar de iniciar y detener todo un contenedor acoplable y nginx solo para cambiar versiones, hago esto:

  1. Cambia el número de puerto en el file de configuration nginx (mira el file a continuación)
  2. Llamar al service nginx reload (que es instantáneo).

 server{ location / { proxy_pass http://192.168.1.50:81/; } }