Pregunta

Aquí está mi situación:

  • Tengo un proyecto escrito en Go almacenado en Github
  • Tengo 3 servidores de aplicaciones detrás de un equilibrador de carga (app1, app2, app3)
  • Tengo un Dockerfile como parte del proyecto en git, que cuando se usa para crear una imagen, sabe cómo instalar todas las dependencias de mi aplicación (incluido Go) y obtener un entorno de trabajo para mi aplicación.
  • Tengo contenedores ejecutándose en los 3 servidores de aplicaciones y todo funciona de maravilla.

Ahora quiero cambiar algo de código y volver a implementar mis cambios en esos 3 servidores.Se me ocurren 3 posibles formas de facilitar la automatización de esto:

  1. Como parte de mi dockerfile, puedo agregar un paso que extrae mi código de Github y lo compila.Entonces, para volver a implementar, necesito una secuencia de comandos que inicie sesión en los 3 servidores y reconstruya y ejecute los contenedores, extrayendo así todo el código nuevo en el proceso.Como máximo, todo lo que necesito enviar a un servidor es el Dockerfile.
  2. Como parte de mi Dockerfile, puedo tener un comando ADD para agrupar mi código en el contenedor.Luego necesitaría implementar todo mi proyecto en cada servidor usando algo como Capistrano o Fabric y luego eliminar el contenedor anterior, reconstruirlo y ejecutarlo.
  3. Puedo usar una máquina designada (o mi entorno de desarrollo) para crear una nueva imagen basada en el código fuente actual.Luego envíe esta imagen al registro.Luego, tenga un script que inicie sesión en mis servidores y extraiga la nueva imagen, elimine el contenedor anterior y ejecute el nuevo.

El número 1 parece el más fácil, pero la mayoría de las discusiones que he leído en Dockers se inclinan hacia una situación como la 3, que me parece bastante larga.

¿Cuál es la mejor opción aquí (o no aquí)? Soy nuevo en Docker, ¿me he perdido algo?Le pregunté a alguien que sabe sobre Docker y su respuesta fue "no estás pensando a la manera de Docker", entonces, ¿cuál es la manera de Docker?

¿Fue útil?

Solución

Creo que la idea de la opción 3, es que está construyendo la imagen solo una vez, lo que significa que todos los servidores ejecutarían la misma imagen.Los otros dos pueden producir diferentes imágenes.

e.g.En un escenario un poco más involucrado, las tres compilaciones pueden incluso elegir diferentes comisiones si va con la opción 1.

Otros consejos

La combinación de las opciones 2 y 3 se puede utilizar con el Fabricio.Es una extensión de Tela, de este modo fabfile.py para su proyecto puede verse así:

from fabricio import docker, tasks

app = tasks.ImageBuildDockerTasks(
    service=docker.Container(
        name='app',
        image='registry/project/image:tag',
        options={'publish': '8000:8000'},
    ),
    hosts=['user@host1', 'user@host2', 'user@host3'],
)

Usando la definición de configuración anterior, puede escribir fab --list desde el directorio raíz del proyecto y vea una lista de comandos de Fabricio disponibles:

Available commands:

    app           prepare -> push -> backup -> pull -> migrate -> update
    app.deploy    prepare -> push -> backup -> pull -> migrate -> update
    app.prepare   prepare Docker image
    app.pull      pull Docker image from registry
    app.push      push Docker image to registry
    app.rollback  rollback Docker service to a previous version
    app.update    update service to a new version

También hay un montón de ejemplos de cómo utilizar Fabricio, incluido Modo enjambre Docker lo cual puede ser muy útil para su configuración.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top