{"id":69357,"date":"2023-08-23T16:35:58","date_gmt":"2023-08-23T14:35:58","guid":{"rendered":"https:\/\/kinsta.com\/es\/?p=69357&#038;preview=true&#038;preview_id=69357"},"modified":"2023-08-31T10:12:49","modified_gmt":"2023-08-31T08:12:49","slug":"kinsta-docker","status":"publish","type":"post","link":"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/","title":{"rendered":"C\u00f3mo Kinsta Mejor\u00f3 la Experiencia de Desarrollo de Principio a Fin Mediante Dockerizaci\u00f3n de Cada Paso del Ciclo de Producci\u00f3n"},"content":{"rendered":"<p>En Kinsta, tenemos proyectos de todos los tama\u00f1os para el alojamiento de aplicaciones, el alojamiento de bases de datos y el alojamiento administrado de WordPress.<\/p>\n<p>Con las soluciones de alojamiento en la nube de Kinsta, puedes <a href=\"https:\/\/sevalla.com\/application-hosting\/\">desplegar aplicaciones<\/a> en varios lenguajes y frameworks, como NodeJS, PHP, Ruby, Go, Scala y Python. Con un Dockerfile, puedes desplegar cualquier aplicaci\u00f3n. Puedes conectar tu repositorio Git (alojado en GitHub, GitLab o Bitbucket) para desplegar tu c\u00f3digo directamente en Kinsta.<\/p>\n<p>Puedes <a href=\"https:\/\/sevalla.com\/database-hosting\/\">alojar bases de datos MariaDB, Redis, MySQL y PostgreSQL<\/a> listas para usar, ahorr\u00e1ndote tiempo para centrarte en desarrollar tus aplicaciones en lugar de sufrir con las configuraciones de alojamiento.<\/p>\n<p>Y si eliges nuestro <a href=\"https:\/\/kinsta.com\/es\/wordpress-hosting\/\">Alojamiento WordPress Administrado<\/a>, experimentar\u00e1s la potencia de las m\u00e1quinas Google Cloud C2 en su red de nivel Premium y la seguridad integrada de Cloudflare, haciendo que tus sitios web WordPress sean los m\u00e1s r\u00e1pidos y seguros del mercado.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Superar el Reto de Desarrollar Aplicaciones Nativas de la Nube en un Equipo Distribuido<\/h2>\n<p>Uno de los mayores retos de desarrollar y mantener aplicaciones nativas de la nube a nivel empresarial es tener una experiencia coherente a lo largo de todo el ciclo de vida de desarrollo. Esto es a\u00fan m\u00e1s dif\u00edcil para empresas remotas con equipos distribuidos que trabajan en plataformas diferentes, con configuraciones distintas y comunicaci\u00f3n as\u00edncrona. Necesitamos proporcionar una soluci\u00f3n coherente, fiable y escalable que funcione para:<\/p>\n<ul>\n<li>Desarrolladores y equipos de control de calidad, independientemente de sus sistemas operativos, crear una configuraci\u00f3n sencilla y m\u00ednima para desarrollar y probar funciones.<\/li>\n<li>Los equipos de DevOps, SysOps e Infra, para configurar y mantener los entornos de staging y producci\u00f3n.<\/li>\n<\/ul>\n<p>En Kinsta, confiamos mucho en <a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-docker\/\">Docker<\/a> para esta experiencia consistente en cada paso, desde el desarrollo hasta la producci\u00f3n. En este post, te guiaremos a trav\u00e9s de:<\/p>\n<ul>\n<li>C\u00f3mo aprovechar Docker Desktop para aumentar la productividad de los desarrolladores.<\/li>\n<li>C\u00f3mo creamos im\u00e1genes Docker y las enviamos a Google Container Registry a trav\u00e9s de canalizaciones CI con CircleCI y GitHub Actions.<\/li>\n<li>C\u00f3mo utilizamos las canalizaciones de CI para promover cambios incrementales a producci\u00f3n utilizando im\u00e1genes Docker, Google Kubernetes Engine y Cloud Deploy.<\/li>\n<li>C\u00f3mo el equipo de control de calidad utiliza sin problemas im\u00e1genes Docker precompiladas en distintos entornos.<\/li>\n<\/ul>\n<h2>Utilizaci\u00f3n de Docker Desktop para Mejorar la Experiencia de los Desarrolladores<\/h2>\n<p>Ejecutar una aplicaci\u00f3n localmente requiere que los desarrolladores preparen meticulosamente el entorno, instalen todas las dependencias, configuren servidores y servicios, y se aseguren de que est\u00e1n bien configurados. Cuando ejecutas varias aplicaciones, esto puede resultar engorroso, especialmente cuando se trata de proyectos complejos con m\u00faltiples dependencias. Cuando introduces en esta variable m\u00faltiples colaboradores con m\u00faltiples sistemas operativos, se instala el caos. Para evitarlo, utilizamos Docker.<\/p>\n<p>Con Docker, puedes declarar las configuraciones del entorno, instalar las dependencias y construir im\u00e1genes con todo donde debe estar. Cualquiera, en cualquier lugar, con cualquier SO puede utilizar las mismas im\u00e1genes y tener exactamente la misma experiencia que los dem\u00e1s.<\/p>\n<h2>Declara Tu Configuraci\u00f3n con Docker Compose<\/h2>\n<p>Para empezar, crea un archivo <a href=\"https:\/\/docs.docker.com\/compose\/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker Compose<\/a>, <code>docker-compose.yml<\/code>. Es un archivo de configuraci\u00f3n declarativo escrito en formato YAML que indica a Docker cu\u00e1l es el estado deseado de tu aplicaci\u00f3n. Docker utiliza esta informaci\u00f3n para configurar el entorno de tu aplicaci\u00f3n.<\/p>\n<p>Los archivos Docker Compose resultan muy \u00fatiles cuando tienes m\u00e1s de un contenedor en ejecuci\u00f3n y existen dependencias entre contenedores. Para crear tu archivo <code>docker-compose.yml<\/code>:<\/p>\n<ol>\n<li>Empieza eligiendo un <a href=\"https:\/\/hub.docker.com\/\" target=\"_blank\" rel=\"noopener noreferrer\"><code>image<\/code><\/a> como base para nuestra aplicaci\u00f3n. Busca en Docker Hub e intenta encontrar una imagen Docker que ya contenga las dependencias de tu aplicaci\u00f3n. Aseg\u00farate de utilizar una etiqueta de imagen espec\u00edfica para evitar errores. Utilizar la etiqueta <code>latest<\/code> puede causar errores imprevistos en tu aplicaci\u00f3n. Puedes utilizar varias im\u00e1genes base para varias dependencias. Por ejemplo, una para <a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-postgresql\/\">PostgreSQL<\/a> y otra para <a href=\"https:\/\/kinsta.com\/es\/blog\/redis-docker\/\">Redis<\/a>.<\/li>\n<li>Utiliza <a href=\"https:\/\/docs.docker.com\/storage\/volumes\/\" target=\"_blank\" rel=\"noopener noreferrer\"><code>volumes<\/code><\/a> para persistir los datos en tu m\u00e1quina anfitriona si lo necesitas. Persistir los datos en la m\u00e1quina anfitriona te ayuda a evitar perderlos si se borran los contenedores Docker o si tienes que volver a crearlos.<\/li>\n<li>Utiliza <a href=\"https:\/\/docs.docker.com\/network\/\" target=\"_blank\" rel=\"noopener noreferrer\"><code>networks<\/code><\/a> para aislar tu configuraci\u00f3n y evitar conflictos de red con el host y otros contenedores. Tambi\u00e9n ayuda a tus contenedores a encontrarse y comunicarse f\u00e1cilmente entre s\u00ed.<\/li>\n<\/ol>\n<p>Junt\u00e1ndolo todo, tenemos un <code>docker-compose.yml<\/code> con este aspecto:<\/p>\n<pre><code class=\"language-yaml\">version: '3.8'services:\n  db:\n    image: postgres:14.7-alpine3.17\n    hostname: mk_db\n    restart: on-failure\n    ports:\n      - ${DB_PORT:-5432}:5432\n    volumes:\n      - db_data:\/var\/lib\/postgresql\/data\n    environment:\n      POSTGRES_USER: ${DB_USER:-user}\n      POSTGRES_PASSWORD: ${DB_PASSWORD:-password}\n      POSTGRES_DB: ${DB_NAME:-main}\n    networks:\n      - mk_network\n  redis:\n    image: redis:6.2.11-alpine3.17\n    hostname: mk_redis\n    restart: on-failure\n    ports:\n      - ${REDIS_PORT:-6379}:6379\n    networks:\n      - mk_network\n      \nvolumes:\n  db_data:\n\nnetworks:\n  mk_network:\n    name: mk_network<\/code><\/pre>\n<h2>Contenedorizar la Aplicaci\u00f3n<\/h2>\n<h3>Construye una imagen Docker para tu aplicaci\u00f3n<\/h3>\n<p>En primer lugar, tenemos que crear una imagen Docker utilizando <code>Dockerfile<\/code>, y luego llamarla desde <code>docker-compose.yml<\/code>. Para crear tu archivo <code>Dockerfile<\/code>:<\/p>\n<ol>\n<li>Empieza por elegir una imagen como base. Utiliza la imagen base m\u00e1s peque\u00f1a que funcione para la aplicaci\u00f3n. Normalmente, las im\u00e1genes alpines son muy m\u00ednimas, con casi ning\u00fan paquete extra instalado. Puedes empezar con una imagen alpine y construir sobre ella:\n<pre><code class=\"language-markdown\">FROM node:18.15.0-alpine3.17\n<\/code><\/pre>\n<\/li>\n<li>A veces necesitas utilizar una arquitectura de CPU espec\u00edfica para evitar conflictos. Por ejemplo, supongamos que utilizas un procesador <code>arm64-based<\/code> pero necesitas construir una imagen <code>amd64<\/code>. Puedes hacerlo especificando <code>-- platform<\/code> en <code>Dockerfile<\/code>:\n<pre><code class=\"language-markdown\">FROM --platform=amd64 node:18.15.0-alpine3.17\n<\/code><\/pre>\n<\/li>\n<li>Define el directorio de la aplicaci\u00f3n e instala las dependencias y copia el resultado en tu directorio ra\u00edz:\n<pre><code class=\"language-markdown\">WORKDIR \/opt\/app \nCOPY package.json yarn.lock .\/ \nRUN yarn install \nCOPY . .<\/code><\/pre>\n<\/li>\n<li>Llama al <code>Dockerfile<\/code> desde <code>docker-compose.yml<\/code>:\n<pre><code class=\"language-yaml\">services:\n  ...redis\n  ...db\n  \n  app:\n    build:\n      context: .\n      dockerfile: Dockerfile\n    platforms:\n      - \"linux\/amd64\"\n    command: yarn dev\n    restart: on-failure\n    ports:\n      - ${PORT:-4000}:${PORT:-4000}\n    networks:\n      - mk_network\n    depends_on:\n      - redis\n      - db<\/code><\/pre>\n<\/li>\n<li>Implementa la auto-recarga para que, cuando cambies algo en el c\u00f3digo fuente, puedas previsualizar tus cambios inmediatamente sin tener que reconstruir la aplicaci\u00f3n manualmente. Para ello, construye primero la imagen y luego ejec\u00fatala en un servicio independiente:\n<pre><code class=\"language-yaml\">services:\n  ... redis\n  ... db\n  \n  build-docker:\n    image: myapp\n    build:\n      context: .\n      dockerfile: Dockerfile\n  app:\n    image: myapp\n    platforms:\n      - \"linux\/amd64\"\n    command: yarn dev\n    restart: on-failure\n    ports:\n      - ${PORT:-4000}:${PORT:-4000}\n    volumes:\n      - .:\/opt\/app\n      - node_modules:\/opt\/app\/node_modules\n    networks:\n      - mk_network\n    depends_on:\n      - redis\n      - db\n      - build-docker\n      \nvolumes:\n  node_modules:<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>Consejo profesional: Ten en cuenta que <code>node_modules<\/code> tambi\u00e9n se monta expl\u00edcitamente para evitar problemas espec\u00edficos de la plataforma con los paquetes. Significa que en lugar de utilizar el <code>node_modules<\/code> en el host, el contenedor Docker utiliza el suyo propio pero lo mapea en el host en un volumen separado.<\/p>\n<h2>Construye Incrementalmente las Im\u00e1genes de Producci\u00f3n con Integraci\u00f3n Continua<\/h2>\n<p>La mayor\u00eda de nuestras aplicaciones y servicios utilizan CI\/CD para su despliegue. Docker desempe\u00f1a un papel importante en el proceso. Cada cambio en la rama principal desencadena inmediatamente una cadena de construcci\u00f3n a trav\u00e9s de Acciones de GitHub o CircleCI. El flujo de trabajo general es muy sencillo: instala las dependencias, ejecuta las pruebas, construye la imagen Docker y la env\u00eda a Google Container Registry (o Artifact Registry). La parte que trataremos en este art\u00edculo es el paso de construcci\u00f3n.<\/p>\n<h3>Construir las im\u00e1genes Docker<\/h3>\n<p>Utilizamos construcciones en varias etapas por razones de seguridad y rendimiento.<\/p>\n<h4>Etapa 1: Constructor<\/h4>\n<p>En esta etapa copiamos todo el c\u00f3digo base con todo el c\u00f3digo fuente y la configuraci\u00f3n, instalamos todas las dependencias, incluidas las dependencias dev, y construimos la aplicaci\u00f3n. Crea una carpeta <code>dist\/<\/code> y copia all\u00ed la versi\u00f3n construida del c\u00f3digo. Pero esta imagen es demasiado grande, con un enorme conjunto de huellas, para utilizarla en producci\u00f3n. Adem\u00e1s, como utilizamos registros NPM privados, tambi\u00e9n utilizamos nuestro <code>NPM_TOKEN<\/code> privado en esta fase. As\u00ed que, definitivamente, no queremos que esta etapa est\u00e9 expuesta al mundo exterior. Lo \u00fanico que necesitamos de esta etapa es la carpeta <code>dist\/<\/code>.<\/p>\n<h4>Fase 2: Producci\u00f3n<\/h4>\n<p>La mayor\u00eda de la gente utiliza esta etapa para el tiempo de ejecuci\u00f3n, ya que est\u00e1 muy cerca de lo que necesitamos para ejecutar la aplicaci\u00f3n. Sin embargo, todav\u00eda tenemos que instalar las dependencias de producci\u00f3n y eso significa que dejamos huellas y necesitamos la carpeta <code>NPM_TOKEN<\/code>. As\u00ed que esta etapa todav\u00eda no est\u00e1 lista para ser expuesta. Adem\u00e1s, presta atenci\u00f3n a <code>yarn cache clean<\/code> en la l\u00ednea 19. Ese min\u00fasculo comando reduce el tama\u00f1o de nuestra imagen hasta en un 60%.<\/p>\n<h4>Etapa 3: Tiempo de ejecuci\u00f3n<\/h4>\n<p>La \u00faltima etapa tiene que ser lo m\u00e1s delgada posible, con huellas m\u00ednimas. As\u00ed que simplemente copiamos la aplicaci\u00f3n totalmente horneada de producci\u00f3n y seguimos adelante. Dejamos atr\u00e1s todas esas cosas de Yarn y <code>NPM_TOKEN<\/code> y s\u00f3lo ejecutamos la aplicaci\u00f3n.<\/p>\n<p>Este es el <code>Dockerfile.production<\/code> final:<\/p>\n<pre><code class=\"language-markdown\"># Stage 1: build the source code \nFROM node:18.15.0-alpine3.17 as builder \nWORKDIR \/opt\/app \nCOPY package.json yarn.lock .\/ \nRUN yarn install \nCOPY . . \nRUN yarn build \n\n# Stage 2: copy the built version and build the production dependencies FROM node:18.15.0-alpine3.17 as production \nWORKDIR \/opt\/app \nCOPY package.json yarn.lock .\/ \nRUN yarn install --production && yarn cache clean \nCOPY --from=builder \/opt\/app\/dist\/ .\/dist\/ \n\n# Stage 3: copy the production ready app to runtime \nFROM node:18.15.0-alpine3.17 as runtime \nWORKDIR \/opt\/app \nCOPY --from=production \/opt\/app\/ . \nCMD [\"yarn\", \"start\"]<\/code><\/pre>\n<p>Observa que, para todas las etapas, empezamos copiando primero los archivos <code>package.json<\/code> y <code>yarn.lock<\/code>, instalando las dependencias, y luego copiando el resto de la base de c\u00f3digo. La raz\u00f3n es que Docker construye cada comando como una capa sobre la anterior. Y cada compilaci\u00f3n podr\u00eda utilizar las capas anteriores si est\u00e1n disponibles y s\u00f3lo construir las capas nuevas por motivos de rendimiento.<\/p>\n<p>Supongamos que has cambiado algo en <code>src\/services\/service1.ts<\/code> sin tocar los paquetes. Significa que las cuatro primeras capas de la etapa constructora est\u00e1n intactas y podr\u00edan reutilizarse. Esto hace que el proceso de construcci\u00f3n sea incre\u00edblemente m\u00e1s r\u00e1pido.<\/p>\n<h3>Empujar la aplicaci\u00f3n al Registro de Contenedores de Google a trav\u00e9s de Pipelines CircleCI<\/h3>\n<p>Existen varias formas de construir una imagen Docker en las canalizaciones CircleCI. En nuestro caso, elegimos utilizar <code>circleci\/gcp-gcr orbs<\/code>:<\/p>\n<pre><code class=\"language-yaml\">executors:\n  docker-executor:\n    docker:\n      - image: cimg\/base:2023.03\norbs:\n  gcp-gcr: circleci\/gcp-gcr@0.15.1\njobs:\n  ...\n  deploy:\n    description: Build & push image to Google Artifact Registry\n    executor: docker-executor\n    steps:\n      ...\n      - gcp-gcr\/build-image:\n          image: my-app\n          dockerfile: Dockerfile.production\n          tag: ${CIRCLE_SHA1:0:7},latest\n      - gcp-gcr\/push-image:\n          image: my-app\n          tag: ${CIRCLE_SHA1:0:7},latest<\/code><\/pre>\n<p>Gracias a Docker, se necesita una configuraci\u00f3n m\u00ednima para crear y enviar nuestra aplicaci\u00f3n.<\/p>\n<h3>Enviar la aplicaci\u00f3n al Registro de Contenedores de Google mediante acciones de GitHub<\/h3>\n<p>Como alternativa a CircleCI, podemos utilizar GitHub Actions para desplegar la aplicaci\u00f3n de forma continua. Configuramos <code>gcloud<\/code> y creamos y enviamos la imagen Docker a <code>gcr.io<\/code>:<\/p>\n<pre><code class=\"language-yaml\">jobs:\n  setup-build:\n    name: Setup, Build\n    runs-on: ubuntu-latest\n\n    steps:\n    - name: Checkout\n      uses: actions\/checkout@v3\n\n    - name: Get Image Tag\n      run: |\n        echo \"TAG=$(git rev-parse --short HEAD)\" &gt;&gt; $GITHUB_ENV\n\n    - uses: google-github-actions\/setup-gcloud@master\n      with:\n        service_account_key: ${{ secrets.GCP_SA_KEY }}\n        project_id: ${{ secrets.GCP_PROJECT_ID }}\n\n    - run: |-\n        gcloud --quiet auth configure-docker\n\n    - name: Build\n      run: |-\n        docker build \n          --tag \"gcr.io\/${{ secrets.GCP_PROJECT_ID }}\/my-app:$TAG\" \n          --tag \"gcr.io\/${{ secrets.GCP_PROJECT_ID }}\/my-app:latest\" \n          .\n\n    - name: Push\n      run: |-\n        docker push \"gcr.io\/${{ secrets.GCP_PROJECT_ID }}\/my-app:$TAG\"\n        docker push \"gcr.io\/${{ secrets.GCP_PROJECT_ID }}\/my-app:latest\"<\/code><\/pre>\n<p>Con cada peque\u00f1o cambio empujado a la rama principal, construimos y enviamos una nueva imagen Docker al registro.<\/p>\n<h2>Desplegar Cambios en el Google Kubernetes Engine Utilizando Google Delivery Pipelines<\/h2>\n<p>Disponer de im\u00e1genes Docker listas para usar para todos y cada uno de los cambios tambi\u00e9n facilita el despliegue en producci\u00f3n o el retroceso en caso de que algo vaya mal. Utilizamos Google Kubernetes Engine para gestionar y servir nuestras aplicaciones, y utilizamos Google Cloud Deploy y Delivery Pipelines para nuestro proceso de despliegue continuo.<\/p>\n<p>Cuando la imagen Docker se construye despu\u00e9s de cada peque\u00f1o cambio (con la tuber\u00eda CI mostrada arriba) damos un paso m\u00e1s y desplegamos el cambio en nuestro cl\u00faster de desarrollo utilizando <code>gcloud<\/code>. Echemos un vistazo a ese paso en la tuber\u00eda CircleCI:<\/p>\n<pre><code class=\"language-yaml\">- run:\n    name: Create new release\n    command: gcloud deploy releases create release-${CIRCLE_SHA1:0:7} --delivery-pipeline my-del-pipeline --region $REGION --annotations commitId=$CIRCLE_SHA1 --images my-app=gcr.io\/${PROJECT_ID}\/my-app:${CIRCLE_SHA1:0:7}<\/code><\/pre>\n<p>Esto desencadena un proceso de lanzamiento para desplegar los cambios en nuestro cl\u00faster Kubernetes dev. Despu\u00e9s de probar y obtener las aprobaciones, promovemos el cambio a staging y luego a producci\u00f3n. Todo esto es posible porque tenemos una imagen Docker aislada para cada cambio que tiene casi todo lo que necesita. S\u00f3lo tenemos que indicar al despliegue qu\u00e9 etiqueta debe utilizar.<\/p>\n<h2>C\u00f3mo Se Beneficia de este Proceso el Equipo de Control de Calidad<\/h2>\n<p>El equipo de control de calidad necesita sobre todo una versi\u00f3n en la nube previa a la producci\u00f3n de las aplicaciones que va a probar. Sin embargo, a veces necesitan ejecutar localmente una aplicaci\u00f3n preconstruida (con todas las dependencias) para probar una determinada funci\u00f3n. En estos casos, no quieren o no necesitan pasar por todo el dolor de clonar todo el proyecto, instalar paquetes npm, construir la app, enfrentarse a errores de desarrollador y repasar todo el proceso de desarrollo para poner la app en marcha. Ahora que todo est\u00e1 ya disponible como imagen Docker en Google Container Registry, todo lo que necesitan es un servicio en el archivo Docker compose:<\/p>\n<pre><code class=\"language-yaml\">services:\n  ...redis\n  ...db\n  \n  app:\n    image: gcr.io\/${PROJECT_ID}\/my-app:latest\n    restart: on-failure\n    ports:\n      - ${PORT:-4000}:${PORT:-4000}\n    environment:\n      - NODE_ENV=production\n      - REDIS_URL=redis:\/\/redis:6379\n      - DATABASE_URL=postgresql:\/\/${DB_USER:-user}:${DB_PASSWORD:-password}@db:5432\/main\n    networks:\n      - mk_network\n    depends_on:\n      - redis\n      - db<\/code><\/pre>\n<p>Con este servicio, pueden poner en marcha la aplicaci\u00f3n en sus m\u00e1quinas locales utilizando contenedores Docker ejecutando:<\/p>\n<pre><code class=\"language-shell\">docker compose up<\/code><\/pre>\n<p>Este es un gran paso hacia la simplificaci\u00f3n de los procesos de prueba. Incluso si el control de calidad decide probar una etiqueta espec\u00edfica de la aplicaci\u00f3n, puede cambiar f\u00e1cilmente la etiqueta de la imagen en la l\u00ednea 6 y volver a ejecutar el comando Docker compose. Incluso si deciden comparar diferentes versiones de la aplicaci\u00f3n simult\u00e1neamente, pueden conseguirlo f\u00e1cilmente con unos pocos ajustes. La mayor ventaja es mantener a nuestro equipo de control de calidad alejado de los retos de los desarrolladores.<\/p>\n<h2>Ventajas del Uso de Docker<\/h2>\n<ul>\n<li><strong>Casi cero huellas de dependencias<\/strong>: Si alguna vez decides actualizar la versi\u00f3n de Redis o Postgres, s\u00f3lo tienes que cambiar 1 l\u00ednea y volver a ejecutar la aplicaci\u00f3n. No necesitas cambiar nada en tu sistema. Adem\u00e1s, si tienes dos aplicaciones que necesitan Redis (quiz\u00e1 incluso con versiones diferentes), puedes hacer que ambas se ejecuten en su propio entorno aislado sin que haya conflictos entre ellas.<\/li>\n<li><strong>M\u00faltiples instancias de la aplicaci\u00f3n<\/strong>: Hay muchos casos en los que necesitamos ejecutar la misma app con un comando diferente. Como inicializar la BD, ejecutar pruebas, ver los cambios en la BD o escuchar mensajes. En cada uno de estos casos, como ya tenemos lista la imagen construida, s\u00f3lo tenemos que a\u00f1adir otro servicio al archivo Docker compose con un comando diferente, y ya est\u00e1.<\/li>\n<li><strong>Entorno de pruebas m\u00e1s f\u00e1cil<\/strong>: La mayor\u00eda de las veces, s\u00f3lo necesitas ejecutar la aplicaci\u00f3n. No necesitas el c\u00f3digo, los paquetes ni ninguna conexi\u00f3n a bases de datos locales. S\u00f3lo quieres asegurarte de que la aplicaci\u00f3n funciona correctamente o necesitas una instancia en ejecuci\u00f3n como servicio backend mientras trabajas en tu propio proyecto. Tambi\u00e9n podr\u00eda ser el caso de QA, revisores de Pull Request, o incluso gente de UX que quiere asegurarse de que su dise\u00f1o se ha implementado correctamente. Nuestra configuraci\u00f3n Docker hace que sea muy f\u00e1cil para todos ellos poner las cosas en marcha sin tener que lidiar con demasiadas cuestiones t\u00e9cnicas.<\/li>\n<\/ul>\n<p><em>Este art\u00edculo se public\u00f3 originalmente en <a href=\"https:\/\/www.docker.com\/blog\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle\/\">Docker<\/a>.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En Kinsta, tenemos proyectos de todos los tama\u00f1os para el alojamiento de aplicaciones, el alojamiento de bases de datos y el alojamiento administrado de WordPress. Con &#8230;<\/p>\n","protected":false},"author":297,"featured_media":69358,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1282,1302],"class_list":["post-69357","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-docker","topic-servicios-kinsta"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Dockerizaci\u00f3n del Ciclo de Producci\u00f3n: C\u00f3mo Kinsta mejor\u00f3 la experiencia de desarrollo de principio a fin<\/title>\n<meta name=\"description\" content=\"Conoce c\u00f3mo Kinsta ha mejorado la experiencia de desarrollo de principio a fin mediante la dockerizaci\u00f3n de cada paso del ciclo de producci\u00f3n.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C\u00f3mo Kinsta Mejor\u00f3 la Experiencia de Desarrollo de Principio a Fin Mediante Dockerizaci\u00f3n de Cada Paso del Ciclo de Producci\u00f3n\" \/>\n<meta property=\"og:description\" content=\"Conoce c\u00f3mo Kinsta ha mejorado la experiencia de desarrollo de principio a fin mediante la dockerizaci\u00f3n de cada paso del ciclo de producci\u00f3n.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinsta.es\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-08-23T14:35:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-31T08:12:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Amin Choroomi\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Conoce c\u00f3mo Kinsta ha mejorado la experiencia de desarrollo de principio a fin mediante la dockerizaci\u00f3n de cada paso del ciclo de producci\u00f3n.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Amin Choroomi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/\"},\"author\":{\"name\":\"Amin Choroomi\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/afd8216d3181e47da9f6e804526b0a97\"},\"headline\":\"C\u00f3mo Kinsta Mejor\u00f3 la Experiencia de Desarrollo de Principio a Fin Mediante Dockerizaci\u00f3n de Cada Paso del Ciclo de Producci\u00f3n\",\"datePublished\":\"2023-08-23T14:35:58+00:00\",\"dateModified\":\"2023-08-31T08:12:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/\"},\"wordCount\":2254,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg\",\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/\",\"name\":\"Dockerizaci\u00f3n del Ciclo de Producci\u00f3n: C\u00f3mo Kinsta mejor\u00f3 la experiencia de desarrollo de principio a fin\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg\",\"datePublished\":\"2023-08-23T14:35:58+00:00\",\"dateModified\":\"2023-08-31T08:12:49+00:00\",\"description\":\"Conoce c\u00f3mo Kinsta ha mejorado la experiencia de desarrollo de principio a fin mediante la dockerizaci\u00f3n de cada paso del ciclo de producci\u00f3n.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docker\",\"item\":\"https:\/\/kinsta.com\/es\/secciones\/docker\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"C\u00f3mo Kinsta Mejor\u00f3 la Experiencia de Desarrollo de Principio a Fin Mediante Dockerizaci\u00f3n de Cada Paso del Ciclo de Producci\u00f3n\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/es\/#website\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluciones de alojamiento premium, r\u00e1pidas y seguras\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/es\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinsta.es\/\",\"https:\/\/x.com\/Kinsta_ES\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/afd8216d3181e47da9f6e804526b0a97\",\"name\":\"Amin Choroomi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f986556230b70b812c88e12d0c4726cf?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f986556230b70b812c88e12d0c4726cf?s=96&d=mm&r=g\",\"caption\":\"Amin Choroomi\"},\"description\":\"Software developer at Kinsta. Passionate about Docker and Kubernetes, he specializes in application development and DevOps practices.\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/author\/aminchoroomi\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Dockerizaci\u00f3n del Ciclo de Producci\u00f3n: C\u00f3mo Kinsta mejor\u00f3 la experiencia de desarrollo de principio a fin","description":"Conoce c\u00f3mo Kinsta ha mejorado la experiencia de desarrollo de principio a fin mediante la dockerizaci\u00f3n de cada paso del ciclo de producci\u00f3n.","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:\/\/kinsta.com\/es\/blog\/kinsta-docker\/","og_locale":"es_ES","og_type":"article","og_title":"C\u00f3mo Kinsta Mejor\u00f3 la Experiencia de Desarrollo de Principio a Fin Mediante Dockerizaci\u00f3n de Cada Paso del Ciclo de Producci\u00f3n","og_description":"Conoce c\u00f3mo Kinsta ha mejorado la experiencia de desarrollo de principio a fin mediante la dockerizaci\u00f3n de cada paso del ciclo de producci\u00f3n.","og_url":"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2023-08-23T14:35:58+00:00","article_modified_time":"2023-08-31T08:12:49+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","type":"image\/jpeg"}],"author":"Amin Choroomi","twitter_card":"summary_large_image","twitter_description":"Conoce c\u00f3mo Kinsta ha mejorado la experiencia de desarrollo de principio a fin mediante la dockerizaci\u00f3n de cada paso del ciclo de producci\u00f3n.","twitter_image":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","twitter_creator":"@Kinsta_ES","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Amin Choroomi","Tiempo de lectura":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/"},"author":{"name":"Amin Choroomi","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/afd8216d3181e47da9f6e804526b0a97"},"headline":"C\u00f3mo Kinsta Mejor\u00f3 la Experiencia de Desarrollo de Principio a Fin Mediante Dockerizaci\u00f3n de Cada Paso del Ciclo de Producci\u00f3n","datePublished":"2023-08-23T14:35:58+00:00","dateModified":"2023-08-31T08:12:49+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/"},"wordCount":2254,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/","url":"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/","name":"Dockerizaci\u00f3n del Ciclo de Producci\u00f3n: C\u00f3mo Kinsta mejor\u00f3 la experiencia de desarrollo de principio a fin","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","datePublished":"2023-08-23T14:35:58+00:00","dateModified":"2023-08-31T08:12:49+00:00","description":"Conoce c\u00f3mo Kinsta ha mejorado la experiencia de desarrollo de principio a fin mediante la dockerizaci\u00f3n de cada paso del ciclo de producci\u00f3n.","breadcrumb":{"@id":"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/#primaryimage","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/es\/blog\/kinsta-docker\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"Docker","item":"https:\/\/kinsta.com\/es\/secciones\/docker\/"},{"@type":"ListItem","position":3,"name":"C\u00f3mo Kinsta Mejor\u00f3 la Experiencia de Desarrollo de Principio a Fin Mediante Dockerizaci\u00f3n de Cada Paso del Ciclo de Producci\u00f3n"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/es\/#website","url":"https:\/\/kinsta.com\/es\/","name":"Kinsta\u00ae","description":"Soluciones de alojamiento premium, r\u00e1pidas y seguras","publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/es\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinsta.es\/","https:\/\/x.com\/Kinsta_ES","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/afd8216d3181e47da9f6e804526b0a97","name":"Amin Choroomi","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/f986556230b70b812c88e12d0c4726cf?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f986556230b70b812c88e12d0c4726cf?s=96&d=mm&r=g","caption":"Amin Choroomi"},"description":"Software developer at Kinsta. Passionate about Docker and Kubernetes, he specializes in application development and DevOps practices.","url":"https:\/\/kinsta.com\/es\/blog\/author\/aminchoroomi\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/69357","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/users\/297"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/comments?post=69357"}],"version-history":[{"count":8,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/69357\/revisions"}],"predecessor-version":[{"id":69472,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/69357\/revisions\/69472"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/69357\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/69357\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/69357\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/69357\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/69357\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/69357\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/69357\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/69357\/translations\/es"},{"href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/69357\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media\/69358"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media?parent=69357"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/tags?post=69357"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/topic?post=69357"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}