{"id":47766,"date":"2026-08-12T07:01:30","date_gmt":"2026-08-12T05:01:30","guid":{"rendered":"\/co\/tutoriales\/buenas-practicas-docker"},"modified":"2026-08-12T07:01:30","modified_gmt":"2026-08-12T05:01:30","slug":"buenas-practicas-docker","status":"publish","type":"post","link":"\/co\/tutoriales\/buenas-practicas-docker\/","title":{"rendered":"Buenas pr\u00e1cticas de Docker para crear y ejecutar contenedores"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Las buenas pr&aacute;cticas de Docker son pautas para crear, ejecutar y mantener contenedores de forma segura y eficiente.<\/p><p class=\"wp-block-paragraph\">Docker empaqueta las aplicaciones y sus dependencias en contenedores port&aacute;tiles que funcionan de forma uniforme en distintos entornos.<\/p><p class=\"wp-block-paragraph\">Esta uniformidad simplifica el desarrollo y el despliegue, pero para que la contenedorizaci&oacute;n sea fiable no basta con empaquetar una aplicaci&oacute;n en una imagen.<\/p><p class=\"wp-block-paragraph\">Las buenas pr&aacute;cticas se centran en los aspectos que m&aacute;s influyen en entornos reales, como la optimizaci&oacute;n de im&aacute;genes, la eficiencia de las compilaciones, la seguridad de los contenedores, la gesti&oacute;n de secretos, la observabilidad y la preparaci&oacute;n para la orquestaci&oacute;n.<\/p><p class=\"wp-block-paragraph\">En conjunto, estas t&eacute;cnicas permiten crear contenedores m&aacute;s f&aacute;ciles de desplegar, escalar, proteger y mantener durante todo su ciclo de vida.<\/p><h2 class=\"wp-block-heading\" id=\"h-1-usa-imagenes-base-oficiales-y-minimalistas\">1. Usa im&aacute;genes base oficiales y minimalistas<\/h2><p class=\"wp-block-paragraph\">Las im&aacute;genes oficiales proceden de mantenedores de confianza y ofrecen una base m&aacute;s segura para tus contenedores, mientras que las im&aacute;genes minimalistas reducen el n&uacute;mero de paquetes, herramientas y bibliotecas incluidos en la imagen final.<\/p><p class=\"wp-block-paragraph\">Las im&aacute;genes base minimalistas, como Alpine, permiten crear contenedores m&aacute;s ligeros porque solo incluyen lo imprescindible para ejecutar una aplicaci&oacute;n.<\/p><p>        <div class=\"protip\">\n            <div class=\"protip__heading\">\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                    <path d=\"M1.49234 23.5024C1.23229 23.5024 0.972242 23.4024 0.782206 23.2123C0.562165 22.9923 0.452144 22.6822 0.502153 22.3722C0.562165 21.9221 1.14227 17.9113 3.00262 16.351C3.63274 15.8209 4.43289 15.5509 5.26305 15.5609C6.09321 15.5909 6.87335 15.9109 7.47347 16.4911C8.6937 17.6913 8.76371 19.6717 7.6435 20.9919C6.0832 22.8523 2.08245 23.4324 1.63237 23.4924C1.59236 23.4924 1.54235 23.4924 1.50234 23.4924L1.49234 23.5024ZM5.16303 17.5613C4.84297 17.5613 4.53291 17.6713 4.29287 17.8813C3.60274 18.4614 3.07264 19.9317 2.75258 21.242C4.06282 20.9219 5.5331 20.3918 6.11321 19.7017C6.55329 19.1716 6.54329 18.3814 6.0832 17.9213C5.85316 17.7013 5.5431 17.5713 5.20304 17.5613C5.19304 17.5613 5.17303 17.5613 5.16303 17.5613ZM11.7243 21.8821C11.4942 21.8821 11.2642 21.8021 11.0841 21.652C10.8541 21.462 10.7241 21.1819 10.7241 20.8819V15.9109L8.08358 13.2705H3.11264C2.81259 13.2705 2.53254 13.1404 2.3425 12.9104C2.15246 12.6803 2.07245 12.3803 2.12246 12.0902C2.19247 11.7102 2.84259 8.36953 4.70294 7.12929C6.33325 6.04909 8.96375 6.49918 10.244 6.80923C11.5442 4.96889 13.2546 3.4286 15.2349 2.33839C17.4553 1.11816 19.9858 0.518051 22.4963 0.498047C23.0464 0.498047 23.4865 0.948132 23.4865 1.49824C23.4865 5.0389 22.3763 9.97983 17.1753 13.7605C17.4853 15.0408 17.9354 17.6613 16.8552 19.2816C15.615 21.1419 12.2744 21.7921 11.8943 21.8621C11.8343 21.8721 11.7743 21.8821 11.7143 21.8821H11.7243ZM12.7245 16.181V19.6016C13.7146 19.2916 14.7948 18.7915 15.2049 18.1814C15.675 17.4812 15.605 16.091 15.385 14.9008C14.5248 15.3808 13.6346 15.8109 12.7245 16.181ZM9.66388 12.0302L11.9643 14.3307C13.1845 13.8306 14.3648 13.2204 15.485 12.5103C19.9358 9.51974 21.2361 5.60901 21.4561 2.53843C19.6157 2.67846 17.8254 3.20856 16.2051 4.09872C14.2847 5.14892 12.6544 6.68921 11.4942 8.54956C10.7841 9.65977 10.174 10.82 9.66388 12.0302ZM4.39289 11.2701H7.81353C8.1936 10.3599 8.63368 9.46974 9.11377 8.60957C7.92355 8.38953 6.51329 8.31952 5.81315 8.78961C5.19304 9.19968 4.70294 10.3099 4.39289 11.2701Z\" fill=\"#673DE6\"\/>\n                <\/svg>\n                <p class=\"protip__title\">\n                    Consejo profesional                <\/p>\n            <\/div>\n            <p class=\"protip__content\"> Al elegir una imagen base, opta por im&aacute;genes distroless, como las de Google, para cargas de trabajo de producci&oacute;n en las que necesites reducir al m&aacute;ximo la superficie de ataque. Usa im&aacute;genes basadas en Alpine cuando necesites un shell o un gestor de paquetes para depurar durante el desarrollo.<\/p>\n                    <\/div>\n        \n\n\n\n<\/p><p class=\"wp-block-paragraph\">Las im&aacute;genes de uso general m&aacute;s grandes incluyen m&aacute;s utilidades del sistema y dependencias, lo que supone tener m&aacute;s componentes que actualizar, analizar y proteger. Cada paquete adicional a&ntilde;ade c&oacute;digo que hay que mantener. Eliminar lo que no necesitas reduce las vulnerabilidades y agiliza la creaci&oacute;n, descarga e inicio de las im&aacute;genes.<\/p><h2 class=\"wp-block-heading\" id=\"h-2-fija-las-versiones-de-las-imagenes-base-para-conseguir-compilaciones-reproducibles\">2. Fija las versiones de las im&aacute;genes base para conseguir compilaciones reproducibles<\/h2><p class=\"wp-block-paragraph\">Fija versiones concretas de las im&aacute;genes base para conseguir compilaciones reproducibles y evitar cambios inesperados. Usar etiquetas gen&eacute;ricas, como <code>latest<\/code>, genera incertidumbre porque la imagen subyacente puede cambiar en cualquier momento.<\/p><p class=\"wp-block-paragraph\">Un Dockerfile que hoy funciona puede generar una imagen diferente ma&ntilde;ana, aunque el c&oacute;digo de la aplicaci&oacute;n no haya cambiado.<\/p><p class=\"wp-block-paragraph\">Fijar las versiones hace que los despliegues sean m&aacute;s predecibles, ya que garantiza que las compilaciones utilicen siempre la misma versi&oacute;n de la imagen base.<\/p><p class=\"wp-block-paragraph\">Una etiqueta como <code>node:22.11-alpine<\/code> o <code>python:3.12-slim<\/code> ayuda a evitar cambios inesperados en las dependencias, actualizaciones imprevistas de paquetes y problemas de compatibilidad dif&iacute;ciles de diagnosticar despu&eacute;s del despliegue.<\/p><p class=\"wp-block-paragraph\">Los equipos que necesiten mayores garant&iacute;as pueden fijar los digests de las im&aacute;genes adem&aacute;s de las etiquetas de versi&oacute;n. Los digests identifican una imagen concreta y garantizan que <a href=\"\/co\/tutoriales\/que-es-docker\/\">Docker<\/a> descargue siempre exactamente la misma imagen.<\/p><p class=\"wp-block-paragraph\">Esto requiere m&aacute;s mantenimiento, ya que los digests fijados no se actualizan autom&aacute;ticamente. Los parches de seguridad y las nuevas versiones deben revisarse manualmente y actualizarse en el Dockerfile.<\/p><h2 class=\"wp-block-heading\" id=\"h-3-escribe-archivos-dockerfile-eficientes\">3. Escribe archivos Dockerfile eficientes<\/h2><p class=\"wp-block-paragraph\">Cuando escribas archivos Dockerfile, ten en cuenta el tama&ntilde;o de la imagen, la velocidad de compilaci&oacute;n y la seguridad. La estructura del Dockerfile determina cu&aacute;ntas capas crea Docker, cu&aacute;ntos datos se incluyen en la imagen final y con qu&eacute; eficiencia las futuras compilaciones podr&aacute;n reutilizar el trabajo almacenado en cach&eacute;.<\/p><p class=\"wp-block-paragraph\">Los Dockerfile eficientes evitan dependencias innecesarias y eliminan los archivos temporales despu&eacute;s de instalar los paquetes.<\/p><p class=\"wp-block-paragraph\">Las herramientas de compilaci&oacute;n, las cach&eacute;s de paquetes, los registros y los archivos descargados no deber&iacute;an permanecer en la imagen de ejecuci&oacute;n, salvo que la aplicaci&oacute;n los necesite. Los archivos innecesarios aumentan el tama&ntilde;o de la imagen y a&ntilde;aden componentes que hay que analizar, parchear y mantener.<\/p><p class=\"wp-block-paragraph\">La gesti&oacute;n de las capas tambi&eacute;n es importante. Agrupa los comandos relacionados en una &uacute;nica instrucci&oacute;n <strong>RUN<\/strong> para reducir las capas innecesarias. Una imagen m&aacute;s peque&ntilde;a solo resulta &uacute;til si quienes trabajen con el Dockerfile pueden entender c&oacute;mo se crea la imagen y actualizar las instrucciones de forma segura.<\/p><p class=\"wp-block-paragraph\">Los archivos Dockerfile predecibles son m&aacute;s f&aacute;ciles de mantener a largo plazo. Un orden claro de las instrucciones, las dependencias expl&iacute;citas y los comandos f&aacute;ciles de entender reducen los imprevistos durante la compilaci&oacute;n y facilitan el diagn&oacute;stico de los fallos durante los despliegues.<\/p><h2 class=\"wp-block-heading\" id=\"h-4-usa-compilaciones-en-varias-etapas-para-reducir-el-tamano-de-la-imagen\">4. Usa compilaciones en varias etapas para reducir el tama&ntilde;o de la imagen<\/h2><p class=\"wp-block-paragraph\">Usa compilaciones en varias etapas para separar las herramientas de compilaci&oacute;n de las dependencias de ejecuci&oacute;n. Las herramientas de compilaci&oacute;n, los compiladores, los gestores de paquetes y los archivos fuente solo son necesarios durante el desarrollo de la aplicaci&oacute;n.<\/p><p class=\"wp-block-paragraph\">El contenedor final solo necesita la aplicaci&oacute;n compilada y los archivos necesarios para ejecutarla.<\/p><p class=\"wp-block-paragraph\">Las compilaciones en varias etapas reducen el tama&ntilde;o de la imagen al excluir componentes innecesarios durante la ejecuci&oacute;n. Las im&aacute;genes m&aacute;s peque&ntilde;as se transfieren y se inician m&aacute;s r&aacute;pido, adem&aacute;s de ocupar menos espacio de almacenamiento.<\/p><p class=\"wp-block-paragraph\">Eliminar las herramientas de compilaci&oacute;n y las dependencias de desarrollo tambi&eacute;n reduce la superficie de ataque, ya que hay menos componentes disponibles dentro del contenedor en ejecuci&oacute;n.<\/p><p class=\"wp-block-paragraph\">Las compilaciones en varias etapas son m&aacute;s eficaces para aplicaciones compiladas y proyectos con muchas dependencias de compilaci&oacute;n.<\/p><p class=\"wp-block-paragraph\">Este enfoque suele ser especialmente &uacute;til con lenguajes y marcos como Go, Java, .NET y <a href=\"\/co\/tutoriales\/que-es-node-js\/\">Node.js<\/a>, as&iacute; como con proyectos de React, porque el entorno de compilaci&oacute;n es bastante m&aacute;s grande que el entorno de ejecuci&oacute;n.<\/p><p>        <div class=\"protip\">\n            <div class=\"protip__heading\">\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                    <path d=\"M1.49234 23.5024C1.23229 23.5024 0.972242 23.4024 0.782206 23.2123C0.562165 22.9923 0.452144 22.6822 0.502153 22.3722C0.562165 21.9221 1.14227 17.9113 3.00262 16.351C3.63274 15.8209 4.43289 15.5509 5.26305 15.5609C6.09321 15.5909 6.87335 15.9109 7.47347 16.4911C8.6937 17.6913 8.76371 19.6717 7.6435 20.9919C6.0832 22.8523 2.08245 23.4324 1.63237 23.4924C1.59236 23.4924 1.54235 23.4924 1.50234 23.4924L1.49234 23.5024ZM5.16303 17.5613C4.84297 17.5613 4.53291 17.6713 4.29287 17.8813C3.60274 18.4614 3.07264 19.9317 2.75258 21.242C4.06282 20.9219 5.5331 20.3918 6.11321 19.7017C6.55329 19.1716 6.54329 18.3814 6.0832 17.9213C5.85316 17.7013 5.5431 17.5713 5.20304 17.5613C5.19304 17.5613 5.17303 17.5613 5.16303 17.5613ZM11.7243 21.8821C11.4942 21.8821 11.2642 21.8021 11.0841 21.652C10.8541 21.462 10.7241 21.1819 10.7241 20.8819V15.9109L8.08358 13.2705H3.11264C2.81259 13.2705 2.53254 13.1404 2.3425 12.9104C2.15246 12.6803 2.07245 12.3803 2.12246 12.0902C2.19247 11.7102 2.84259 8.36953 4.70294 7.12929C6.33325 6.04909 8.96375 6.49918 10.244 6.80923C11.5442 4.96889 13.2546 3.4286 15.2349 2.33839C17.4553 1.11816 19.9858 0.518051 22.4963 0.498047C23.0464 0.498047 23.4865 0.948132 23.4865 1.49824C23.4865 5.0389 22.3763 9.97983 17.1753 13.7605C17.4853 15.0408 17.9354 17.6613 16.8552 19.2816C15.615 21.1419 12.2744 21.7921 11.8943 21.8621C11.8343 21.8721 11.7743 21.8821 11.7143 21.8821H11.7243ZM12.7245 16.181V19.6016C13.7146 19.2916 14.7948 18.7915 15.2049 18.1814C15.675 17.4812 15.605 16.091 15.385 14.9008C14.5248 15.3808 13.6346 15.8109 12.7245 16.181ZM9.66388 12.0302L11.9643 14.3307C13.1845 13.8306 14.3648 13.2204 15.485 12.5103C19.9358 9.51974 21.2361 5.60901 21.4561 2.53843C19.6157 2.67846 17.8254 3.20856 16.2051 4.09872C14.2847 5.14892 12.6544 6.68921 11.4942 8.54956C10.7841 9.65977 10.174 10.82 9.66388 12.0302ZM4.39289 11.2701H7.81353C8.1936 10.3599 8.63368 9.46974 9.11377 8.60957C7.92355 8.38953 6.51329 8.31952 5.81315 8.78961C5.19304 9.19968 4.70294 10.3099 4.39289 11.2701Z\" fill=\"#673DE6\"\/>\n                <\/svg>\n                <p class=\"protip__title\">\n                    Consejo profesional                <\/p>\n            <\/div>\n            <p class=\"protip__content\">Un Dockerfile b&aacute;sico de varias etapas utiliza una instrucci&oacute;n <code>FROM<\/code> distinta para cada etapa. Asigna un nombre a la etapa de compilaci&oacute;n, por ejemplo, <code>FROM node:20-alpine AS builder<\/code>, ejecuta los pasos de compilaci&oacute;n y, despu&eacute;s, inicia otra etapa con una imagen base minimalista y copia &uacute;nicamente el resultado compilado con <code>COPY --from=builder<\/code>.<\/p>\n                    <\/div>\n        \n\n\n\n<\/p><p class=\"wp-block-paragraph\">Separar las etapas permite mantener las im&aacute;genes de producci&oacute;n ligeras sin complicar el flujo de trabajo de desarrollo.<\/p><h2 class=\"wp-block-heading\" id=\"h-5-optimiza-el-uso-de-la-cache-de-compilacion-de-docker\">5. Optimiza el uso de la cach&eacute; de compilaci&oacute;n de Docker<\/h2><p class=\"wp-block-paragraph\">Optimiza el uso de la cach&eacute; de compilaci&oacute;n de Docker para reducir los tiempos de compilaci&oacute;n y evitar trabajo innecesario durante las recompilaciones. Docker almacena cada instrucci&oacute;n como una capa reutilizable, lo que permite reutilizar las partes del proceso de compilaci&oacute;n que no han cambiado en lugar de volver a compilarlas desde cero.<\/p><div class=\"wp-block-image\"><figure data-wp-context='{\"imageId\":\"6a7c1b9420a2b\"}' data-wp-interactive=\"core\/image\" data-wp-key=\"6a7c1b9420a2b\" class=\"aligncenter size-large wp-lightbox-container\"><img decoding=\"async\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/08\/Optimiza-el-uso-de-la-cache-de-compilacion-de-Docker.jpg\/w=1024,h=1024,fit=scale-down\" alt=\"Diagrama de optimizaci&oacute;n de la cach&eacute; de compilaci&oacute;n de Docker con tres etapas: recompilaci&oacute;n sin optimizar, orden optimizado de las capas del Dockerfile y recompilaci&oacute;n m&aacute;s r&aacute;pida\" class=\"wp-image-55781\"><button class=\"lightbox-trigger\" type=\"button\" aria-haspopup=\"dialog\" data-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\" data-wp-init=\"callbacks.initTriggerButton\" data-wp-on--click=\"actions.showLightbox\" data-wp-style--right=\"state.thisImage.buttonRight\" data-wp-style--top=\"state.thisImage.buttonTop\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewbox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\"><\/path>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure><\/div><p class=\"wp-block-paragraph\">Ordena las instrucciones del Dockerfile desde las que tienen menos probabilidades de cambiar hasta las que tienen m&aacute;s.<\/p><p class=\"wp-block-paragraph\">Las instrucciones estables deber&iacute;an tener prioridad. La instalaci&oacute;n de paquetes del sistema, los manifiestos de dependencias y la configuraci&oacute;n b&aacute;sica cambian con menos frecuencia que el c&oacute;digo fuente de las aplicaciones.<\/p><p class=\"wp-block-paragraph\">Copia los archivos de dependencias antes de copiar toda la aplicaci&oacute;n para que Docker pueda reutilizar las capas de instalaci&oacute;n de las dependencias cuando solo cambie el c&oacute;digo de la aplicaci&oacute;n.<\/p><p class=\"wp-block-paragraph\">Define con cuidado los pasos de instalaci&oacute;n de paquetes. Combina <code>apt-get update<\/code> y <code>apt-get install<\/code> en una sola instrucci&oacute;n para mantener sincronizados los &iacute;ndices y los paquetes instalados.<\/p><p class=\"wp-block-paragraph\">Elimina las cach&eacute;s de los paquetes tras la instalaci&oacute;n para evitar que se guarden archivos innecesarios en la imagen. Las im&aacute;genes m&aacute;s peque&ntilde;as se transfieren m&aacute;s r&aacute;pido, ocupan menos espacio de almacenamiento y requieren menos datos que analizar y mantener.<\/p><p class=\"wp-block-paragraph\">Ordena los argumentos de varias l&iacute;neas siempre que sea posible. Las listas de paquetes ordenadas reducen las entradas duplicadas, facilitan las revisiones y ayudan a detectar r&aacute;pidamente los cambios cuando se a&ntilde;aden o eliminan dependencias.<\/p><h2 class=\"wp-block-heading\" id=\"h-6-excluye-los-archivos-que-no-necesites-con-dockerignore\">6. Excluye los archivos que no necesites con .dockerignore<\/h2><p class=\"wp-block-paragraph\">Usa un archivo <code>.dockerignore<\/code> para excluir los archivos y directorios que no sean necesarios para la compilaci&oacute;n.<\/p><p class=\"wp-block-paragraph\">Docker env&iacute;a todo el contexto de compilaci&oacute;n al daemon de Docker antes de crear una imagen. Los archivos innecesarios aumentan tanto la cantidad de datos que Docker debe procesar como el riesgo de incluir informaci&oacute;n confidencial por error.<\/p><div class=\"wp-block-image\"><figure data-wp-context='{\"imageId\":\"6a7c1b94258bf\"}' data-wp-interactive=\"core\/image\" data-wp-key=\"6a7c1b94258bf\" class=\"aligncenter size-large wp-lightbox-container\"><img decoding=\"async\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/08\/Excluye-los-archivos-que-no-necesites-con-.dockerignore.jpg\/w=1024,h=1024,fit=scale-down\" alt=\"Diagrama del sistema que muestra c&oacute;mo .dockerignore filtra el contexto de compilaci&oacute;n de Docker: los archivos del proyecto pasan de izquierda a derecha por un filtro que excluye los archivos confidenciales e innecesarios, lo que permite optimizar el contexto de compilaci&oacute;n y crear im&aacute;genes de forma m&aacute;s r&aacute;pida y segura\" class=\"wp-image-55782\"><button class=\"lightbox-trigger\" type=\"button\" aria-haspopup=\"dialog\" data-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\" data-wp-init=\"callbacks.initTriggerButton\" data-wp-on--click=\"actions.showLightbox\" data-wp-style--right=\"state.thisImage.buttonRight\" data-wp-style--top=\"state.thisImage.buttonTop\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewbox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\"><\/path>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure><\/div><p class=\"wp-block-paragraph\">Excluye los archivos confidenciales, como los archivos <code>.env<\/code>, las claves SSH, las credenciales, los archivos de configuraci&oacute;n locales y otros secretos.<\/p><p class=\"wp-block-paragraph\">Si incluyes esos archivos por error en el contexto de compilaci&oacute;n, aumentas el riesgo de que se filtre informaci&oacute;n confidencial a trav&eacute;s de im&aacute;genes de contenedores, registros de im&aacute;genes o sistemas de compilaci&oacute;n.<\/p><p class=\"wp-block-paragraph\">Excluye tambi&eacute;n el contenido innecesario. Los metadatos del control de versiones, los registros locales, los archivos temporales, los artefactos de prueba, las cach&eacute;s de dependencias y los directorios de desarrollo aumentan la cantidad de datos que Docker tiene que procesar durante las compilaciones.<\/p><p class=\"wp-block-paragraph\">Un contexto de compilaci&oacute;n m&aacute;s peque&ntilde;o agiliza la creaci&oacute;n de im&aacute;genes, evita que ocupen espacio innecesario y limita su contenido a los archivos necesarios para ejecutar la aplicaci&oacute;n.<\/p><h2 class=\"wp-block-heading\" id=\"h-7-ejecuta-los-contenedores-como-usuario-no-root\">7. Ejecuta los contenedores como usuario no root<\/h2><p class=\"wp-block-paragraph\">Los procesos que se ejecutan como root tienen privilegios elevados dentro del contenedor, lo que aumenta el impacto potencial de un ataque.<\/p><p class=\"wp-block-paragraph\">Una vulnerabilidad que permite a un atacante ejecutar comandos dentro de un contenedor se vuelve m&aacute;s peligrosa cuando la aplicaci&oacute;n se ejecuta con permisos sin restricciones.<\/p><p class=\"wp-block-paragraph\">Crea un usuario espec&iacute;fico para la aplicaci&oacute;n y cambia a &eacute;l mediante la instrucci&oacute;n <code>USER<\/code> del Dockerfile. Ejecutar la aplicaci&oacute;n con una cuenta que no sea root limita los recursos a los que el proceso puede acceder y los cambios que puede realizar, lo que reduce el impacto si se aprovecha una vulnerabilidad de la aplicaci&oacute;n.<\/p><p class=\"wp-block-paragraph\">Aplica tambi&eacute;n el principio de m&iacute;nimo privilegio a los archivos y directorios. Concede a los contenedores acceso &uacute;nicamente a los archivos y recursos necesarios para su funcionamiento normal y configura los permisos del sistema de archivos en consecuencia.<\/p><p class=\"wp-block-paragraph\">Limitar los privilegios tanto a nivel de usuario como del sistema de archivos reduce la superficie de ataque y ayuda a contener los incidentes de seguridad cuando se producen.<\/p><h2 class=\"wp-block-heading\" id=\"h-8-gestiona-los-secretos-de-forma-segura-durante-la-ejecucion\">8. Gestiona los secretos de forma segura durante la ejecuci&oacute;n<\/h2><p class=\"wp-block-paragraph\">Las claves de API, las contrase&ntilde;as de bases de datos, los tokens de acceso y los certificados incluidos directamente en el c&oacute;digo permanecen integrados en la imagen y pueden quedar expuestos a trav&eacute;s de repositorios de c&oacute;digo fuente, registros de contenedores, an&aacute;lisis de im&aacute;genes o artefactos de compilaci&oacute;n compartidos.<\/p><p class=\"wp-block-paragraph\">Eliminar los datos confidenciales de las im&aacute;genes de contenedores evita que las credenciales se distribuyan junto con el c&oacute;digo de la aplicaci&oacute;n.<\/p><p>    <div class=\"announcement-block announcement-block--warning\">\n        <span class=\"announcement-block__heading\">\n            <svg width=\"24\" height=\"26\" viewBox=\"0 0 24 26\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n                d=\"M12 23.5C17.799 23.5 22.5 18.799 22.5 13C22.5 7.20101 17.799 2.5 12 2.5C6.20101 2.5 1.5 7.20101 1.5 13C1.5 18.799 6.20101 23.5 12 23.5ZM13.637 8.65198C13.637 7.74791 12.9041 7.01501 12 7.01501C11.0959 7.01501 10.363 7.74791 10.363 8.65198C10.5335 10.5375 10.875 14.383 10.875 14.383C10.875 15.0043 11.3787 15.508 12 15.508C12.6213 15.508 13.125 15.0043 13.125 14.383V14.38L13.637 8.65198ZM11.9927 16.714C11.3714 16.714 10.8677 17.2177 10.8677 17.839C10.8677 18.4603 11.3714 18.964 11.9927 18.964H12.0073C12.6286 18.964 13.1323 18.4603 13.1323 17.839C13.1323 17.2177 12.6286 16.714 12.0073 16.714H11.9927Z\"\n                fill=\"#BE1025\"\/>\n            <\/svg>\n            Warning        <\/span>\n        <p class=\"announcement-block__content\">\n            <strong>&iexcl;Advertencia!<\/strong> No pases secretos como argumentos de compilaci&oacute;n de Docker mediante <code>--build-arg<\/code>. Los valores que se pasan de esta forma se almacenan en el historial de capas de la imagen y se pueden recuperar con <code>docker history<\/code>, aunque no aparezcan en la imagen final ni en el Dockerfile.        <\/p>\n    <\/div>\n\n    \n\n\n\n<\/p><p class=\"wp-block-paragraph\">Guarda los valores confidenciales con herramientas dise&ntilde;adas para gestionar secretos, como HashiCorp Vault, AWS Secrets Manager y Azure Key Vault.<\/p><p class=\"wp-block-paragraph\">Docker secrets ofrece una opci&oacute;n m&aacute;s segura al montar los secretos directamente en los contenedores en ejecuci&oacute;n, sin exponerlos en variables de entorno, capas de imagen ni listados de procesos.<\/p><p class=\"wp-block-paragraph\">Las variables de entorno se usan mucho para la configuraci&oacute;n durante la ejecuci&oacute;n, pero deben considerarse una opci&oacute;n de reserva. Se pueden consultar con el comando docker inspect y pueden aparecer en los registros si una aplicaci&oacute;n muestra su entorno.<\/p><p class=\"wp-block-paragraph\">Sigue las <a href=\"\/co\/tutoriales\/variables-de-entorno-linux\/\">buenas pr&aacute;cticas para las variables de entorno<\/a>: guarda los valores confidenciales fuera del c&oacute;digo de la aplicaci&oacute;n, restringe el acceso a las credenciales y evita que los secretos se escriban en los registros.<\/p><p class=\"wp-block-paragraph\">En los despliegues a gran escala se suelen utilizar plataformas externas de gesti&oacute;n de secretos para centralizar el almacenamiento de credenciales, el control de acceso, la auditor&iacute;a y la rotaci&oacute;n.<\/p><p class=\"wp-block-paragraph\">Para evitar que se revelen datos confidenciales, no basta con elegir el m&eacute;todo de almacenamiento adecuado. Limita el acceso a los valores confidenciales, evita registrar las credenciales, revisa las im&aacute;genes por si se han incluido datos confidenciales por error y renueva las credenciales con regularidad.<\/p><h2 class=\"wp-block-heading\" id=\"h-9-limita-las-capacidades-y-los-recursos-de-los-contenedores\">9. Limita las capacidades y los recursos de los contenedores<\/h2><p class=\"wp-block-paragraph\">Los contenedores solo deben tener los permisos necesarios para cumplir su funci&oacute;n, as&iacute; que limita sus capacidades y recursos siguiendo el principio de m&iacute;nimo privilegio.<\/p><p class=\"wp-block-paragraph\">Los privilegios innecesarios aumentan el impacto de una intrusi&oacute;n, ya que permiten a los atacantes acceder a m&aacute;s recursos y funcionalidades del sistema de los que la aplicaci&oacute;n realmente necesita.<\/p><p class=\"wp-block-paragraph\">Evita ejecutar contenedores como root siempre que sea posible y limita el acceso a las partes sensibles del host.<\/p><p class=\"wp-block-paragraph\">Los espacios de nombres de usuario asignan los usuarios de los contenedores a cuentas con menos privilegios en el host, lo que reduce el riesgo de escape del contenedor y de escalada de privilegios.<\/p><p class=\"wp-block-paragraph\">Los sistemas de archivos de solo lectura ofrecen otra capa de protecci&oacute;n, ya que impiden que las aplicaciones y los atacantes modifiquen los archivos que deben permanecer inalterados durante el funcionamiento normal.<\/p><p class=\"wp-block-paragraph\">Elimina las capacidades que la aplicaci&oacute;n no necesite. Muchos contenedores no necesitan privilegios elevados de red, de administraci&oacute;n del sistema ni relacionados con el kernel, aunque esas capacidades pueden estar disponibles por defecto.<\/p><p class=\"wp-block-paragraph\">Limitar las capacidades reduce el n&uacute;mero de acciones que puede realizar un contenedor comprometido y ayuda a minimizar la superficie de ataque global.<\/p><p class=\"wp-block-paragraph\">Establece l&iacute;mites expl&iacute;citos de recursos para evitar que los contenedores consuman m&aacute;s de la parte que les corresponde de CPU y memoria. Sin l&iacute;mites, un solo contenedor puede agotar los recursos del host y afectar a otras cargas de trabajo que se est&eacute;n ejecutando en el mismo sistema.<\/p><h2 class=\"wp-block-heading\" id=\"h-10-disena-contenedores-sin-estado-y-efimeros\">10. Dise&ntilde;a contenedores sin estado y ef&iacute;meros<\/h2><p class=\"wp-block-paragraph\">Dise&ntilde;a contenedores sin estado y ef&iacute;meros para poder detenerlos, eliminarlos y volver a crearlos sin perder datos importantes.<\/p><p class=\"wp-block-paragraph\">Un contenedor deber&iacute;a ejecutar el proceso de la aplicaci&oacute;n, no servir como lugar de almacenamiento permanente para archivos, bases de datos, sesiones o archivos subidos por los usuarios.<\/p><p class=\"wp-block-paragraph\">Guarda los datos persistentes fuera del contenedor. Los vol&uacute;menes de Docker, las bases de datos gestionadas, el almacenamiento de objetos y los servicios externos garantizan que los datos importantes sigan estando disponibles incluso cuando se sustituyan los contenedores durante actualizaciones, fallos u operaciones de escalado.<\/p><p class=\"wp-block-paragraph\">Separar la ejecuci&oacute;n de la aplicaci&oacute;n del almacenamiento persistente tambi&eacute;n facilita la gesti&oacute;n de los backups, las migraciones y los procesos de recuperaci&oacute;n.<\/p><p class=\"wp-block-paragraph\">Los contenedores sin estado son m&aacute;s f&aacute;ciles de escalar y orquestar. Las plataformas de orquestaci&oacute;n pueden reiniciar los contenedores que fallan, mover cargas de trabajo entre hosts y crear r&eacute;plicas adicionales sin depender de los datos almacenados dentro de una instancia concreta de contenedor.<\/p><h2 class=\"wp-block-heading\" id=\"h-11-anade-comprobaciones-de-estado-a-los-servicios-de-larga-duracion\">11. A&ntilde;ade comprobaciones de estado a los servicios de larga duraci&oacute;n<\/h2><p class=\"wp-block-paragraph\">A&ntilde;adir comprobaciones de estado a los servicios que se ejecutan durante mucho tiempo permite que Docker y las plataformas de orquestaci&oacute;n detecten cu&aacute;ndo un contenedor deja de funcionar correctamente.<\/p><p class=\"wp-block-paragraph\">Que un contenedor est&eacute; en ejecuci&oacute;n no significa que funcione correctamente. Una aplicaci&oacute;n puede dejar de responder a las solicitudes, perder la conexi&oacute;n con la base de datos o entrar en un estado de fallo mientras el proceso del contenedor contin&uacute;a ejecut&aacute;ndose.<\/p><p class=\"wp-block-paragraph\">La instrucci&oacute;n <code>HEALTHCHECK<\/code> permite a Docker realizar comprobaciones peri&oacute;dicas e informar sobre el estado del contenedor.<\/p><p class=\"wp-block-paragraph\">Las comprobaciones de estado permiten verificar que una aplicaci&oacute;n responda a las solicitudes HTTP, acepte conexiones o realice otras funciones b&aacute;sicas necesarias para su funcionamiento normal.<\/p><p>        <div class=\"protip\">\n            <div class=\"protip__heading\">\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                    <path d=\"M1.49234 23.5024C1.23229 23.5024 0.972242 23.4024 0.782206 23.2123C0.562165 22.9923 0.452144 22.6822 0.502153 22.3722C0.562165 21.9221 1.14227 17.9113 3.00262 16.351C3.63274 15.8209 4.43289 15.5509 5.26305 15.5609C6.09321 15.5909 6.87335 15.9109 7.47347 16.4911C8.6937 17.6913 8.76371 19.6717 7.6435 20.9919C6.0832 22.8523 2.08245 23.4324 1.63237 23.4924C1.59236 23.4924 1.54235 23.4924 1.50234 23.4924L1.49234 23.5024ZM5.16303 17.5613C4.84297 17.5613 4.53291 17.6713 4.29287 17.8813C3.60274 18.4614 3.07264 19.9317 2.75258 21.242C4.06282 20.9219 5.5331 20.3918 6.11321 19.7017C6.55329 19.1716 6.54329 18.3814 6.0832 17.9213C5.85316 17.7013 5.5431 17.5713 5.20304 17.5613C5.19304 17.5613 5.17303 17.5613 5.16303 17.5613ZM11.7243 21.8821C11.4942 21.8821 11.2642 21.8021 11.0841 21.652C10.8541 21.462 10.7241 21.1819 10.7241 20.8819V15.9109L8.08358 13.2705H3.11264C2.81259 13.2705 2.53254 13.1404 2.3425 12.9104C2.15246 12.6803 2.07245 12.3803 2.12246 12.0902C2.19247 11.7102 2.84259 8.36953 4.70294 7.12929C6.33325 6.04909 8.96375 6.49918 10.244 6.80923C11.5442 4.96889 13.2546 3.4286 15.2349 2.33839C17.4553 1.11816 19.9858 0.518051 22.4963 0.498047C23.0464 0.498047 23.4865 0.948132 23.4865 1.49824C23.4865 5.0389 22.3763 9.97983 17.1753 13.7605C17.4853 15.0408 17.9354 17.6613 16.8552 19.2816C15.615 21.1419 12.2744 21.7921 11.8943 21.8621C11.8343 21.8721 11.7743 21.8821 11.7143 21.8821H11.7243ZM12.7245 16.181V19.6016C13.7146 19.2916 14.7948 18.7915 15.2049 18.1814C15.675 17.4812 15.605 16.091 15.385 14.9008C14.5248 15.3808 13.6346 15.8109 12.7245 16.181ZM9.66388 12.0302L11.9643 14.3307C13.1845 13.8306 14.3648 13.2204 15.485 12.5103C19.9358 9.51974 21.2361 5.60901 21.4561 2.53843C19.6157 2.67846 17.8254 3.20856 16.2051 4.09872C14.2847 5.14892 12.6544 6.68921 11.4942 8.54956C10.7841 9.65977 10.174 10.82 9.66388 12.0302ZM4.39289 11.2701H7.81353C8.1936 10.3599 8.63368 9.46974 9.11377 8.60957C7.92355 8.38953 6.51329 8.31952 5.81315 8.78961C5.19304 9.19968 4.70294 10.3099 4.39289 11.2701Z\" fill=\"#673DE6\"\/>\n                <\/svg>\n                <p class=\"protip__title\">\n                    Consejo profesional                <\/p>\n            <\/div>\n            <p class=\"protip__content\"> Ajusta los par&aacute;metros <code>--interval<\/code>, <code>--timeout<\/code> y <code>--retries<\/code> en funci&oacute;n del tiempo de inicio de la aplicaci&oacute;n. Por ejemplo, un servicio que tarda 30 segundos en inicializarse deber&iacute;a usar <code>--start-period=30s<\/code> para evitar falsos errores durante el arranque.<\/p>\n                    <\/div>\n        \n\n\n\n<\/p><p class=\"wp-block-paragraph\">Las plataformas de orquestaci&oacute;n usan la informaci&oacute;n sobre el estado de los contenedores para tomar decisiones autom&aacute;ticas de recuperaci&oacute;n. Si fallan las comprobaciones de estado, pueden reiniciar los contenedores, sustituir las instancias que no funcionan correctamente o retirar los contenedores del enrutamiento del tr&aacute;fico.<\/p><p class=\"wp-block-paragraph\">La detecci&oacute;n temprana de fallos en las aplicaciones reduce el tiempo de inactividad y ayuda a mantener la disponibilidad del servicio en los entornos de producci&oacute;n.<\/p><h2 class=\"wp-block-heading\" id=\"h-12-analiza-las-imagenes-en-busca-de-vulnerabilidades-con-regularidad\">12. Analiza las im&aacute;genes en busca de vulnerabilidades con regularidad<\/h2><p class=\"wp-block-paragraph\">Analizar las im&aacute;genes de los contenedores con regularidad permite detectar vulnerabilidades conocidas antes de que lleguen al entorno de producci&oacute;n.<\/p><p class=\"wp-block-paragraph\">Los esc&aacute;neres de vulnerabilidades como Trivy, Docker Scout y Snyk comparan los paquetes, las bibliotecas y las dependencias instaladas con bases de datos de seguridad, lo que ayuda a los equipos a detectar software obsoleto y problemas de seguridad conocidos en una fase temprana del proceso de desarrollo.<\/p><div class=\"wp-block-image\"><figure data-wp-context='{\"imageId\":\"6a7c1b942ad28\"}' data-wp-interactive=\"core\/image\" data-wp-key=\"6a7c1b942ad28\" class=\"aligncenter size-large wp-lightbox-container\"><img decoding=\"async\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/32\/2026\/08\/Analiza-las-imagenes-en-busca-de-vulnerabilidades-con-regularidad.jpg\/w=1024,h=1024,fit=scale-down\" alt=\"Diagrama de un sistema de an&aacute;lisis de seguridad de contenedores: ilustraci&oacute;n vectorial plana en morado oscuro que muestra un flujo de tres m&oacute;dulos con una imagen de contenedor por capas, un esc&aacute;ner de vulnerabilidades conectado a una base de datos de seguridad y una canalizaci&oacute;n de CI\/CD automatizada que act&uacute;a como control antes de pasar a producci&oacute;n\" class=\"wp-image-55783\"><button class=\"lightbox-trigger\" type=\"button\" aria-haspopup=\"dialog\" data-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\" data-wp-init=\"callbacks.initTriggerButton\" data-wp-on--click=\"actions.showLightbox\" data-wp-style--right=\"state.thisImage.buttonRight\" data-wp-style--top=\"state.thisImage.buttonTop\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewbox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\"><\/path>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure><\/div><p class=\"wp-block-paragraph\">Integra el an&aacute;lisis de im&aacute;genes en las canalizaciones de CI\/CD para que las comprobaciones de seguridad se ejecuten autom&aacute;ticamente durante las compilaciones y los despliegues.<\/p><p class=\"wp-block-paragraph\">El an&aacute;lisis autom&aacute;tico ayuda a detectar vulnerabilidades antes de que las im&aacute;genes se publiquen en los registros o se desplieguen en entornos de producci&oacute;n, lo que reduce el riesgo de desplegar versiones poco seguras.<\/p><p class=\"wp-block-paragraph\">Analiza tanto la imagen base como las capas de la aplicaci&oacute;n. Una aplicaci&oacute;n segura puede seguir heredando vulnerabilidades de una imagen base desactualizada, mientras que una imagen base totalmente actualizada no protege contra las dependencias inseguras de la aplicaci&oacute;n.<\/p><p class=\"wp-block-paragraph\">Analizar la imagen completa ofrece una visi&oacute;n m&aacute;s precisa de la seguridad de los contenedores y ayuda a priorizar las medidas correctivas antes del despliegue.<\/p><h2 class=\"wp-block-heading\" id=\"h-13-supervisa-y-registra-la-actividad-de-los-contenedores\">13. Supervisa y registra la actividad de los contenedores<\/h2><p class=\"wp-block-paragraph\">La supervisi&oacute;n y el registro de la actividad de los contenedores permiten mantener una visi&oacute;n clara del estado, el rendimiento y los fallos de las aplicaciones.<\/p><p class=\"wp-block-paragraph\">Los entornos basados en contenedores son din&aacute;micos por naturaleza, ya que los contenedores se inician, se detienen, se escalan y se sustituyen con frecuencia. Sin una observabilidad fiable, identificar el origen de los problemas de rendimiento o de los fallos de las aplicaciones se vuelve mucho m&aacute;s dif&iacute;cil.<\/p><p class=\"wp-block-paragraph\">Centraliza los registros y recopila m&eacute;tricas de los contenedores, los hosts y los servicios auxiliares. Los registros centralizados facilitan la investigaci&oacute;n de errores en aplicaciones distribuidas, mientras que las m&eacute;tricas permiten hacer un seguimiento del uso de recursos, los tiempos de respuesta, el volumen de solicitudes y otros indicadores del estado de las aplicaciones.<\/p><p class=\"wp-block-paragraph\">En conjunto, los registros y las m&eacute;tricas te dan el contexto que necesitas para solucionar problemas e identificar los cuellos de botella en el rendimiento.<\/p><p class=\"wp-block-paragraph\">Usa herramientas de monitorizaci&oacute;n que se integren bien con los entornos de contenedores. Prometheus y Grafana se usan mucho para recopilar y visualizar m&eacute;tricas, mientras que soluciones como la pila ELK (Elasticsearch, Logstash y Kibana) y Loki ayudan a centralizar y analizar los registros de los contenedores.<\/p><p class=\"wp-block-paragraph\">Recopilar registros y m&eacute;tricas solo sirve de algo si se avisa a las personas adecuadas cuando algo va mal. Configura alertas para las situaciones que indiquen problemas reales: uso elevado y prolongado de la CPU o la memoria, picos en la tasa de errores, comprobaciones de estado fallidas y contenedores que se reinician una y otra vez.<\/p><p class=\"wp-block-paragraph\">Env&iacute;a las alertas a los canales adecuados, como una plataforma de mensajer&iacute;a, una herramienta de gesti&oacute;n de incidencias o un sistema de turnos de guardia, para que se act&uacute;e ante los problemas en lugar de descubrirlos cuando ya se han producido.<\/p><h2 class=\"wp-block-heading\" id=\"h-14-limpia-los-recursos-de-docker-que-no-uses\">14. Limpia los recursos de Docker que no uses<\/h2><p class=\"wp-block-paragraph\">Limpia con regularidad los recursos de Docker que no uses para recuperar espacio de almacenamiento y mantener organizados los servidores de contenedores.<\/p><p class=\"wp-block-paragraph\">Las im&aacute;genes que no se usan, los contenedores detenidos, los vol&uacute;menes hu&eacute;rfanos y las redes que no se usan se van acumulando con el tiempo, sobre todo en entornos de desarrollo y sistemas de CI\/CD en los que se crean y se despliegan im&aacute;genes con frecuencia.<\/p><p class=\"wp-block-paragraph\">Elimina los recursos que ya no necesites con comandos de limpieza de Docker como <code>docker image prune<\/code>, <code>docker container prune<\/code>, <code>docker volume prune<\/code> y <code>docker system prune<\/code>.<\/p><p>    <div class=\"announcement-block announcement-block--warning\">\n        <span class=\"announcement-block__heading\">\n            <svg width=\"24\" height=\"26\" viewBox=\"0 0 24 26\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n                d=\"M12 23.5C17.799 23.5 22.5 18.799 22.5 13C22.5 7.20101 17.799 2.5 12 2.5C6.20101 2.5 1.5 7.20101 1.5 13C1.5 18.799 6.20101 23.5 12 23.5ZM13.637 8.65198C13.637 7.74791 12.9041 7.01501 12 7.01501C11.0959 7.01501 10.363 7.74791 10.363 8.65198C10.5335 10.5375 10.875 14.383 10.875 14.383C10.875 15.0043 11.3787 15.508 12 15.508C12.6213 15.508 13.125 15.0043 13.125 14.383V14.38L13.637 8.65198ZM11.9927 16.714C11.3714 16.714 10.8677 17.2177 10.8677 17.839C10.8677 18.4603 11.3714 18.964 11.9927 18.964H12.0073C12.6286 18.964 13.1323 18.4603 13.1323 17.839C13.1323 17.2177 12.6286 16.714 12.0073 16.714H11.9927Z\"\n                fill=\"#BE1025\"\/>\n            <\/svg>\n            Warning        <\/span>\n        <p class=\"announcement-block__content\">\n            <strong>&iexcl;Advertencia!<\/strong> Al ejecutar <code>docker system prune -a<\/code>, se eliminan todas las im&aacute;genes que no se est&eacute;n utilizando, no solo las im&aacute;genes hu&eacute;rfanas. Esto incluye las im&aacute;genes que no est&eacute;n asociadas en ese momento a un contenedor en ejecuci&oacute;n y que podr&iacute;an ser necesarias para futuros despliegues. Comprueba siempre qu&eacute; se va a eliminar antes de ejecutar este comando en entornos compartidos o de producci&oacute;n.        <\/p>\n    <\/div>\n\n    \n\n\n\n<\/p><p class=\"wp-block-paragraph\">Los scripts de limpieza autom&aacute;ticos y las tareas de mantenimiento programadas ayudan a evitar la acumulaci&oacute;n de recursos en los servidores que llevan mucho tiempo en funcionamiento sin que haga falta intervenir manualmente.<\/p><p class=\"wp-block-paragraph\">El consumo de almacenamiento afecta a m&aacute;s aspectos que el uso del disco. Una gran cantidad de recursos sin usar complica la gesti&oacute;n de los entornos, aumenta el tama&ntilde;o de los backups y ocupa espacio que podr&iacute;an aprovechar las cargas de trabajo activas.<\/p><h2 class=\"wp-block-heading\" id=\"h-15-prueba-los-contenedores-antes-del-despliegue\">15. Prueba los contenedores antes del despliegue<\/h2><p class=\"wp-block-paragraph\">Probar los contenedores antes del despliegue te permite asegurarte de que la imagen funciona igual que lo har&aacute; en producci&oacute;n.<\/p><p class=\"wp-block-paragraph\">Que la compilaci&oacute;n se complete correctamente solo demuestra que Docker ha creado una imagen. No significa que la aplicaci&oacute;n se inicie correctamente, se conecte a los servicios necesarios, gestione el tr&aacute;fico o cumpla los requisitos de seguridad.<\/p><p class=\"wp-block-paragraph\">Incorpora pruebas de contenedores al flujo de trabajo de desarrollo. Las pruebas unitarias validan la l&oacute;gica de la aplicaci&oacute;n, las pruebas de integraci&oacute;n verifican las conexiones entre servicios dentro de los contenedores y los an&aacute;lisis de seguridad comprueban si las im&aacute;genes tienen vulnerabilidades conocidas antes del lanzamiento.<\/p><p class=\"wp-block-paragraph\">Las pruebas de rendimiento tambi&eacute;n ayudan a detectar tiempos de arranque lentos, l&iacute;mites de recursos y problemas de ejecuci&oacute;n que solo se producen en el entorno de contenedores.<\/p><p class=\"wp-block-paragraph\">Automatiza las pruebas de contenedores siempre que puedas. Las herramientas de CI\/CD, como GitHub Actions, GitLab CI\/CD, Jenkins y CircleCI, pueden crear im&aacute;genes, ejecutar pruebas, buscar vulnerabilidades y bloquear el despliegue cuando fallan las comprobaciones.<\/p><p class=\"wp-block-paragraph\">Las pruebas automatizadas reducen el riesgo de desplegar contenedores defectuosos o poco seguros en el entorno de producci&oacute;n.<\/p><h2 class=\"wp-block-heading\" id=\"h-como-elegir-la-plataforma-de-orquestacion-de-contenedores-adecuada\">C&oacute;mo elegir la plataforma de orquestaci&oacute;n de contenedores adecuada<\/h2><p class=\"wp-block-paragraph\">Elige una plataforma de orquestaci&oacute;n de contenedores en funci&oacute;n de la complejidad de tu entorno, tus requisitos de escalabilidad, tus recursos operativos y tus necesidades de integraci&oacute;n.<\/p><p class=\"wp-block-paragraph\">La elecci&oacute;n adecuada no depende tanto de la lista de funciones como de la infraestructura que tengas que gestionar.<\/p><p class=\"wp-block-paragraph\"><strong>Empieza por evaluar el volumen y la complejidad de la carga de trabajo<\/strong>. Las aplicaciones que ejecutan un n&uacute;mero reducido de contenedores suelen necesitar menos funciones de orquestaci&oacute;n que los grandes sistemas distribuidos con decenas o cientos de servicios.<\/p><p class=\"wp-block-paragraph\">Gestionar una plataforma m&aacute;s potente de lo que requiere la carga de trabajo a&ntilde;ade complejidad operativa sin aportar beneficios significativos.<\/p><p class=\"wp-block-paragraph\"><strong>A continuaci&oacute;n, piensa en el nivel de automatizaci&oacute;n que necesitas<\/strong>. Kubernetes ofrece funciones avanzadas como el escalado autom&aacute;tico, la autorreparaci&oacute;n, el descubrimiento de servicios y los despliegues progresivos.<\/p><p class=\"wp-block-paragraph\">Esas funciones son muy &uacute;tiles en entornos de producci&oacute;n a gran escala, pero tambi&eacute;n aumentan la complejidad de la configuraci&oacute;n, el mantenimiento y la gesti&oacute;n.<\/p><p class=\"wp-block-paragraph\">Docker Swarm y HashiCorp Nomad ofrecen alternativas m&aacute;s sencillas. Docker Swarm se integra estrechamente con Docker y requiere gestionar menos componentes que Kubernetes.<\/p><p class=\"wp-block-paragraph\">Nomad admite tanto cargas de trabajo en contenedores como cargas de trabajo sin contenedores y se integra bien con herramientas como Consul y Vault.<\/p><p class=\"wp-block-paragraph\">Ambas plataformas son m&aacute;s f&aacute;ciles de gestionar cuando no se necesitan funciones avanzadas de orquestaci&oacute;n.<\/p><p class=\"wp-block-paragraph\"><strong>Ten en cuenta el respaldo de la comunidad y la madurez del ecosistema antes de tomar una decisi&oacute;n definitiva<\/strong>. Kubernetes cuenta con el ecosistema m&aacute;s amplio, ofrece compatibilidad con m&aacute;s herramientas y dispone de la documentaci&oacute;n m&aacute;s completa.<\/p><p class=\"wp-block-paragraph\">Las plataformas m&aacute;s peque&ntilde;as pueden ser m&aacute;s f&aacute;ciles de gestionar, pero ofrecen menos integraciones con servicios de terceros y menos recursos de formaci&oacute;n.<\/p><p class=\"wp-block-paragraph\">La plataforma de orquestaci&oacute;n es solo una parte de la estrategia de despliegue. Contar con una infraestructura fiable es igual de importante para ejecutar cargas de trabajo en contenedores.<\/p><p class=\"wp-block-paragraph\">El <a href=\"\/co\/docker-hosting\">Hosting VPS con Docker de Hostinger<\/a> ofrece recursos dedicados de CPU, RAM y almacenamiento, adem&aacute;s de un Administrador de Docker integrado, backups autom&aacute;ticos y herramientas de administraci&oacute;n de servidores asistidas por IA que simplifican el despliegue y la gesti&oacute;n de contenedores.<\/p><figure class=\"wp-block-image size-large\"><a href=\"\/co\/servidor-vps\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"1024\" height=\"300\" src=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/40\/2023\/02\/ES-VPS-hosting_in-text-banner.png\/w=1024,h=1024,fit=scale-down\" alt=\"\" class=\"wp-image-29287\" srcset=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/40\/2023\/02\/ES-VPS-hosting_in-text-banner.png\/w=1024,fit=scale-down 1024w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/40\/2023\/02\/ES-VPS-hosting_in-text-banner.png\/w=300,fit=scale-down 300w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/40\/2023\/02\/ES-VPS-hosting_in-text-banner.png\/w=150,fit=scale-down 150w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/40\/2023\/02\/ES-VPS-hosting_in-text-banner.png\/w=768,fit=scale-down 768w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/40\/2023\/02\/ES-VPS-hosting_in-text-banner.png\/w=1536,fit=scale-down 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Las buenas pr&aacute;cticas de Docker son pautas para crear, ejecutar y mantener contenedores de forma segura y eficiente. Docker empaqueta las aplicaciones y sus dependencias en contenedores port&aacute;tiles que funcionan de forma uniforme en distintos entornos. Esta uniformidad simplifica el desarrollo y el despliegue, pero para que la contenedorizaci&oacute;n sea fiable no basta con empaquetar [&#8230;]<\/p>\n<p><a class=\"btn btn-secondary understrap-read-more-link\" href=\"\/co\/tutoriales\/buenas-practicas-docker\/\">Read More&#8230;<\/a><\/p>\n","protected":false},"author":190,"featured_media":47767,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"rank_math_title":"Buenas pr\u00e1cticas de Docker para optimizar tus contenedores","rank_math_description":"Descubre buenas pr\u00e1cticas de Docker para crear contenedores seguros y eficientes, optimizar im\u00e1genes, gestionar secretos y mejorar tus despliegues.","rank_math_focus_keyword":"buenas pr\u00e1cticas de Docker","footnotes":""},"categories":[14501],"tags":[],"class_list":["post-47766","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-vps"],"hreflangs":[{"locale":"es-ES","link":"https:\/\/www.hostinger.com\/es\/tutoriales\/buenas-practicas-docker","default":1},{"locale":"es-AR","link":"https:\/\/www.hostinger.com\/ar\/tutoriales\/buenas-practicas-docker","default":0},{"locale":"es-MX","link":"https:\/\/www.hostinger.com\/mx\/tutoriales\/buenas-practicas-docker","default":0},{"locale":"es-CO","link":"https:\/\/www.hostinger.com\/co\/tutoriales\/buenas-practicas-docker","default":0}],"acf":[],"_links":{"self":[{"href":"https:\/\/www.hostinger.com\/co\/tutoriales\/wp-json\/wp\/v2\/posts\/47766","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hostinger.com\/co\/tutoriales\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hostinger.com\/co\/tutoriales\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/co\/tutoriales\/wp-json\/wp\/v2\/users\/190"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/co\/tutoriales\/wp-json\/wp\/v2\/comments?post=47766"}],"version-history":[{"count":0,"href":"https:\/\/www.hostinger.com\/co\/tutoriales\/wp-json\/wp\/v2\/posts\/47766\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/co\/tutoriales\/wp-json\/wp\/v2\/media\/47767"}],"wp:attachment":[{"href":"https:\/\/www.hostinger.com\/co\/tutoriales\/wp-json\/wp\/v2\/media?parent=47766"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hostinger.com\/co\/tutoriales\/wp-json\/wp\/v2\/categories?post=47766"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hostinger.com\/co\/tutoriales\/wp-json\/wp\/v2\/tags?post=47766"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}