Como hospedar um site estático no Back4app Containers com Docker e nginx

Você tem um site e nenhum lugar para colocá-lo. Envolva-o em um container, aponte um host para o repositório e ele está online — sem servidor para alugar, atualizar ou manter rodando.

O site que este guia coloca no ar, em seu próprio endereço: uma página de tábua de marés com o título Porthmeor Beach, com cards para a próxima preamar, a próxima baixa-mar e a temperatura da água, acima de uma tabela de previsão de sete dias

Tradução do original em inglês, testado em 23 de setembro de 2026. Código, números e datas são os do original. Read in English

Você tem um site. Um pouco de HTML, uma folha de estilo, talvez um pouco de JavaScript. Ele funciona quando você abre no seu laptop, e agora precisa de um endereço que outras pessoas possam digitar — sem alugar um servidor, mantê-lo atualizado ou aprender o que é um reverse proxy.

Colocá-lo em um container resolve isso. Você descreve o servidor web uma vez, em um arquivo pequeno, envia para um repositório, e um host faz o build e o executa para você. Não há nada para manter depois, porque não existe nenhuma máquina sua no caminho.

Este guia faz o percurso completo: o site, o arquivo do container, o deploy e um endereço no ar. Foram 9 segundos do push ao site no ar — e a última seção explica por que a maioria dos exemplos que você encontra na internet demora bem mais do que isso.

Prefere assistir?

O passo a passo original leva uma página de um repositório do GitHub a um container rodando, do começo ao fim.

Video: Moving a simple Website to Back4App Containers
Watch it instead Moving a simple Website to Back4App Containers
Do canal da Back4app. O caminho de deploy é o descrito abaixo; o arquivo de container que o vídeo escreve é o que a última seção mede. Open on YouTube →

Do que você realmente precisa?

Dos seus arquivos, e de mais um arquivo ao lado deles. Essa é a lista inteira — nenhum servidor, nenhuma conta de hospedagem para configurar, nenhum servidor web para instalar em nada que seja seu.

O arquivo extra é um Dockerfile. Ele nomeia um servidor web, diz onde suas páginas ficam, e é só isso que ele precisa fazer. Um host o lê, faz o build do resultado uma vez e o executa.

O exemplo aqui é um site de quatro arquivos: uma página HTML, uma folha de estilo, algumas linhas de JavaScript e o Dockerfile. O seu pode ter mil páginas; nada do que vem abaixo muda.

Como escrever o arquivo do container?

Três linhas. Parta da imagem oficial do nginx, copie seu site para a pasta que ela serve e declare a porta.

FROM nginx:1.27-alpine
COPY site/ /usr/share/nginx/html
EXPOSE 80

Esse é o arquivo inteiro. Não há etapa de instalação, porque a imagem já contém o nginx, e não há comando de inicialização, porque a imagem já sabe como iniciá-lo.

O único valor que vale a pena conhecer é /usr/share/nginx/html — o diretório de onde essa imagem serve os arquivos. Coloque seu index.html ali e o site funciona; coloque em qualquer outro lugar e você recebe um 404.

Fixe a versão na tag, como 1.27-alpine faz aqui. Isso garante que a imagem que você construir no mês que vem seja a mesma que construiu hoje, e não o que estiver em vigor naquele momento.

Como colocar no ar?

Envie o repositório e aponte um app de container para ele. Na dashboard, Web Deployment → escolha o repositório do GitHub → branch e diretório raiz → Create app.

Não há nada para preencher no caminho. A plataforma encontra o Dockerfile e marca o build como detectado — sem comando de build, sem comando de inicialização, sem porta, porque os três já estão respondidos pelo arquivo que você escreveu.

O painel de deployments do Containers mostrando o deployment marcado como Ready em 9 segundos, o app Available e um aviso de que a URL do plano Free é temporária e fica no ar por 60 minutos

O deployment voltou marcado como Ready em 9 segundos. Esse é o número da própria plataforma, do push ao endereço HTTPS no ar, e é o número que a última seção deste post explica.

