O Dockerfile é a receita que transforma a sua aplicação numa imagem: um pacote com o código, as bibliotecas e o ambiente, que corre igual em qualquer servidor com Docker. A resposta curta: comece de uma imagem oficial, copie primeiro o ficheiro das dependências e só depois o código (para o Docker reaproveitar o trabalho), e corra a aplicação com um utilizador que não seja o root. É para um VPS com Docker instalado: como instalar.
Um exemplo para cada linguagem
Node.js. Os números das versões são exemplos: use a que o seu projecto suporta.FROM node:22-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
USER node
EXPOSE 3000
CMD ["node", "server.js"]
Python (Flask, com gunicorn):FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN useradd --create-home appuser
USER appuser
EXPOSE 8000
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]
O que faz cada linha
| Linha |
O que faz |
FROM |
A imagem de partida. Prefira as oficiais e as variantes slim, mais pequenas. Fixe uma versão em vez de latest. |
WORKDIR |
A pasta de trabalho dentro da imagem. |
COPY do ficheiro de dependências, RUN da instalação, COPY do código |
Por esta ordem, o Docker guarda a camada das dependências e só a refaz quando esse ficheiro muda. Se copiar o código antes, reinstala tudo a cada alteração. |
USER |
Corre a aplicação sem ser root. Se algo a comprometer, alcança menos. |
EXPOSE |
Só documenta a porta. Não a abre: quem publica é o -p ou o Compose. |
CMD |
O comando que arranca a aplicação. Escreva-o em lista, como acima. |
Construir e testar
| 1 |
Crie o ficheiro .dockerignore ao lado do Dockerfile, com uma linha por item: node_modules, .git, .env, .venv. Sem ele, a pasta pesada e os segredos vão parar à imagem.
|
|
| 2 |
Construa: docker build -t minha-app .
|
|
| 3 |
Corra e teste só no próprio servidor: docker run -d --name minha-app -p 127.0.0.1:3000:3000 minha-app curl http://127.0.0.1:3000
|
|
Dentro do contentor, a aplicação tem de ouvir em 0.0.0.0, não em 127.0.0.1. Em 127.0.0.1 só o próprio contentor a alcança, e o -p não consegue ligar nada a ela. É a causa mais frequente de «o contentor corre mas não responde». Quem fica a ouvir só no servidor é o 127.0.0.1 do lado esquerdo do -p.
|
Segredos nunca na imagem. O que escrever num ENV ou copiar para dentro fica gravado nas camadas, e quem tiver a imagem lê-o. Passe senhas e chaves ao correr (--env-file ou o Compose). Num VPS não gerido, a imagem e o contentor são seus: até onde vai o nosso suporte.
|
PRODUTO RECOMENDADO Alojamento de sites com cPanel Domínio e SSL incluídos, cópias diárias e o painel que já conhece. desde 5.940,00 Kz/mês (plano de 3 anos, com cupão) Ver planos |