{"id":62478,"date":"2023-09-04T11:41:58","date_gmt":"2023-09-04T14:41:58","guid":{"rendered":"https:\/\/kinsta.com\/pt\/?p=62478&#038;preview=true&#038;preview_id=62478"},"modified":"2023-09-11T04:48:42","modified_gmt":"2023-09-11T07:48:42","slug":"kinsta-docker","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/","title":{"rendered":"Como a Kinsta Melhorou a Experi\u00eancia de Desenvolvimento de Ponta a Ponta, Dockerizando Cada Etapa do Ciclo de Produ\u00e7\u00e3o"},"content":{"rendered":"<p>Na Kinsta, temos projetos de todos os tamanhos para hospedagem de aplicativos, hospedagem de banco de dados e hospedagem gerenciada de WordPress.<\/p>\n<p>Com as solu\u00e7\u00f5es de hospedagem na nuvem da Kinsta, voc\u00ea pode <a href=\"https:\/\/sevalla.com\/application-hosting\/\">implantar aplicativos<\/a> em v\u00e1rias linguagens e frameworks, como NodeJS, PHP, Ruby, Go, Scala e Python. Com um Dockerfile, voc\u00ea pode implementar qualquer aplicativo. Voc\u00ea pode conectar seu reposit\u00f3rio Git (hospedado no GitHub, GitLab ou Bitbucket) para implantar seu c\u00f3digo diretamente na Kinsta.<\/p>\n<p>Voc\u00ea pode <a href=\"https:\/\/sevalla.com\/database-hosting\/\">hospedar bancos de dados MariaDB, Redis, MySQL e PostgreSQL<\/a> prontos para uso, economizando tempo para se concentrar no desenvolvimento de seus aplicativos em vez de se preocupar com configura\u00e7\u00f5es de hospedagem.<\/p>\n<p>E se voc\u00ea escolher nossa <a href=\"https:\/\/kinsta.com\/pt\/hospedagem-wordpress\/\">Hospedagem Gerenciada de WordPress<\/a>, voc\u00ea experimentar\u00e1 o poder das m\u00e1quinas do Google Cloud C2 em sua rede de n\u00edvel Premium e a seguran\u00e7a integrada do Cloudflare, tornando seus sites WordPress os mais r\u00e1pidos e seguros do mercado.<br \/>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc><\/p>\n<h2>Resolvendo o desafio de criar aplicativos nativos da nuvem com uma equipe remota<\/h2>\n<p>Um dos maiores desafios do desenvolvimento e da manuten\u00e7\u00e3o de aplicativos nativos da nuvem de n\u00edvel empresarial \u00e9 ter uma experi\u00eancia consistente durante todo o ciclo de vida do desenvolvimento. Isso \u00e9 ainda mais dif\u00edcil para empresas remotas com equipes distribu\u00eddas que trabalham em plataformas diferentes, com configura\u00e7\u00f5es diferentes e comunica\u00e7\u00e3o ass\u00edncrona. Precisamos fornecer uma solu\u00e7\u00e3o consistente, confi\u00e1vel e escal\u00e1vel que funcione para:<\/p>\n<ul>\n<li>Desenvolvedores e equipes de garantia de qualidade, independentemente de seus sistemas operacionais, criam uma configura\u00e7\u00e3o simples e m\u00ednima para desenvolver e testar recursos.<\/li>\n<li>Equipes de DevOps, SysOps e Infra, para configurar e manter ambientes de teste e produ\u00e7\u00e3o.<\/li>\n<\/ul>\n<p>Na Kinsta, confiamos muito no <a href=\"https:\/\/kinsta.com\/pt\/blog\/que-e-docker\/\">Docker<\/a> para que voc\u00ea tenha uma experi\u00eancia consistente em cada etapa, do desenvolvimento \u00e0 produ\u00e7\u00e3o. Neste artigo, mostraremos a voc\u00ea:<\/p>\n<ul>\n<li>Como aproveitar o Docker Desktop para aumentar a produtividade dos desenvolvedores.<\/li>\n<li>Como criamos imagens do Docker e as enviamos para o Google Container Registry por meio de pipelines CI com CircleCI e GitHub Actions.<\/li>\n<li>Como usamos pipelines CI para promover altera\u00e7\u00f5es incrementais na produ\u00e7\u00e3o usando imagens do Docker, o Google Kubernetes Engine e o Cloud Deploy.<\/li>\n<li>Como a equipe de controle de qualidade usa perfeitamente imagens pr\u00e9-constru\u00eddas do Docker em diferentes ambientes.<\/li>\n<\/ul>\n<h2>Usando o Docker Desktop para melhorar a experi\u00eancia do desenvolvedor<\/h2>\n<p>A execu\u00e7\u00e3o de um aplicativo localmente exige que os desenvolvedores preparem meticulosamente o ambiente, instalem todas as depend\u00eancias, configurem servidores e servi\u00e7os e certifiquem-se de que estejam configurados corretamente. Quando voc\u00ea executa v\u00e1rios aplicativos, isso pode ser complicado, especialmente quando se trata de projetos complexos com v\u00e1rias depend\u00eancias. Quando voc\u00ea introduz nessa vari\u00e1vel v\u00e1rios colaboradores com v\u00e1rios sistemas operacionais, o caos est\u00e1 instalado. Para evitar isso, usamos o Docker.<\/p>\n<p>Com o Docker, voc\u00ea pode declarar as configura\u00e7\u00f5es de ambiente, instalar as depend\u00eancias e criar imagens com tudo onde deveria estar. Qualquer pessoa, em qualquer lugar, com qualquer sistema operacional, pode usar as mesmas imagens e ter a mesma experi\u00eancia que todos os outros.<\/p>\n<h2>Declare sua configura\u00e7\u00e3o com o Docker Compose<\/h2>\n<p>Para come\u00e7ar, crie um arquivo <a href=\"https:\/\/docs.docker.com\/compose\/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker Compose<\/a>, <code>docker-compose.yml<\/code>. \u00c9 um arquivo de configura\u00e7\u00e3o declarativo escrito no formato YAML que informa ao Docker qual \u00e9 o estado desejado do seu aplicativo. O Docker usa essas informa\u00e7\u00f5es para configurar o ambiente para o seu aplicativo.<\/p>\n<p>Os arquivos Docker Compose s\u00e3o muito \u00fateis quando voc\u00ea tem mais de um cont\u00eainer em execu\u00e7\u00e3o e h\u00e1 depend\u00eancias entre os cont\u00eaineres.<\/p>\n<p>Para criar seu arquivo <code>docker-compose.yml<\/code>:<\/p>\n<ol>\n<li>Comece escolhendo um arquivo <a href=\"https:\/\/hub.docker.com\/\" target=\"_blank\" rel=\"noopener noreferrer\"><code>image<\/code><\/a> como base para o nosso aplicativo. Pesquise no Docker Hub e tente encontrar uma imagem do Docker que j\u00e1 contenha as depend\u00eancias do seu aplicativo. Certifique-se de usar uma tag de imagem espec\u00edfica para evitar erros. O uso da tag <code>latest<\/code> pode causar erros imprevistos em seu aplicativo. Voc\u00ea pode usar v\u00e1rias imagens de base para v\u00e1rias depend\u00eancias. Por exemplo, uma para o <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-postgresql\/\">PostgreSQL<\/a> e outra para <a href=\"https:\/\/kinsta.com\/pt\/blog\/executar-redis-no-docker\/\">Redis<\/a>.<\/li>\n<li>Use <a href=\"https:\/\/docs.docker.com\/storage\/volumes\/\" target=\"_blank\" rel=\"noopener noreferrer\"><code>volumes<\/code><\/a> para manter os dados em seu host, se voc\u00ea precisar. A persist\u00eancia de dados no computador host ajuda a evitar a perda de dados se os cont\u00eaineres do docker forem exclu\u00eddos ou se voc\u00ea precisar recri\u00e1-los.<\/li>\n<li>Use o <a href=\"https:\/\/docs.docker.com\/network\/\" target=\"_blank\" rel=\"noopener noreferrer\"><code>networks<\/code><\/a> para isolar sua configura\u00e7\u00e3o e evitar conflitos de rede com o host e outros cont\u00eaineres. Isso tamb\u00e9m ajuda os cont\u00eaineres a se localizarem e se comunicarem facilmente uns com os outros.<\/li>\n<\/ol>\n<p>Juntando tudo, temos um <code>docker-compose.yml<\/code> que se parece com isto:<\/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>Containeriza\u00e7\u00e3o do aplicativo<\/h2>\n<h3>Crie uma imagem do Docker para o seu aplicativo<\/h3>\n<p>Primeiro, precisamos criar uma imagem do Docker usando <code>Dockerfile<\/code> e, em seguida, cham\u00e1-lo a partir do <code>docker-compose.yml<\/code>.<\/p>\n<p>Para criar seu arquivo <code>Dockerfile<\/code>:<\/p>\n<ol>\n<li>Comece escolhendo uma imagem como base. Use a menor imagem de base que funcione para o aplicativo. Normalmente, as imagens alpine s\u00e3o m\u00ednimas, com quase nenhum pacote extra instalado. Voc\u00ea pode come\u00e7ar com uma imagem alpine e construir em cima dela:\n<pre><code class=\"language-markdown\">FROM node:18.15.0-alpine3.17\n<\/code><\/pre>\n<\/li>\n<li>\u00c0s vezes, voc\u00ea precisa usar uma arquitetura de CPU espec\u00edfica para evitar conflitos. Por exemplo, suponha que voc\u00ea use um processador <code>arm64-based<\/code>, mas precise criar uma imagem <code>amd64<\/code>. Voc\u00ea pode fazer isso especificando o <code>-- platform<\/code> em <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>Defina o diret\u00f3rio do aplicativo, instale as depend\u00eancias e copie a sa\u00edda para o diret\u00f3rio raiz:\n<pre><code class=\"language-markdown\">WORKDIR \/opt\/app \nCOPY package.json yarn.lock .\/ \nRUN yarn install \nCOPY . .<\/code><\/pre>\n<\/li>\n<li>Chame o <code>Dockerfile<\/code> de <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>Implemente o recarregamento autom\u00e1tico para que, ao alterar algo no c\u00f3digo-fonte, voc\u00ea possa visualizar as altera\u00e7\u00f5es imediatamente sem precisar reconstruir o aplicativo manualmente. Para fazer isso, crie a imagem primeiro e, em seguida, execute em um servi\u00e7o separado:\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>Dica profissional: Observe que o <code>node_modules<\/code> tamb\u00e9m est\u00e1 montado explicitamente para evitar problemas espec\u00edficos da plataforma com os pacotes. Isso significa que, em vez de usar o <code>node_modules<\/code> no host, o cont\u00eainer Docker usa o seu pr\u00f3prio, mas o mapeia no host em um volume separado.<\/p>\n<h2>Otimizando a cria\u00e7\u00e3o de imagens de produ\u00e7\u00e3o com Integra\u00e7\u00e3o Cont\u00ednua<\/h2>\n<p>A maioria dos nossos aplicativos e servi\u00e7os usa CI\/CD para implanta\u00e7\u00e3o. O Docker desempenha um papel importante no processo. Cada altera\u00e7\u00e3o na branch principal aciona imediatamente um pipeline de cria\u00e7\u00e3o por meio do GitHub Actions ou do CircleCI. O fluxo de trabalho geral \u00e9 muito simples: ele instala as depend\u00eancias, executa os testes, cria a imagem do Docker e a envia para o Google Container Registry (ou Artifact Registry). A parte que discutiremos neste artigo \u00e9 a etapa de build.<\/p>\n<h3>Cria\u00e7\u00e3o das imagens do Docker<\/h3>\n<p>Usamos builds de m\u00faltiplos est\u00e1gios por raz\u00f5es de seguran\u00e7a e desempenho.<\/p>\n<h4>Etapa 1: Builder<\/h4>\n<p>Nesta etapa, copiamos toda a base de c\u00f3digo com todo o c\u00f3digo-fonte e a configura\u00e7\u00e3o, instalamos todas as depend\u00eancias, inclusive as depend\u00eancias de desenvolvimento, e criamos o aplicativo. Voc\u00ea cria uma pasta <code>dist\/<\/code> e copia a vers\u00e3o constru\u00edda do c\u00f3digo para l\u00e1. Mas essa imagem \u00e9 muito grande, com um grande conjunto de rastros para ser usado em produ\u00e7\u00e3o. Al\u00e9m disso, como usamos registros NPM privados, tamb\u00e9m usamos nosso <code>NPM_TOKEN<\/code> privado nesse est\u00e1gio. Portanto, definitivamente n\u00e3o queremos que esse est\u00e1gio seja exposto ao mundo externo. A \u00fanica coisa de que precisamos nesse est\u00e1gio \u00e9 a pasta <code>dist\/<\/code>.<\/p>\n<h4>Est\u00e1gio 2: Produ\u00e7\u00e3o<\/h4>\n<p>A maioria das pessoas usa esse est\u00e1gio para o tempo de execu\u00e7\u00e3o, por estar muito pr\u00f3ximo do que precisamos para executar o aplicativo. No entanto, ainda precisamos instalar as depend\u00eancias de produ\u00e7\u00e3o, o que significa que deixamos rastros e precisamos do <code>NPM_TOKEN<\/code>. Portanto, esse est\u00e1gio ainda n\u00e3o est\u00e1 pronto para ser exposto. Al\u00e9m disso, preste aten\u00e7\u00e3o em <code>yarn cache clean<\/code> na linha 19. Esse pequeno comando reduz o tamanho da nossa imagem em at\u00e9 60%.<\/p>\n<h4>Est\u00e1gio 3: Tempo de execu\u00e7\u00e3o<\/h4>\n<p>O \u00faltimo est\u00e1gio precisa ser o mais fino poss\u00edvel, com o m\u00ednimo de rastros. Ent\u00e3o, copiamos o aplicativo totalmente pronto da produ\u00e7\u00e3o e seguimos em frente. Deixamos de lado todas as coisas do yarn e do <code>NPM_TOKEN<\/code> e executamos apenas o aplicativo.<\/p>\n<p>Esta \u00e9 a vers\u00e3o final do <code>Dockerfile.production<\/code>:<\/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>Observe que, em todas as etapas, come\u00e7amos a copiar os arquivos <code>package.json<\/code> e <code>yarn.lock<\/code> primeiro, instalamos as depend\u00eancias e depois copiamos o restante da base de c\u00f3digo. O motivo \u00e9 que o Docker constr\u00f3i cada comando como uma camada sobre a anterior. E cada build pode usar as camadas anteriores, se dispon\u00edveis, e apenas construir as novas camadas para fins de desempenho.<\/p>\n<p>Digamos que voc\u00ea tenha alterado algo em <code>src\/services\/service1.ts<\/code> sem tocar nos pacotes. Isso significa que as primeiras quatro camadas do construtor n\u00e3o foram tocadas e podem ser reutilizadas. Isso torna o processo de build incrivelmente mais r\u00e1pido.<\/p>\n<h3>Enviando o aplicativo para o Google Container Registry por meio de pipelines CircleCI<\/h3>\n<p>H\u00e1 v\u00e1rias maneiras de criar uma imagem do Docker nos pipelines do CircleCI. Em nosso caso, optamos por usar <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>Gra\u00e7as ao Docker, voc\u00ea precisa de uma configura\u00e7\u00e3o m\u00ednima para criar e enviar nosso aplicativo.<\/p>\n<h3>Enviando o aplicativo para o Google Container Registry por meio do GitHub Actions<\/h3>\n<p>Como alternativa ao CircleCI, podemos usar o GitHub Actions para implantar o aplicativo continuamente. Configuramos o site <code>gcloud<\/code>, criamos e enviamos a imagem do Docker para <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>A cada pequena altera\u00e7\u00e3o enviada para a branch principal, criamos e enviamos uma nova imagem do Docker para o registro.<\/p>\n<h2>Implantando mudan\u00e7as no Google Kubernetes Engine usando os pipelines de entrega do Google<\/h2>\n<p>Ter imagens do Docker prontas para uso para cada altera\u00e7\u00e3o tamb\u00e9m facilita a implanta\u00e7\u00e3o na produ\u00e7\u00e3o ou a revers\u00e3o caso algo d\u00ea errado. Usamos o Google Kubernetes Engine para gerenciar e servir nossos aplicativos e usamos o Google Cloud Deploy e o Pipelines de entrega para nosso processo de implanta\u00e7\u00e3o cont\u00ednua.<\/p>\n<p>Quando a imagem do Docker \u00e9 criada ap\u00f3s cada pequena altera\u00e7\u00e3o (com o pipeline de CI mostrado acima), damos um passo adiante e implantamos a altera\u00e7\u00e3o em nosso cluster de desenvolvimento usando <code>gcloud<\/code>. Vamos dar uma olhada nessa etapa do pipeline do 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>Isso aciona um processo de lan\u00e7amento para implementar as altera\u00e7\u00f5es em nosso cluster Kubernetes de desenvolvimento. Depois de testar e obter as aprova\u00e7\u00f5es, promovemos a altera\u00e7\u00e3o para o ambiente de teste e, em seguida, para o ambiente de produ\u00e7\u00e3o. Tudo isso \u00e9 poss\u00edvel porque temos uma imagem do Docker fina e isolada para cada altera\u00e7\u00e3o que tem quase tudo o que precisa. S\u00f3 precisamos informar \u00e0 implanta\u00e7\u00e3o qual tag voc\u00ea deve usar.<\/p>\n<h2>Como a equipe de garantia de qualidade se beneficia desse processo<\/h2>\n<p>A equipe de controle de qualidade precisa principalmente de uma vers\u00e3o de pr\u00e9-produ\u00e7\u00e3o na nuvem dos aplicativos a serem testados. No entanto, \u00e0s vezes eles precisam executar um aplicativo pr\u00e9-criado localmente (com todas as depend\u00eancias) para testar um determinado recurso. Nesses casos, eles n\u00e3o querem ou n\u00e3o precisam passar por todo o trabalho de clonar o projeto inteiro, instalar pacotes npm, criar o aplicativo, enfrentar erros de desenvolvedor e revisar todo o processo de desenvolvimento para colocar o aplicativo em funcionamento. Agora que tudo j\u00e1 est\u00e1 dispon\u00edvel como uma imagem do Docker no Google Container Registry, tudo o que eles precisam \u00e9 de um servi\u00e7o no arquivo 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>Com esse servi\u00e7o, eles podem ativar o aplicativo em suas m\u00e1quinas locais usando cont\u00eaineres do Docker, executando:<\/p>\n<pre><code class=\"language-shell\">docker compose up<\/code><\/pre>\n<p>Esse \u00e9 um grande passo para simplificar os processos de teste. Mesmo que o controle de qualidade decida testar uma tag espec\u00edfica do aplicativo, ele poder\u00e1 alterar facilmente a tag da imagem na linha 6 e executar novamente o comando Docker compose. Mesmo que voc\u00ea decida comparar diferentes vers\u00f5es do aplicativo simultaneamente, poder\u00e1 fazer isso facilmente com alguns ajustes. A maior vantagem \u00e9 manter nossa equipe de controle de qualidade longe dos desafios do desenvolvedor.<\/p>\n<h2>Vantagens de usar o Docker<\/h2>\n<ul>\n<li><strong>Quase zero de rastros para depend\u00eancias:<\/strong> Se voc\u00ea decidir atualizar a vers\u00e3o do Redis ou do Postgres, basta alterar uma linha e executar o aplicativo novamente. N\u00e3o h\u00e1 necessidade de mudar nada em seu sistema. Al\u00e9m disso, se voc\u00ea tiver dois aplicativos que precisam do Redis (talvez at\u00e9 com vers\u00f5es diferentes), voc\u00ea pode ter ambos rodando em seu pr\u00f3prio ambiente isolado, sem conflitos entre eles.<\/li>\n<li><strong>V\u00e1rias inst\u00e2ncias do aplicativo<\/strong>: H\u00e1 muitos casos em que precisamos executar o mesmo aplicativo com um comando diferente. Por exemplo, inicializar o banco de dados, executar testes, monitorar altera\u00e7\u00f5es no banco de dados ou ouvir mensagens. Em cada um desses casos, como j\u00e1 temos a imagem constru\u00edda pronta, basta adicionar outro servi\u00e7o ao arquivo de composi\u00e7\u00e3o do Docker com um comando diferente e pronto.<\/li>\n<li><strong>Ambiente de teste mais simples<\/strong>: Na maioria das vezes, voc\u00ea s\u00f3 precisa executar o aplicativo. Voc\u00ea n\u00e3o precisa do c\u00f3digo, dos pacotes ou de nenhuma conex\u00e3o com o banco de dados local. Voc\u00ea s\u00f3 quer ter certeza de que o aplicativo funciona corretamente ou precisa de uma inst\u00e2ncia em execu\u00e7\u00e3o como um servi\u00e7o de backend enquanto trabalha em seu pr\u00f3prio projeto. Esse tamb\u00e9m pode ser o caso de QA, revisores de Pull Request ou at\u00e9 mesmo pessoal de UX que queira ter certeza de que seu design foi implementado corretamente. Nossa configura\u00e7\u00e3o com Docker facilita muito para todos eles prosseguirem sem ter que lidar com muitos problemas t\u00e9cnicos.<\/li>\n<\/ul>\n<p><em>Este artigo foi originalmente publicado no <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>Na Kinsta, temos projetos de todos os tamanhos para hospedagem de aplicativos, hospedagem de banco de dados e hospedagem gerenciada de WordPress. Com as solu\u00e7\u00f5es de &#8230;<\/p>\n","protected":false},"author":297,"featured_media":62479,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[963,983],"class_list":["post-62478","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-docker","topic-servicos-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>Dockerizando o Ciclo de Produ\u00e7\u00e3o: Como a Kinsta Melhorou a Experi\u00eancia de Desenvolvimento de Ponta a Ponta<\/title>\n<meta name=\"description\" content=\"Obtenha um resumo completo de como a Kinsta melhorou a experi\u00eancia de desenvolvimento de ponta a ponta, Dockerizando cada etapa do ciclo de produ\u00e7\u00e3o.\" \/>\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\/pt\/blog\/kinsta-docker\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Como a Kinsta Melhorou a Experi\u00eancia de Desenvolvimento de Ponta a Ponta, Dockerizando Cada Etapa do Ciclo de Produ\u00e7\u00e3o\" \/>\n<meta property=\"og:description\" content=\"Obtenha um resumo completo de como a Kinsta melhorou a experi\u00eancia de desenvolvimento de ponta a ponta, Dockerizando cada etapa do ciclo de produ\u00e7\u00e3o.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-09-04T14:41:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-11T07:48:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/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=\"Obtenha um resumo completo de como a Kinsta melhorou a experi\u00eancia de desenvolvimento de ponta a ponta, Dockerizando cada etapa do ciclo de produ\u00e7\u00e3o.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/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_pt\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Amin Choroomi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\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\/pt\/blog\/kinsta-docker\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/\"},\"author\":{\"name\":\"Amin Choroomi\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/afd8216d3181e47da9f6e804526b0a97\"},\"headline\":\"Como a Kinsta Melhorou a Experi\u00eancia de Desenvolvimento de Ponta a Ponta, Dockerizando Cada Etapa do Ciclo de Produ\u00e7\u00e3o\",\"datePublished\":\"2023-09-04T14:41:58+00:00\",\"dateModified\":\"2023-09-11T07:48:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/\"},\"wordCount\":2281,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg\",\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/\",\"name\":\"Dockerizando o Ciclo de Produ\u00e7\u00e3o: Como a Kinsta Melhorou a Experi\u00eancia de Desenvolvimento de Ponta a Ponta\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg\",\"datePublished\":\"2023-09-04T14:41:58+00:00\",\"dateModified\":\"2023-09-11T07:48:42+00:00\",\"description\":\"Obtenha um resumo completo de como a Kinsta melhorou a experi\u00eancia de desenvolvimento de ponta a ponta, Dockerizando cada etapa do ciclo de produ\u00e7\u00e3o.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/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\/pt\/blog\/kinsta-docker\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docker\",\"item\":\"https:\/\/kinsta.com\/pt\/topicos\/docker\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Como a Kinsta Melhorou a Experi\u00eancia de Desenvolvimento de Ponta a Ponta, Dockerizando Cada Etapa do Ciclo de Produ\u00e7\u00e3o\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/pt\/#website\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"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\/pt\/#\/schema\/person\/afd8216d3181e47da9f6e804526b0a97\",\"name\":\"Amin Choroomi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/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\/pt\/blog\/author\/aminchoroomi\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Dockerizando o Ciclo de Produ\u00e7\u00e3o: Como a Kinsta Melhorou a Experi\u00eancia de Desenvolvimento de Ponta a Ponta","description":"Obtenha um resumo completo de como a Kinsta melhorou a experi\u00eancia de desenvolvimento de ponta a ponta, Dockerizando cada etapa do ciclo de produ\u00e7\u00e3o.","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\/pt\/blog\/kinsta-docker\/","og_locale":"pt_PT","og_type":"article","og_title":"Como a Kinsta Melhorou a Experi\u00eancia de Desenvolvimento de Ponta a Ponta, Dockerizando Cada Etapa do Ciclo de Produ\u00e7\u00e3o","og_description":"Obtenha um resumo completo de como a Kinsta melhorou a experi\u00eancia de desenvolvimento de ponta a ponta, Dockerizando cada etapa do ciclo de produ\u00e7\u00e3o.","og_url":"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2023-09-04T14:41:58+00:00","article_modified_time":"2023-09-11T07:48:42+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/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":"Obtenha um resumo completo de como a Kinsta melhorou a experi\u00eancia de desenvolvimento de ponta a ponta, Dockerizando cada etapa do ciclo de produ\u00e7\u00e3o.","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","twitter_creator":"@kinsta_pt","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Amin Choroomi","Tempo estimado de leitura":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/"},"author":{"name":"Amin Choroomi","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/afd8216d3181e47da9f6e804526b0a97"},"headline":"Como a Kinsta Melhorou a Experi\u00eancia de Desenvolvimento de Ponta a Ponta, Dockerizando Cada Etapa do Ciclo de Produ\u00e7\u00e3o","datePublished":"2023-09-04T14:41:58+00:00","dateModified":"2023-09-11T07:48:42+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/"},"wordCount":2281,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/","url":"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/","name":"Dockerizando o Ciclo de Produ\u00e7\u00e3o: Como a Kinsta Melhorou a Experi\u00eancia de Desenvolvimento de Ponta a Ponta","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","datePublished":"2023-09-04T14:41:58+00:00","dateModified":"2023-09-11T07:48:42+00:00","description":"Obtenha um resumo completo de como a Kinsta melhorou a experi\u00eancia de desenvolvimento de ponta a ponta, Dockerizando cada etapa do ciclo de produ\u00e7\u00e3o.","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/kinsta-docker\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/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\/pt\/blog\/kinsta-docker\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Docker","item":"https:\/\/kinsta.com\/pt\/topicos\/docker\/"},{"@type":"ListItem","position":3,"name":"Como a Kinsta Melhorou a Experi\u00eancia de Desenvolvimento de Ponta a Ponta, Dockerizando Cada Etapa do Ciclo de Produ\u00e7\u00e3o"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/pt\/#website","url":"https:\/\/kinsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","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\/pt\/#\/schema\/person\/afd8216d3181e47da9f6e804526b0a97","name":"Amin Choroomi","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/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\/pt\/blog\/author\/aminchoroomi\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/62478","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/users\/297"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=62478"}],"version-history":[{"count":7,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/62478\/revisions"}],"predecessor-version":[{"id":62970,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/62478\/revisions\/62970"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/62478\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/62478\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/62478\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/62478\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/62478\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/62478\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/62478\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/62478\/translations\/es"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/62478\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/62479"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=62478"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=62478"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=62478"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}