{"id":1280,"date":"2026-03-12T14:20:07","date_gmt":"2026-03-12T17:20:07","guid":{"rendered":"https:\/\/maurobernal.com.ar\/blog\/?p=1280"},"modified":"2026-03-12T14:20:07","modified_gmt":"2026-03-12T17:20:07","slug":"docker-compose-de-cero-a-produccion-parte-1","status":"publish","type":"post","link":"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-1\/","title":{"rendered":"Docker Compose de cero a producci\u00f3n \u2014 Parte 1: Qu\u00e9 es y c\u00f3mo funciona"},"content":{"rendered":"\n<p>Antes de Docker Compose, levantar un entorno de desarrollo con varios servicios era un ritual de paciencia. Un <code>docker run<\/code> para la base de datos, otro para el backend, otro para Redis, acordarse de los flags de red, los vol\u00famenes, las variables de entorno&#8230; y rezar para que el pr\u00f3ximo dev del equipo pudiera repetir exactamente los mismos pasos.<\/p>\n\n\n\n<p>Docker Compose resolvi\u00f3 todo eso con un solo archivo YAML y un comando. En esta primera parte de la serie te cuento qu\u00e9 es, de d\u00f3nde viene y c\u00f3mo se estructura ese archivo que se vuelve la \u00fanica fuente de verdad de tu entorno.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 es Docker Compose y por qu\u00e9 importa?<\/h2>\n\n\n\n<p>Docker Compose es una herramienta dise\u00f1ada para definir y ejecutar aplicaciones que constan de m\u00faltiples contenedores. Su prop\u00f3sito es simple pero poderoso: en lugar de gestionar cada contenedor con comandos individuales, describ\u00eds el estado deseado de todo el sistema en un archivo <code>compose.yaml<\/code>, y Compose se encarga de alcanzar ese estado.<\/p>\n\n\n\n<p>Los beneficios que m\u00e1s uso en el d\u00eda a d\u00eda:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Entornos reproducibles:<\/strong> el cl\u00e1sico \u00abfunciona en mi m\u00e1quina\u00bb desaparece. Si el entorno est\u00e1 en c\u00f3digo, todos ejecutan lo mismo.<\/li>\n<li><strong>Onboarding en minutos:<\/strong> un nuevo dev solo necesita Docker instalado. Un <code>docker compose up<\/code> y tiene todo funcionando.<\/li>\n<li><strong>IaC a nivel desarrollador:<\/strong> el <code>compose.yaml<\/code> vive junto al c\u00f3digo en Git. El entorno es versionable, revisable y auditable.<\/li>\n<li><strong>Ciclos r\u00e1pidos:<\/strong> Compose reutiliza contenedores que no cambiaron. Los reinicios son r\u00e1pidos.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">De Fig a Compose V2: una historia corta pero importante<\/h2>\n\n\n\n<p>Docker Compose no naci\u00f3 en Docker. Empez\u00f3 como <strong>Fig<\/strong>, un proyecto de la empresa Orchardup que ya ofrec\u00eda exactamente esta idea: definir y levantar entornos multi-contenedor con un archivo YAML. Docker Inc. vio el valor, adquiri\u00f3 Orchardup en 2013 y relanz\u00f3 Fig como Docker Compose.<\/p>\n\n\n\n<p>Hoy existen dos versiones del CLI que vale la pena distinguir:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Caracter\u00edstica<\/th><th>V1 (legado)<\/th><th>V2 (actual)<\/th><\/tr><\/thead><tbody><tr><td>Comando<\/td><td><code>docker-compose<\/code> (con guion)<\/td><td><code>docker compose<\/code> (sin guion)<\/td><\/tr><tr><td>Lenguaje<\/td><td>Python<\/td><td>Go<\/td><\/tr><tr><td>Campo <code>version:<\/code><\/td><td>Requerido (2.0 a 3.8)<\/td><td>Ignorado (usa Compose Spec)<\/td><\/tr><tr><td>Integraci\u00f3n<\/td><td>Binario separado<\/td><td>Plugin del Docker CLI<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Si encontr\u00e1s documentaci\u00f3n con <code>docker-compose<\/code> (con guion) y <code>version: '3.8'<\/code> en la primera l\u00ednea, es sintaxis de V1. Todo el contenido de esta serie usa <strong>V2<\/strong>, que es el est\u00e1ndar actual.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El archivo compose.yaml: la \u00fanica fuente de verdad<\/h2>\n\n\n\n<p>El coraz\u00f3n de Docker Compose es su archivo de configuraci\u00f3n. Puede llamarse <code>compose.yaml<\/code> (preferido), <code>compose.yml<\/code>, <code>docker-compose.yaml<\/code> o <code>docker-compose.yml<\/code> \u2014 todos son reconocidos por compatibilidad.<\/p>\n\n\n\n<p>Las directivas de nivel superior que vas a usar en pr\u00e1cticamente todo proyecto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\"># compose.yaml\nservices:     # Los contenedores de tu aplicaci\u00f3n (obligatorio)\nnetworks:     # Redes personalizadas entre servicios (opcional)\nvolumes:      # Vol\u00famenes nombrados para persistencia (opcional)\nsecrets:      # Datos sensibles (contrase\u00f1as, claves API) (opcional)\nconfigs:      # Configuraci\u00f3n no sensible externa a la imagen (opcional)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Definiendo servicios<\/h3>\n\n\n\n<p>Cada servicio representa un componente de tu aplicaci\u00f3n corriendo en uno o m\u00e1s contenedores. Los atributos que m\u00e1s uso:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">services:\n  web:\n    image: nginx:alpine            # Imagen de Docker Hub\n    container_name: mi_nginx       # Nombre personalizado (cuidado si escal\u00e1s)\n    ports:\n      - \"8080:80\"                  # host:contenedor\n    environment:\n      APP_ENV: production\n    env_file:\n      - .env                       # Variables desde archivo (no versionarlo con secretos)\n    restart: unless-stopped        # Reinicio autom\u00e1tico excepto si lo deten\u00e9s manualmente\n\n  api:\n    build:                         # Construir desde Dockerfile en lugar de usar imagen\n      context: .\n      dockerfile: Dockerfile\n      args:\n        - NODE_VERSION=20          # ARGs del Dockerfile\n      target: production           # Para builds multi-stage\n    command: [\"npm\", \"start\"]      # Sobrescribe CMD del Dockerfile\n    depends_on:\n      - db                         # Arranca despu\u00e9s de 'db'\n    \n  db:\n    image: postgres:15-alpine\n    volumes:\n      - pg_data:\/var\/lib\/postgresql\/data   # Volumen nombrado para persistencia<\/code><\/pre>\n\n\n\n<p>La flexibilidad de elegir entre <code>image<\/code> y <code>build<\/code> es clave: us\u00e1s imagen oficial para componentes est\u00e1ndar (Postgres, Redis, Nginx) y <code>build<\/code> para tu c\u00f3digo propio. Pueden convivir sin problema en el mismo archivo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Redes: c\u00f3mo se comunican los servicios<\/h3>\n\n\n\n<p>Cuando levant\u00e1s un proyecto con <code>docker compose up<\/code>, Compose crea autom\u00e1ticamente una red <code>bridge<\/code> y conecta todos los servicios a ella. La magia: <strong>los servicios se encuentran entre s\u00ed usando su nombre como hostname DNS<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">services:\n  api:\n    image: mi-api\n    environment:\n      # 'db' es el nombre del servicio, funciona como hostname\n      DB_HOST: db\n      REDIS_HOST: cache\n\n  db:\n    image: postgres:15\n\n  cache:\n    image: redis:alpine<\/code><\/pre>\n\n\n\n<p>Para mayor control, pod\u00e9s definir redes personalizadas y segmentar qu\u00e9 servicios pueden verse entre s\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">services:\n  frontend:\n    networks: [public]             # Solo en la red p\u00fablica\n\n  api:\n    networks: [public, internal]   # En ambas redes\n\n  db:\n    networks: [internal]           # Solo en la red interna, no expuesta al exterior\n\nnetworks:\n  public:\n    driver: bridge\n  internal:\n    driver: bridge\n    internal: true                 # Sin acceso al exterior<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Vol\u00famenes: persistencia de datos<\/h3>\n\n\n\n<p>Por defecto, los datos dentro de un contenedor desaparecen cuando el contenedor se elimina. Los vol\u00famenes resuelven esto. Hay dos tipos que uso constantemente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">services:\n  db:\n    image: postgres:15\n    volumes:\n      # Tipo 1: Volumen nombrado \u2014 Docker gestiona el almacenamiento\n      # Ideal para producci\u00f3n y datos de base de datos\n      - pg_data:\/var\/lib\/postgresql\/data\n\n  api:\n    build: .\n    volumes:\n      # Tipo 2: Bind mount \u2014 mapea un directorio del host al contenedor\n      # Ideal para desarrollo: cambios en el c\u00f3digo se reflejan al instante\n      - .:\/usr\/src\/app\n\n# Los vol\u00famenes nombrados se declaran en el nivel superior\nvolumes:\n  pg_data:\n    driver: local<\/code><\/pre>\n\n\n\n<p>La regla que sigo: <strong>vol\u00famenes nombrados para datos que deben persistir<\/strong> (bases de datos, uploads, logs), <strong>bind mounts para el c\u00f3digo fuente<\/strong> durante el desarrollo para tener hot-reload sin reconstruir la imagen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Resumen de la Parte 1<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker Compose define entornos multi-contenedor en un solo archivo declarativo<\/li>\n<li>Us\u00e1 siempre <strong>V2<\/strong> (<code>docker compose<\/code> sin guion); el campo <code>version:<\/code> ya no es necesario<\/li>\n<li>Los servicios se comunican usando su nombre como hostname \u2014 no necesit\u00e1s IPs ni configuraci\u00f3n manual<\/li>\n<li>Vol\u00famenes nombrados para persistencia, bind mounts para desarrollo \u00e1gil<\/li>\n<\/ul>\n\n\n\n<p>En la <a href=\"\/docker-compose-de-cero-a-produccion-parte-2\">Parte 2<\/a> vemos los comandos esenciales del CLI y las caracter\u00edsticas que hacen que los entornos sean robustos: <code>depends_on<\/code> con healthchecks, escalado y perfiles.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Qu\u00e9 es Docker Compose, la diferencia entre V1 y V2, y c\u00f3mo estructurar tu primer archivo compose.yaml: services, networks y volumes explicados desde la experiencia pr\u00e1ctica.<\/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-1280","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 1: Qu\u00e9 es y c\u00f3mo funciona &#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-1\/\" \/>\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 1: Qu\u00e9 es y c\u00f3mo funciona &#183; devops Mauro Bernal\" \/>\n<meta property=\"og:description\" content=\"Qu\u00e9 es Docker Compose, la diferencia entre V1 y V2, y c\u00f3mo estructurar tu primer archivo compose.yaml: services, networks y volumes explicados desde la experiencia pr\u00e1ctica.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-1\/\" \/>\n<meta property=\"og:site_name\" content=\"devops Mauro Bernal\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-12T17:20:07+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-1\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/docker-compose-de-cero-a-produccion-parte-1\\\/\"},\"author\":{\"name\":\"Mauro Bernal\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"headline\":\"Docker Compose de cero a producci\u00f3n \u2014 Parte 1: Qu\u00e9 es y c\u00f3mo funciona\",\"datePublished\":\"2026-03-12T17:20:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/docker-compose-de-cero-a-produccion-parte-1\\\/\"},\"wordCount\":689,\"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-1\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/docker-compose-de-cero-a-produccion-parte-1\\\/\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/docker-compose-de-cero-a-produccion-parte-1\\\/\",\"name\":\"Docker Compose de cero a producci\u00f3n \u2014 Parte 1: Qu\u00e9 es y c\u00f3mo funciona &#183; devops Mauro Bernal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\"},\"datePublished\":\"2026-03-12T17:20:07+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/docker-compose-de-cero-a-produccion-parte-1\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/docker-compose-de-cero-a-produccion-parte-1\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/docker-compose-de-cero-a-produccion-parte-1\\\/#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 1: Qu\u00e9 es y c\u00f3mo funciona\"}]},{\"@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 1: Qu\u00e9 es y c\u00f3mo funciona &#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-1\/","og_locale":"es_ES","og_type":"article","og_title":"Docker Compose de cero a producci\u00f3n \u2014 Parte 1: Qu\u00e9 es y c\u00f3mo funciona &#183; devops Mauro Bernal","og_description":"Qu\u00e9 es Docker Compose, la diferencia entre V1 y V2, y c\u00f3mo estructurar tu primer archivo compose.yaml: services, networks y volumes explicados desde la experiencia pr\u00e1ctica.","og_url":"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-1\/","og_site_name":"devops Mauro Bernal","article_published_time":"2026-03-12T17:20:07+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-1\/#article","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-1\/"},"author":{"name":"Mauro Bernal","@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"headline":"Docker Compose de cero a producci\u00f3n \u2014 Parte 1: Qu\u00e9 es y c\u00f3mo funciona","datePublished":"2026-03-12T17:20:07+00:00","mainEntityOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-1\/"},"wordCount":689,"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-1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-1\/","url":"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-1\/","name":"Docker Compose de cero a producci\u00f3n \u2014 Parte 1: Qu\u00e9 es y c\u00f3mo funciona &#183; devops Mauro Bernal","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#website"},"datePublished":"2026-03-12T17:20:07+00:00","breadcrumb":{"@id":"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-1\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-1\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/maurobernal.com.ar\/blog\/docker-compose-de-cero-a-produccion-parte-1\/#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 1: Qu\u00e9 es y c\u00f3mo funciona"}]},{"@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\/1280","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=1280"}],"version-history":[{"count":1,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1280\/revisions"}],"predecessor-version":[{"id":1283,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1280\/revisions\/1283"}],"wp:attachment":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/media?parent=1280"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/categories?post=1280"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/tags?post=1280"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}