Una lista de verificación de 10 pasos sobre cómo dockerizar cualquier aplicación. Ya hay muchos tutoriales sobre cómo aplicaciones disponibles en Internet, entonces, ¿por ? dockerizar qué estoy escribiendo otro La mayoría de los tutoriales que veo se centran en una (por ejemplo, Java o Python) que puede no cubrir lo que necesita. Tampoco todos los que son necesarios para establecer un contrato bien definido entre los equipos y (que es de lo que se trata la ). tecnología específica abordan aspectos relevantes Dev Ops contenedorización Compilé los pasos a continuación en base a mis recientes y . Es una lista de verificación de detalles y cosas que las otras guías pasan por alto. experiencias las lecciones aprendidas Descargo de responsabilidad: Esta NO es una guía para principiantes. Le recomiendo que aprenda los conceptos básicos de cómo configurar y usar la ventana acoplable al principio, y vuelva aquí después de haber creado y lanzado algunos contenedores. Empecemos. 1. Elija una imagen base Hay muchas imágenes base específicas de , como: la tecnología https://hub.docker.com/_/java/ https://hub.docker.com/_/python/ https://hub.docker.com/_/nginx/ Si ninguno de ellos funciona para usted, debe comenzar desde un sistema operativo base e instalar todo usted mismo. La mayoría de los tutoriales que existen comenzarán con Ubuntu (por ejemplo, ubuntu: 16.04), lo cual no es necesariamente incorrecto. Mi consejo es que consideres usar imágenes de : Alpine https://hub.docker.com/_/alpine/ Proporcionan una imagen base mucho más pequeña (tan pequeña como 5 MB). Nota: los comandos "apt-get" no funcionarán en esas imágenes. Alpine utiliza su propia herramienta y repositorio de paquetes. Para más detalles ver: https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management https://pkgs.alpinelinux.org/packages 2. Instala los paquetes necesarios Esto suele ser trivial. Algunos detalles que te pueden faltar: a-) Debe escribir apt-get y apt-get en la misma línea (lo mismo si está usando apk en Alpine). Esta no es solo una práctica común, , de lo contrario, la imagen temporal (capa) "apt-get update" se puede almacenar en caché y es posible que no actualice la información del paquete que necesita inmediatamente después (consulte esta discusión ). update install debe hacerlo https://forums .docker.com/t/dockerfile-run-apt-get-install-all-packages-at-once-or-one-by-one/17191 b-) Vuelva a verificar si está instalando lo que (suponiendo que ejecutará el contenedor en producción). He visto gente instalando y otras de dentro de sus imágenes. SOLO realmente necesita vim herramientas desarrollo Si es necesario, cree un Dockerfile diferente para el tiempo de compilación/depuración/desarrollo. No se trata solo del tamaño de la imagen, piense en la seguridad, la mantenibilidad, etc. 3. Agregue sus archivos personalizados Algunos consejos para mejorar sus Dockerfiles: a-) Comprender la diferencia entre COPIAR y AÑADIR: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#add-or-copy b-) (Intente) Seguir las convenciones del sistema de archivos sobre dónde colocar sus archivos: http://www.nombrederuta.com/fhs/ Por ejemplo, para aplicaciones interpretadas (PHP, Python), utilice la carpeta . /usr/src c-) Verifique los atributos de los archivos que está agregando. Si necesita permiso de ejecución, no es necesario agregar una nueva capa en su imagen (EJECUTAR chmod +x …). Simplemente corrija los atributos originales en su repositorio de código. No hay excusa para eso, incluso si está usando Windows, consulte: _No es necesario hacer esto en dos confirmaciones, puede agregar el archivo y marcarlo como ejecutable en una sola confirmación..._stackoverflow.com ¿Cómo crear permisos de modo de ejecución de archivos en Git en Windows? 4. Defina qué usuario ejecutará (o puede) ejecutar su contenedor Primero, tómate un descanso y lee el siguiente artículo: gran _Comprender cómo los nombres de usuario, los nombres de grupo, las identificaciones de usuario (uid) y las identificaciones de grupo (gid) se asignan entre los procesos que se ejecutan dentro de un…_medium.com Comprender cómo funcionan uid y gid en contenedores Docker Después de leer esto entenderás que: a-) Solo necesita ejecutar su contenedor con un usuario específico (ID fijo) si su aplicación necesita acceso a las tablas de usuarios o grupos ( o ). /etc/passwd /etc/group b-) Evite ejecutar su contenedor como root tanto como sea posible. Desafortunadamente, no es difícil encontrar aplicaciones populares que requieran ejecutarlas con identificadores específicos (por ejemplo, con uid:gid = 1000:1000). Elastic Search Intenta no ser uno más... 5. Definir los puertos expuestos Este suele ser un proceso muy trivial, por favor, simplemente no cree la necesidad de que su contenedor se ejecute como root porque quiere que exponga un puerto bajo privilegiado (80). Simplemente exponga un puerto no privilegiado (por ejemplo, 8080) y mapéelo durante la ejecución del contenedor. Esta diferenciación viene de mucho tiempo atrás: https://www.w3.org/Daemon/User/Installation/PrivilegedPorts.html 6. Definir el punto de entrada La forma estándar: simplemente ejecute su archivo ejecutable de inmediato. Una mejor manera: cree un script " " donde pueda enlazar cosas como la configuración usando variables de entorno (más sobre esto a continuación): docker-entrypoint.sh Esta es una práctica muy común, algunos ejemplos: _elasticsearch-docker - Docker oficial de Elasticsearch image_github.com elastic/elasticsearch-docker _postgres - Paquete de imagen oficial de Docker para Postgres_github.com docker-library/postgres 7. Definir un método de configuración Cada aplicación requiere algún tipo de parametrización. Básicamente hay dos caminos que puedes seguir: 1-) Use un archivo de configuración específico de la aplicación: necesitará documentar el formato, los campos, la ubicación, etc. (no es bueno si tiene un entorno complejo, con aplicaciones que abarcan diferentes tecnologías). 2-) Uso (sistema operativo) Variables de entorno: Simple y eficiente. Si cree que este no es un enfoque moderno o recomendado, recuerde que esto es parte de : Los Doce Factores _Una metodología para crear aplicaciones de software como servicio modernas, escalables y mantenibles._12factor.net La aplicación Twelve-Factor Esto no significa que deba desechar sus archivos de configuración y refactorizar el mecanismo de configuración de su aplicación. Simplemente use un comando simple para reemplazar una plantilla de configuración (dentro de , porque debe realizarse en tiempo de ejecución). envsubst docker-entrypoint.sh Ejemplo: _Edición oficial de Nginx. Repositorio de GitHub: https://github.com/nginxinc/docker-nginx Referencia de la biblioteca Este contenido es…_docs.docker.com nginx Esto encapsulará el archivo de configuración específico de la aplicación, el diseño y los detalles dentro del contenedor. 8. Externaliza tus datos La regla de oro es: . no guardes ningún dato persistente dentro del contenedor El sistema de archivos contenedor se supone y está destinado a ser temporal, efímero. Por lo tanto, cualquier contenido generado por el usuario, archivos de datos, salida del proceso debe guardarse en un o en un montaje de (es decir, en una carpeta en el sistema operativo base vinculado dentro del contenedor). volumen montado enlace Sinceramente, no tengo mucha experiencia en volúmenes montados, siempre he preferido guardar los datos en un de , utilizando una carpeta previamente creada y con una herramienta de (como Salt Stack). enlace montajes definida cuidadosamente de gestión configuración Como , me refiero a lo siguiente: cuidadosamente creado Creo un usuario (y un grupo) sin privilegios en el sistema operativo base. Todas las carpetas de enlace (-v) se crean con este usuario como propietario. Los permisos se otorgan en consecuencia (solo para este usuario y grupo específicos, otros usuarios no tendrán acceso a eso). El contenedor se ejecutará con este usuario. Tendrás el control total de eso. 9. Asegúrate de manejar los registros también Soy consciente de que mis " " anteriores están lejos de ser una definición precisa, y los registros a veces caen en el área gris. ¿Cómo debes manejarlos? datos persistentes Si está creando una nueva aplicación y desea que se ciña a las convenciones de la , no debe escribir ningún de registro. La aplicación debe usar y como un de . Al igual que la recomendación de variables de entorno, también es uno de . Ver: ventana acoplable archivo stdout stderr flujo eventos los doce factores _Una metodología para crear aplicaciones de software como servicio modernas, escalables y mantenibles._12factor.net La aplicación Twelve-Factor Docker capturará automáticamente todo lo que envíe a la y lo pondrá a disposición a través del comando " ": salida estándar docker logs https://docs.docker.com/engine/reference/commandline/logs/ Sin embargo, hay algunos casos prácticos en los que esto es particularmente difícil. Si está ejecutando un contenedor nginx simple, tendrá al menos dos tipos diferentes de archivos de registro: Registros de acceso HTTP Registros de errores Con diferentes estructuras, configuraciones e implementaciones preexistentes, puede que no sea trivial canalizarlas en la salida estándar. En este caso, simplemente manipule los archivos de registro como se describe en la sección anterior y asegúrese de rotarlos. 10. Gire los registros y otros archivos adjuntos solamente Si su aplicación escribe archivos de registro o agrega archivos que pueden , debe preocuparse por la de archivos. crecer indefinidamente rotación Esto es fundamental para evitar que el servidor se quede sin , aplicar políticas de de datos (que es fundamental cuando se trata de GDPR y otras regulaciones de datos). espacio retención Si está utilizando de , puede contar con la ayuda del sistema operativo base y usar las mismas herramientas que usaría para una configuración de rotación local, es decir, (manual ). montajes enlace logrotate aquí Un ejemplo simple pero completo que encontré recientemente es este: de registros _Gestione las rotaciones de registros mediante la herramienta de Linux, logrotate, con la base de datos NoSQL en memoria de Aerospike._www.aerospike.com Configurar - Rotación Otro bueno: _Logrotate es una utilidad del sistema que administra la rotación y compresión automáticas de los archivos de registro. Si los archivos de registro no fueran…_www.digitalocean.com Cómo administrar archivos de registro con Logrotate en Ubuntu 16.04 | DigitalOcean — Avíseme si tiene algún comentario. Consulte mis otros artículos técnicos en https://hackernoon.com/@htssouza