ULC Lab · implementação reproduzível
Laboratório: Pipeline CI/CD com Docker Compose e GitLab CE
Você vai construir um pipeline CI/CD completo usando Docker Compose e GitLab Community Edition, rodando em máquinas virtuais locais. Em cerca de 2 horas, terá um fluxo de build, teste e deploy automatizado para uma aplicação web simples.

- Duração estimada
- 120 min
- Passos
- 12
- Validações
- 5
- Versões da documentação consultada
- Docker Engine a versão estável atual · Docker Compose a versão estável atual · GitLab CE a versão estável atual · GitLab Runner a versão estável atual
O objetivo é entender, na prática, como orquestrar containers Docker para desenvolvimento e produção usando Docker Compose, e como integrar esse ambiente a um pipeline CI/CD real com GitLab CE. Você verá como containers facilitam a automação do ciclo de vida do software, desde o build até o deploy, e aprenderá a lidar com volumes, redes e registries privados.
Topologia
Três máquinas virtuais: uma para o GitLab CE (192.168.56.10), uma para o runner GitLab (192.168.56.11) e uma para o ambiente de produção Docker Compose (192.168.56.12). O runner executa jobs definidos no repositório GitLab, que constroem e publicam imagens Docker para um registry privado, depois fazem deploy em produção via Compose.
+---------------------+
| GitLab CE |
| 192.168.56.10 |
+---------------------+
|
|
+---------------------+
| GitLab Runner |
| 192.168.56.11 |
+---------------------+
|
|
+---------------------+
| Docker Compose Host |
| 192.168.56.12 |
+---------------------+Equipamentos e software
| Item | Requisito, licença ou versão |
|---|---|
| VM GitLab CE | 2 vCPU, 4 GB RAM, 20 GB disco, Ubuntu 22.04 |
| VM GitLab Runner | 1 vCPU, 2 GB RAM, 10 GB disco, Ubuntu 22.04 |
| VM Docker Compose Host | 1 vCPU, 2 GB RAM, 10 GB disco, Ubuntu 22.04 |
| Docker Engine | Apache 2.0 · a versão estável atual |
| Docker Compose | Apache 2.0 · a versão estável atual |
| GitLab CE | MIT · a versão estável atual |
| GitLab Runner | MIT · a versão estável atual |
Roteiro
- Preparar as VMs
Crie três VMs Ubuntu 22.04 em sua máquina local ou ambiente virtualizado. Separe IPs privados para cada uma.
O que você deve ver: Três sistemas acessíveis via SSH, cada um com seu IP.
- Instalar Docker Engine e Compose
No runner e no host de produção, instale Docker Engine e Docker Compose. O runner precisa construir imagens e o host vai rodar containers.
sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo usermod -aG docker $USERO que você deve ver: Comando 'docker version' e 'docker compose version' retornam versões instaladas.
- Instalar GitLab CE
No servidor GitLab CE, instale a versão Community Edition seguindo o guia oficial.
sudo apt-get update sudo apt-get install -y curl openssh-server ca-certificates tzdata perl curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash sudo EXTERNAL_URL="http://192.168.56.10" apt-get install gitlab-ceO que você deve ver: A interface web do GitLab CE disponível em http://192.168.56.10.
- Instalar GitLab Runner
No runner, instale o GitLab Runner para executar jobs do pipeline.
sudo apt-get install -y curl curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash sudo apt-get install gitlab-runnerO que você deve ver: Comando 'gitlab-runner --version' retorna versão instalada.
- Registrar o Runner no GitLab
No runner, registre o GitLab Runner usando o token do GitLab CE. Isso conecta o runner ao seu projeto.
sudo gitlab-runner registerO que você deve ver: Runner aparece como ativo na interface do projeto no GitLab CE.
- Criar um projeto de exemplo
No GitLab CE, crie um novo projeto chamado 'webapp-docker'. Clone o repositório em sua máquina local.
git clone http://192.168.56.10/usuario/webapp-docker.gitO que você deve ver: Repositório clonado com sucesso.
- Adicionar aplicação de exemplo
Adicione um app simples em Python Flask ao repositório. Crie os arquivos 'app.py', 'requirements.txt', 'Dockerfile' e 'docker-compose.yml'.
echo "from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return 'Hello, Docker!' if __name__ == '__main__': app.run(host='0.0.0.0')" > app.py echo "flask" > requirements.txt echo "FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [\"python\", \"app.py\"]" > Dockerfile echo "version: '3.8' services: web: build: . ports: - '5000:5000'" > docker-compose.ymlO que você deve ver: Arquivos criados no repositório local.
- Configurar o registry privado do GitLab
No GitLab CE, habilite o Container Registry (já vem habilitado por padrão, consulte a documentação para detalhes).
O que você deve ver: URL do registry disponível na interface do projeto.
- Adicionar pipeline .gitlab-ci.yml
No repositório, crie o arquivo '.gitlab-ci.yml' para definir o pipeline de build, push e deploy.
echo "stages: - build - deploy build-image: stage: build script: - docker build -t registry.192.168.56.10/usuario/webapp-docker:latest . - echo \"$CI_REGISTRY_PASSWORD\" | docker login -u \"$CI_REGISTRY_USER\" --password-stdin registry.192.168.56.10 - docker push registry.192.168.56.10/usuario/webapp-docker:latest only: - main deploy: stage: deploy script: - ssh usuario@192.168.56.12 'docker pull registry.192.168.56.10/usuario/webapp-docker:latest && cd /home/usuario/webapp-docker && docker compose up -d' only: - main" > .gitlab-ci.ymlO que você deve ver: Arquivo .gitlab-ci.yml criado.
- Configurar acesso SSH do Runner ao host de produção
No runner, gere uma chave SSH e adicione a chave pública ao arquivo 'authorized_keys' do usuário no host de produção.
ssh-keygen -t ed25519 -C "gitlab-runner" ssh-copy-id usuario@192.168.56.12O que você deve ver: Runner pode acessar o host de produção via SSH sem senha.
- Fazer o primeiro push e rodar o pipeline
Adicione, commite e faça push dos arquivos para o GitLab CE. O pipeline será disparado automaticamente.
git add . git commit -m "App inicial" git push origin mainO que você deve ver: Pipeline inicia no GitLab CE e mostra logs de build, push e deploy.
- Verificar o deploy em produção
No host de produção, verifique se o container está rodando e a aplicação responde.
docker ps curl http://192.168.56.12:5000O que você deve ver: Container do Flask rodando e resposta 'Hello, Docker!' no curl.
Como saber que funcionou
| Teste | Comando | Critério |
|---|---|---|
| Verificar containers rodando | docker ps | Container 'webapp-docker' em execução no host de produção. |
| Acessar aplicação via HTTP | curl http://192.168.56.12:5000 | Resposta 'Hello, Docker!'. |
| Verificar imagem no registry | docker login registry.192.168.56.10 && docker pull registry.192.168.56.10/usuario/webapp-docker:latest | Imagem baixada sem erro. |
| Checar pipeline no GitLab CE | Pipeline com status 'passed' na interface do projeto. | |
| Verificar logs do runner | sudo gitlab-runner status | Runner ativo e sem erros. |
Troubleshooting
| Sintoma | Causa provável | Correção |
|---|---|---|
| Pipeline falha ao fazer push da imagem | Runner não autenticado no registry | Verifique variáveis CI/CD do projeto e login no registry. |
| Deploy falha por SSH | Chave SSH não copiada ou permissões erradas | Recrie a chave e use ssh-copy-id novamente. |
| Container não inicia | Erro no Dockerfile ou docker-compose.yml | Revise os arquivos e consulte logs com 'docker logs'. |
| A aplicação não responde na porta 5000 | Porta não exposta ou bloqueada no firewall | Verifique 'ports' no docker-compose.yml e regras do firewall. |
| Runner não aparece como ativo no GitLab | Token errado ou registro incompleto | Refaça o registro do runner com o token correto. |
Segurança e hardening
- Utilize senhas fortes nos usuários das VMs.
- Restrinja o acesso SSH apenas ao runner e admin.
- Não exponha o registry do GitLab para a internet sem autenticação.
- Configure variáveis de ambiente sensíveis (como CI_REGISTRY_PASSWORD) apenas no escopo necessário.
- Atualize sempre as imagens base do Dockerfile.
Checklist final
Referências
- Documentação oficial do Docker Engine · Docker, Inc. (docs.docker.com)
- Documentação oficial do Docker Compose · Docker, Inc. (docs.docker.com)
- Documentação oficial do GitLab CE · GitLab Inc. (docs.gitlab.com)
- Documentação do GitLab Runner · GitLab Inc. (docs.gitlab.com)
- Documentação do Container Registry do GitLab · GitLab Inc. (docs.gitlab.com)
- Publicado
- 09/09/2026
- Última revisão
- 09/09/2026
- Versão do conteúdo
- 1.0
- Referências
- 5 oficiais
- Revisão técnica
- redação e revisão por IA, URLs conferidas na publicação
- Status
- Atual
