Mejores prácticas para organizar aplicaciones de varios niveles en Docker

Me gustaría tener algunas sugerencias sobre las mejores prácticas para organizar mi proyecto utilizando Docker.

Digamos que tengo el proyecto X, que está compuesto por dos aplicaciones principales, Tienda y una Aplicación de administración de productos. Son aplicaciones completamente diferentes pero son parte del mismo proyecto. Tienen sus propios services, código fuente, repository e infraestructura.

Tienda [mysql, mongodb, elasticsearch, nginx, php, código fuente de la aplicación] PMA [mysql, nginx, php, código fuente de la aplicación]

Ya que son dos repositorys diferentes y tienen su propio file comstackdor, ¿cómo puedo ejecutar todo con solo un command?

¿Debería crear un repository de docker que amplíe tanto Docker-Comose como ejecutar todo de una sola vez?

  • Aísle las cosas tanto como sea posible, de modo que si necesita un mysql y un mongodb, sepárelos y haga que los contenedores sean lo más pequeños posible, con solo las bibliotecas y los binarys que necesitan (también conocidos como microcontenedores ). Para lograr esto también puedes build tus imágenes usando alpine linux .
  • Para los contenedores de bases de datos, usar volúmenes para almacenar los datos en el host en lugar del contenedor, funciona más rápido. También puede almacenar los files de configuration en un volumen para que no tenga que acceder al contenedor cada vez que quiera cambiar una configuration.
  • Use Dockefiles en lugar de build sus imágenes manualmente, esto hace que las imágenes se puedan replicar en cualquier host, y puede almacenarlas en git.

Usaría Docker Componer para build y ejecutar todos los contenedores a la vez, pero si su architecture es demasiado compleja y necesita algo más poderoso, eche un vistazo a Kubernetes .

En primer lugar, no recomiendo contener las bases de datos. No hay muchos casos de uso buenos, ya que esa replicación solo mastica a través de IO y la utilización del disco en unos pocos hosts. También pierde mucha especialización típica y mantenimiento / gestión para la database / almacenes de datos.

Crea un repository git de tus files Docker. Hace que los sistemas de actualización sean mucho más fáciles en el futuro. Mi estructura es normalmente

/Dockerfiles /Project Dockerfile (requinetworking files) docker-compose.yml 

También tenga un logging privado, pero construya esas imágenes de los files docker anteriores. Hace que administrar las versiones sea infinitamente más fácil y facilita los desvíos y las implementaciones automatizadas.

  1. Crear un clúster de enjambre (1 o más hosts)
  2. Crear dos networkinges superpuestas (denominadas store y pma si lo desea)
  3. Cree un punto de almacenamiento NFS compartido para montarlo en los hosts en / docker. Mountpoint debe estar en lectura, escritura y ejecución para el grupo acoplador. Esto se usará para el almacenamiento persistente en el cluster elasticsearch
  4. Cree services en la networking de la tienda para php-fpm (para ejecutar el código fuente), NGINX para proxy, y búsqueda elástica. Se pueden referir el uno al otro en la networking de superposition por nombre
  5. Crear services en la networking pma para php-fpm, nginx (proxy)

También podría simplemente crear imágenes apache / php. Eso es lo que hacemos para beadockstar / laravel.

Tenga en count el almacenamiento en los sistemas PHP. Si alguna vez necesita cargar algo que no se va a abstraer a un CDN de algún tipo, debe asegurarse de que el directory al que van cargadas persista en el directory de host / docker (o en cualquier otro directory de host uniforme en todos los hosts de enjambre)