Funcionou mesmo?

Sim — o endereço serve o site de verdade, não um placeholder. Cada arquivo voltou com exatamente o tamanho em bytes que o repositório guarda, e o header do servidor informa a versão fixada na tag.

/            HTTP 200   text/html                2083 B
/style.css   HTTP 200   text/css                 2218 B
/app.js      HTTP 200   application/javascript    204 B

Server: nginx/1.27.5

O JavaScript roda, a folha de estilo se aplica, e a página fica igual ao que fica no laptop. Um container não está fazendo nada de engenhoso aqui — essa é justamente a razão de usar um.

Por que a maioria dos exemplos constrói algo muito maior?

Porque eles instalam o servidor web em vez de partir de um. Quase todo tutorial que você vai encontrar, incluindo o vídeo acima, começa de uma imagem Linux de uso geral e usa o gerenciador de pacotes.

FROM ubuntu:latest
RUN apt-get update
RUN apt-get -y install nginx
COPY index.html /var/www/html/index.html
EXPOSE 80
CMD nginx -g "daemon off;"

Funciona, e a página servida é idêntica. O que difere é o que é construído, enviado e baixado toda vez que você faz o deploy — e a divisão por camadas mostra de onde vem esse peso.

Camada, como o docker history reportaTamanho
Base Ubuntu 26.04135 MB
apt-get update43,1 MB
apt-get -y install nginx3,62 MB
COPY index.html20,5 kB

O que você queria — um servidor web e a sua página — soma 3,64 MB, dentro de uma imagem que o docker images reporta como 254 MB. A etapa apt-get update, que existe só para que a linha seguinte possa rodar, é mais de dez vezes maior do que o software que ela buscou.

O índice de pacotes é uma lista de compras. Não há motivo para despachá-la junto com as compras.

Dá para manter a distribuição e ainda ser pequeno?

Em boa parte, sim — e vale saber disso se você precisa de uma distribuição para outra coisa. O custo acima não é bem do Ubuntu; é que o apt-get update grava seu catálogo em uma camada, e camadas são imutáveis, então apagá-lo depois não recupera nada.

Faça a instalação e a limpeza em uma única instrução e ele nunca é gravado.

