{"id":1281,"date":"2026-03-12T14:20:09","date_gmt":"2026-03-12T17:20:09","guid":{"rendered":"https:\/\/maurobernal.com.ar\/blog\/?p=1281"},"modified":"2026-03-12T14:20:09","modified_gmt":"2026-03-12T17:20:09","slug":"docker-compose-de-cero-a-produccion-parte-2","status":"publish","type":"post","link":"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-2\/","title":{"rendered":"Docker Compose de cero a producci\u00f3n \u2014 Parte 2: CLI, dependencias robustas y perfiles"},"content":{"rendered":"\n<p>Esta es la segunda parte de la serie <strong>Docker Compose de cero a producci\u00f3n<\/strong>. En la <a href=\"\/docker-compose-de-cero-a-produccion-parte-1\">Parte 1<\/a> vimos qu\u00e9 es Compose y c\u00f3mo estructurar el archivo <code>compose.yaml<\/code>. Ahora le toca al d\u00eda a d\u00eda: los comandos que vas a escribir decenas de veces, c\u00f3mo hacer que las dependencias entre servicios funcionen bien de verdad, y c\u00f3mo manejar servicios opcionales con perfiles.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Los comandos que m\u00e1s vas a usar<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Ciclo de vida<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"># Levantar todo en segundo plano\ndocker compose up -d\n\n# Levantar y forzar reconstrucci\u00f3n de im\u00e1genes\ndocker compose up -d --build\n\n# Levantar solo servicios espec\u00edficos\ndocker compose up -d api db\n\n# Detener y eliminar contenedores + redes (conserva vol\u00famenes)\ndocker compose down\n\n# Detener y eliminar TODO incluyendo vol\u00famenes (\u00a1cuidado: borra datos!)\ndocker compose down -v\n\n# Solo detener sin eliminar (los contenedores quedan, solo se apagan)\ndocker compose stop\n\n# Iniciar contenedores ya existentes (sin recrear)\ndocker compose start\n\n# Reiniciar servicios\ndocker compose restart api<\/code><\/pre>\n\n\n\n<p>La diferencia entre <code>stop<\/code>\/<code>start<\/code> y <code>down<\/code>\/<code>up<\/code> importa: <code>stop<\/code> preserva los contenedores existentes (m\u00e1s r\u00e1pido para reinicios), mientras que <code>down<\/code> los elimina completamente (\u00fatil para empezar limpio).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Inspecci\u00f3n y debugging<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"># Ver estado de todos los contenedores del proyecto\ndocker compose ps\n\n# Ver logs de todos los servicios en tiempo real\ndocker compose logs -f\n\n# Ver logs solo de un servicio, \u00faltimas 50 l\u00edneas\ndocker compose logs -f --tail=50 api\n\n# Entrar a un contenedor con una shell interactiva\ndocker compose exec api bash\ndocker compose exec db psql -U myuser -d mydb\n\n# Ejecutar un comando puntual en un contenedor nuevo (y eliminarlo al terminar)\ndocker compose run --rm api npm run migrate\n\n# Ver procesos dentro de cada servicio\ndocker compose top\n\n# Validar y ver la configuraci\u00f3n final (muy \u00fatil para depurar overrides y variables)\ndocker compose config<\/code><\/pre>\n\n\n\n<p><code>docker compose config<\/code> es uno de los comandos m\u00e1s \u00fatiles que tard\u00e9 en descubrir: muestra la configuraci\u00f3n final despu\u00e9s de fusionar todos los archivos y reemplazar variables de entorno. Ideal para verificar que los overrides est\u00e1n funcionando como esper\u00e1s.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Gesti\u00f3n de im\u00e1genes<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"># Construir im\u00e1genes sin levantar servicios\ndocker compose build\n\n# Construir solo un servicio espec\u00edfico\ndocker compose build api\n\n# Descargar las \u00faltimas versiones de las im\u00e1genes\ndocker compose pull\n\n# Ver qu\u00e9 im\u00e1genes usa el proyecto\ndocker compose images<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">depends_on y healthchecks: dependencias que funcionan de verdad<\/h2>\n\n\n\n<p>Este es uno de los puntos donde m\u00e1s errores comet\u00ed al principio. <code>depends_on: db<\/code> solo garantiza que el <em>contenedor<\/em> de la base de datos inicie antes \u2014 no que la base de datos est\u00e9 lista para aceptar conexiones. El resultado: la API arranca, intenta conectarse a Postgres que todav\u00eda est\u00e1 inicializ\u00e1ndose, falla, y el contenedor muere.<\/p>\n\n\n\n<p>La soluci\u00f3n correcta: combinar <code>depends_on<\/code> con <code>healthcheck<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">services:\n  api:\n    build: .\n    depends_on:\n      db:\n        condition: service_healthy   # Espera hasta que db est\u00e9 HEALTHY, no solo running\n      cache:\n        condition: service_started   # Para este, alcanza con que est\u00e9 corriendo\n\n  db:\n    image: postgres:15-alpine\n    environment:\n      POSTGRES_USER: myuser\n      POSTGRES_DB: mydb\n      POSTGRES_PASSWORD: mypassword\n    healthcheck:\n      # Comando que se ejecuta dentro del contenedor para verificar salud\n      test: [\"CMD-SHELL\", \"pg_isready -U myuser -d mydb\"]\n      interval: 10s      # Verificar cada 10 segundos\n      timeout: 5s        # Esperar m\u00e1ximo 5 segundos por respuesta\n      retries: 5         # Marcar como unhealthy despu\u00e9s de 5 fallos\n      start_period: 30s  # Per\u00edodo de gracia al inicio (no cuenta como fallo)\n\n  cache:\n    image: redis:alpine\n    healthcheck:\n      test: [\"CMD\", \"redis-cli\", \"ping\"]\n      interval: 5s\n      timeout: 3s\n      retries: 3<\/code><\/pre>\n\n\n\n<p>Las tres condiciones disponibles para <code>depends_on<\/code>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>service_started<\/code>: el contenedor arranc\u00f3 (comportamiento por defecto, no espera que la app est\u00e9 lista)<\/li>\n<li><code>service_healthy<\/code>: el healthcheck del servicio devuelve \u00e9xito \u2014 el que m\u00e1s us\u00e1s<\/li>\n<li><code>service_completed_successfully<\/code>: para tareas de inicializaci\u00f3n que deben completarse antes de continuar (migraciones, seeds)<\/li>\n<\/ul>\n\n\n\n<p>Ejemplo pr\u00e1ctico de <code>service_completed_successfully<\/code> para migraciones:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">services:\n  migrate:\n    build: .\n    command: [\"npm\", \"run\", \"migrate\"]   # Se ejecuta una vez y termina\n    depends_on:\n      db:\n        condition: service_healthy\n\n  api:\n    build: .\n    depends_on:\n      migrate:\n        condition: service_completed_successfully  # La API arranca despu\u00e9s de migrar\n      db:\n        condition: service_healthy<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Escalado: m\u00faltiples instancias de un servicio<\/h2>\n\n\n\n<p>Compose permite correr m\u00faltiples instancias del mismo servicio con el flag <code>--scale<\/code>. \u00datil para simular carga durante desarrollo o para escalar workers en background.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"># Levantar 3 instancias del servicio 'worker'\ndocker compose up -d --scale worker=3\n\n# Escalar mientras el proyecto ya est\u00e1 corriendo\ndocker compose up -d --scale api=2 --scale worker=5<\/code><\/pre>\n\n\n\n<p>Dos cosas importantes para que el escalado funcione:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>No uses <code>container_name<\/code><\/strong> en servicios que vas a escalar (los nombres deben ser \u00fanicos)<\/li>\n<li><strong>No mapees puertos fijos al host<\/strong> \u2014 us\u00e1 puertos ef\u00edmeros (<code>\"3000\"<\/code> en lugar de <code>\"3000:3000\"<\/code>) o rangos (<code>\"3000-3005:3000\"<\/code>)<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">services:\n  api:\n    build: .\n    ports:\n      - \"3000\"    # Puerto ef\u00edmero: Docker asigna un puerto libre del host por instancia\n    # NO poner container_name si vas a escalar<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Perfiles: servicios que no siempre quer\u00e9s levantar<\/h2>\n\n\n\n<p>Siempre hay servicios auxiliares que solo necesit\u00e1s en ciertas situaciones: un gestor de base de datos visual, un servidor de correo falso para desarrollo, un servicio de m\u00e9tricas. Con perfiles pod\u00e9s tenerlos definidos en el mismo archivo pero inactivos por defecto.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">services:\n  api:\n    build: .\n    # Sin perfil = siempre activo\n\n  db:\n    image: postgres:15\n    # Sin perfil = siempre activo\n\n  # Solo activo con el perfil 'tools'\n  pgadmin:\n    image: dpage\/pgadmin4\n    profiles: [\"tools\"]\n    ports:\n      - \"5050:80\"\n    environment:\n      PGADMIN_DEFAULT_EMAIL: admin@local.com\n      PGADMIN_DEFAULT_PASSWORD: admin\n\n  # Solo activo con el perfil 'tools'\n  mailhog:\n    image: mailhog\/mailhog\n    profiles: [\"tools\"]\n    ports:\n      - \"8025:8025\"   # UI web para ver emails enviados en desarrollo\n\n  # Solo activo con el perfil 'monitoring'\n  prometheus:\n    image: prom\/prometheus\n    profiles: [\"monitoring\"]<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\"># Solo servicios base (api + db)\ndocker compose up -d\n\n# Servicios base + herramientas de administraci\u00f3n\ndocker compose --profile tools up -d\n\n# Todo a la vez\ndocker compose --profile tools --profile monitoring up -d<\/code><\/pre>\n\n\n\n<p>Uso esto constantemente para pgAdmin, Adminer, MailHog o Kibana. Est\u00e1n definidos, documentados y listos para usar cuando los necesito, pero no arrancan por defecto y no consumen recursos innecesariamente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Resumen de la Parte 2<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&#x2705; <strong>CLI:<\/strong> <code>up\/down\/logs\/exec\/config<\/code> son los comandos del d\u00eda a d\u00eda<\/li>\n<li>&#x2705; <strong>depends_on + healthcheck:<\/strong> la combinaci\u00f3n correcta para dependencias reales entre servicios<\/li>\n<li>&#x2705; <strong>Escalado:<\/strong> <code>--scale<\/code> para m\u00faltiples instancias, sin <code>container_name<\/code> ni puertos fijos<\/li>\n<li>&#x2705; <strong>Perfiles:<\/strong> servicios auxiliares disponibles cuando los necesit\u00e1s, sin que estorben el resto<\/li>\n<\/ul>\n\n\n\n<p>En la <a href=\"\/docker-compose-de-cero-a-produccion-parte-3\">Parte 3<\/a> cerramos la serie con dos proyectos reales completos y las estrategias para manejar entornos de desarrollo y producci\u00f3n desde el mismo base de archivos.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Los comandos del d\u00eda a d\u00eda, c\u00f3mo combinar depends_on con healthchecks para que las dependencias funcionen de verdad, escalado de servicios y perfiles para servicios opcionales.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1,233],"tags":[254,257,263,328,241,242,240,259,248,261,327,330,238,266,326,250,256,333,271,335,331,255,334,329,262,270,268,272,244,253,332,325],"class_list":["post-1281","post","type-post","status-publish","format-standard","hentry","category-blog","category-kubernetes","tag-bind-mount","tag-bridge","tag-ci-cd","tag-compose-override","tag-contenedores","tag-devops","tag-docker","tag-docker-compose","tag-dockerfile","tag-entornos","tag-env-file","tag-escalado","tag-kubernetes","tag-microservicios","tag-multi-container","tag-multistage","tag-networking","tag-nodejs-docker","tag-orquestacion","tag-orquestacion-local","tag-perfiles","tag-persistencia","tag-postgresql-docker","tag-produccion","tag-reproducibilidad","tag-secrets","tag-seguridad","tag-swarm","tag-virtualizacion","tag-volumenes","tag-wordpress-docker","tag-yaml"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Docker Compose de cero a producci\u00f3n \u2014 Parte 2: CLI, dependencias robustas y perfiles &#183; devops Mauro Bernal<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-2\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Docker Compose de cero a producci\u00f3n \u2014 Parte 2: CLI, dependencias robustas y perfiles &#183; devops Mauro Bernal\" \/>\n<meta property=\"og:description\" content=\"Los comandos del d\u00eda a d\u00eda, c\u00f3mo combinar depends_on con healthchecks para que las dependencias funcionen de verdad, escalado de servicios y perfiles para servicios opcionales.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-2\/\" \/>\n<meta property=\"og:site_name\" content=\"devops Mauro Bernal\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-12T17:20:09+00:00\" \/>\n<meta name=\"author\" content=\"Mauro Bernal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:site\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mauro Bernal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/docker-compose-de-cero-a-produccion-parte-2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/docker-compose-de-cero-a-produccion-parte-2\\\/\"},\"author\":{\"name\":\"Mauro Bernal\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"headline\":\"Docker Compose de cero a producci\u00f3n \u2014 Parte 2: CLI, dependencias robustas y perfiles\",\"datePublished\":\"2026-03-12T17:20:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/docker-compose-de-cero-a-produccion-parte-2\\\/\"},\"wordCount\":513,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"keywords\":[\"bind-mount\",\"bridge\",\"ci-cd\",\"compose-override\",\"contenedores\",\"devops\",\"docker\",\"docker-compose\",\"dockerfile\",\"entornos\",\"env-file\",\"escalado\",\"kubernetes\",\"microservicios\",\"multi-container\",\"multistage\",\"networking\",\"nodejs-docker\",\"orquestacion\",\"orquestacion-local\",\"perfiles\",\"persistencia\",\"postgresql-docker\",\"produccion\",\"reproducibilidad\",\"secrets\",\"seguridad\",\"swarm\",\"virtualizaci\u00f3n\",\"volumenes\",\"wordpress-docker\",\"yaml\"],\"articleSection\":[\"Blog\",\"Kubernetes\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/docker-compose-de-cero-a-produccion-parte-2\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/docker-compose-de-cero-a-produccion-parte-2\\\/\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/docker-compose-de-cero-a-produccion-parte-2\\\/\",\"name\":\"Docker Compose de cero a producci\u00f3n \u2014 Parte 2: CLI, dependencias robustas y perfiles &#183; devops Mauro Bernal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\"},\"datePublished\":\"2026-03-12T17:20:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/docker-compose-de-cero-a-produccion-parte-2\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/docker-compose-de-cero-a-produccion-parte-2\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/docker-compose-de-cero-a-produccion-parte-2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docker Compose de cero a producci\u00f3n \u2014 Parte 2: CLI, dependencias robustas y perfiles\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\",\"name\":\"devops Mauro Bernal\",\"description\":\"Cuando tu trabajo es hacer que las cosas funcionen bien...\",\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\",\"name\":\"Mauro Bernal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"width\":1740,\"height\":1740,\"caption\":\"Mauro Bernal\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\"},\"description\":\"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman\",\"sameAs\":[\"https:\\\/\\\/maurobernal.com.ar\",\"https:\\\/\\\/x.com\\\/_maurobernal\",\"https:\\\/\\\/youtube.com\\\/maurobernal\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Docker Compose de cero a producci\u00f3n \u2014 Parte 2: CLI, dependencias robustas y perfiles &#183; devops Mauro Bernal","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-2\/","og_locale":"es_ES","og_type":"article","og_title":"Docker Compose de cero a producci\u00f3n \u2014 Parte 2: CLI, dependencias robustas y perfiles &#183; devops Mauro Bernal","og_description":"Los comandos del d\u00eda a d\u00eda, c\u00f3mo combinar depends_on con healthchecks para que las dependencias funcionen de verdad, escalado de servicios y perfiles para servicios opcionales.","og_url":"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-2\/","og_site_name":"devops Mauro Bernal","article_published_time":"2026-03-12T17:20:09+00:00","author":"Mauro Bernal","twitter_card":"summary_large_image","twitter_creator":"@_maurobernal","twitter_site":"@_maurobernal","twitter_misc":{"Escrito por":"Mauro Bernal","Tiempo de lectura":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-2\/#article","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-2\/"},"author":{"name":"Mauro Bernal","@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"headline":"Docker Compose de cero a producci\u00f3n \u2014 Parte 2: CLI, dependencias robustas y perfiles","datePublished":"2026-03-12T17:20:09+00:00","mainEntityOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-2\/"},"wordCount":513,"commentCount":0,"publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"keywords":["bind-mount","bridge","ci-cd","compose-override","contenedores","devops","docker","docker-compose","dockerfile","entornos","env-file","escalado","kubernetes","microservicios","multi-container","multistage","networking","nodejs-docker","orquestacion","orquestacion-local","perfiles","persistencia","postgresql-docker","produccion","reproducibilidad","secrets","seguridad","swarm","virtualizaci\u00f3n","volumenes","wordpress-docker","yaml"],"articleSection":["Blog","Kubernetes"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-2\/","url":"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-2\/","name":"Docker Compose de cero a producci\u00f3n \u2014 Parte 2: CLI, dependencias robustas y perfiles &#183; devops Mauro Bernal","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#website"},"datePublished":"2026-03-12T17:20:09+00:00","breadcrumb":{"@id":"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-2\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-2\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/maurobernal.com.ar\/blog\/"},{"@type":"ListItem","position":2,"name":"Docker Compose de cero a producci\u00f3n \u2014 Parte 2: CLI, dependencias robustas y perfiles"}]},{"@type":"WebSite","@id":"https:\/\/maurobernal.com.ar\/blog\/#website","url":"https:\/\/maurobernal.com.ar\/blog\/","name":"devops Mauro Bernal","description":"Cuando tu trabajo es hacer que las cosas funcionen bien...","publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/maurobernal.com.ar\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":["Person","Organization"],"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283","name":"Mauro Bernal","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","url":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","contentUrl":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","width":1740,"height":1740,"caption":"Mauro Bernal"},"logo":{"@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1"},"description":"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman","sameAs":["https:\/\/maurobernal.com.ar","https:\/\/x.com\/_maurobernal","https:\/\/youtube.com\/maurobernal"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1281","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/comments?post=1281"}],"version-history":[{"count":1,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1281\/revisions"}],"predecessor-version":[{"id":1284,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1281\/revisions\/1284"}],"wp:attachment":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/media?parent=1281"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/categories?post=1281"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/tags?post=1281"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}