FROM ubuntu:26.04
RUN apt-get update \
 && apt-get install -y --no-install-recommends nginx \
 && rm -rf /var/lib/apt/lists/*
COPY site/ /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Isso mede 181 MB — 73 MB a menos, mesma distribuição, mesmo nginx. Também fixa a base em vez de seguir a latest, pula os pacotes recomendados e escreve o CMD na forma exec, para que o nginx receba sinais diretamente.

Tamanho da imagemBuild a frioVersão do nginx
Distribuição, como se costuma escrever254 MB12 s1.28.3, a que o apt tiver
Distribuição, com limpeza181 MB9 s1.28.3, a que o apt tiver
nginx Alpine oficial75,9 MB1 s1.27.5, fixada pela tag

As três imagens desenhadas em escala: 254 MB para a base de distribuição como se costuma escrever, com 43,1 MB marcados como índice de pacotes do apt; 181 MB para a mesma base com limpeza; 75,9 MB para a imagem oficial nginx Alpine

É daqui que vieram os nove segundos. Um arquivo de três linhas não tem etapa de instalação para rodar, então o deploy é um pull e uma cópia; um arquivo que instala pacotes repete esse trabalho a cada release.

O que o plano Free oferece?

O suficiente para colocar algo na frente de alguém, e não o suficiente para deixar rodando. O container recebe 0,25 vCPU, 256 MB de memória e 100 GB de transferência, o que é confortável para um site estático.

O limite que importa é o endereço: no plano Free ele é temporário e expira 60 minutos depois do deployment. Isso o torna uma janela de compartilhamento, não hospedagem — serve para mostrar a um cliente, não para um site que as pessoas salvam nos favoritos. Um subdomínio permanente ou seu próprio domínio exige um plano pago.

O que fazer em seguida?

Coloque seus próprios arquivos em site/, não mude mais nada e faça o deploy. O arquivo do container não se importa se está carregando uma página ou um site de documentação gerado, então as mesmas três linhas cobrem quase tudo de estático que você vier a construir.

Mantenha a imagem oficial do servidor de que você precisa e fixe a tag. Recorra a uma distribuição só quando algo exigir de fato — um módulo incomum, uma etapa de build — e, quando fizer isso, mantenha a instalação e a limpeza em uma única instrução.

Tagsdockernginxcontainersstatic-sitedockerfileimage-size

Perguntas frequentes

Como hospedar um site estático sem alugar um servidor?

Coloque-o em um container e deixe uma plataforma executá-lo. Adicione um Dockerfile de três linhas ao lado dos seus arquivos, envie o repositório para o GitHub e aponte um app do Back4app Containers para ele — o Dockerfile é detectado automaticamente, então não há comando de build, comando de inicialização nem porta para configurar. Em 23 de setembro de 2026, um site de quatro arquivos foi do push a um endereço HTTPS no ar em 9 segundos, no plano Free.

Qual é a menor imagem Docker para um site estático?

Parta da imagem oficial nginx Alpine em vez de uma distribuição Linux de uso geral. Em 23 de setembro de 2026, servir a mesma página HTML resultou em 75,9 MB a partir de nginx:1.27-alpine contra 254 MB a partir de uma imagem ubuntu:latest com o nginx instalado via apt — uma redução de 70% para uma resposta HTTP 200 idêntica.

Por que minha imagem Docker fica tão grande depois do apt-get install?

Normalmente porque o apt-get update é uma camada própria e nada apaga o que ele baixou. Em um build medido, só a etapa apt-get update adicionou 43,1 MB de índice de pacotes à imagem, de forma permanente, enquanto o nginx para o qual ela era necessária adicionou apenas 3,62 MB. Combinar os comandos em um único RUN e terminá-lo com rm -rf /var/lib/apt/lists/* elimina o custo dessa camada.

Uma imagem de container menor faz diferença de verdade?

Faz diferença toda vez que a imagem se move. A imagem é reconstruída, enviada e baixada a cada deploy, então a diferença é paga em cada release, e não uma única vez. Nesta comparação, um build local a frio levou 12 segundos para a imagem de 254 MB e 1 segundo para a de 75,9 MB, e a imagem maior ainda carrega um gerenciador de pacotes, um shell e o software de uma distribuição inteira que o site nunca usa.

Devo usar ubuntu:latest em um Dockerfile?

Não para nada que você pretenda fazer o deploy duas vezes. A tag latest se move — em 23 de setembro de 2026 ela resolvia para Ubuntu 26.04.1 —, então o mesmo Dockerfile produz uma base diferente em outro dia, e o apt instala o nginx que aquela versão por acaso carregar. Fixe a imagem base em uma tag de versão e deixe a tag decidir quando você adota a atualização.

Preciso mudar meu Dockerfile para fazer o deploy no Back4app Containers?

Não. O Containers faz o build de qualquer Dockerfile que encontrar no seu repositório, então as três versões deste guia são implantadas do mesmo jeito, e a escolha da imagem base é inteiramente sua. Isso também significa que a plataforma reconstrói essas camadas a cada deploy, e é aí que uma imagem de 254 MB custa tempo sem você perceber.

Leitura complementar

Revisado e verificado por Back4app Engineering, Editorial review na Back4app

Testado em 23 de setembro de 2026 — Local: Docker 29.4.3, macOS, arm64 · Imagens: ubuntu:latest (26.04.1), nginx:1.27-alpine · Plataforma: Back4app Containers, plano Free.

Mais da Back4app Engineering

Containers · tutorial

Como hospedar um app Flutter web com Docker, sem administrar um servidor

Containers · tutorial

Como fazer o deploy de um app Node.js com Docker e banco de dados, sem administrar um servidor

Web Deployment · tutorial

How to Deploy a Figma Make Site With an MCP Server [Full Repo]