Entrar ou criar conta

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.

Docker e containers do zero à produção
Ligado ao treinamento Docker e containers do zero à produção
ULC-LAB-DEVO-0001 · Status de validaçãoNão validado pela Upnetix: roteiro derivado da documentação oficial, para você executar e validar
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
Objetivo

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

ItemRequisito, licença ou versão
VM GitLab CE2 vCPU, 4 GB RAM, 20 GB disco, Ubuntu 22.04
VM GitLab Runner1 vCPU, 2 GB RAM, 10 GB disco, Ubuntu 22.04
VM Docker Compose Host1 vCPU, 2 GB RAM, 10 GB disco, Ubuntu 22.04
Docker EngineApache 2.0 · a versão estável atual
Docker ComposeApache 2.0 · a versão estável atual
GitLab CEMIT · a versão estável atual
GitLab RunnerMIT · a versão estável atual

Roteiro

  1. 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.

  2. 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 $USER

    O que você deve ver: Comando 'docker version' e 'docker compose version' retornam versões instaladas.

  3. 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-ce

    O que você deve ver: A interface web do GitLab CE disponível em http://192.168.56.10.

  4. 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-runner

    O que você deve ver: Comando 'gitlab-runner --version' retorna versão instalada.

  5. 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 register

    O que você deve ver: Runner aparece como ativo na interface do projeto no GitLab CE.

  6. 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.git

    O que você deve ver: Repositório clonado com sucesso.

  7. 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.yml

    O que você deve ver: Arquivos criados no repositório local.

  8. 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.

  9. 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.yml

    O que você deve ver: Arquivo .gitlab-ci.yml criado.

  10. 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.12

    O que você deve ver: Runner pode acessar o host de produção via SSH sem senha.

  11. 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 main

    O que você deve ver: Pipeline inicia no GitLab CE e mostra logs de build, push e deploy.

  12. 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:5000

    O que você deve ver: Container do Flask rodando e resposta 'Hello, Docker!' no curl.

Como saber que funcionou

TesteComandoCritério
Verificar containers rodandodocker psContainer 'webapp-docker' em execução no host de produção.
Acessar aplicação via HTTPcurl http://192.168.56.12:5000Resposta 'Hello, Docker!'.
Verificar imagem no registrydocker login registry.192.168.56.10 && docker pull registry.192.168.56.10/usuario/webapp-docker:latestImagem baixada sem erro.
Checar pipeline no GitLab CEPipeline com status 'passed' na interface do projeto.
Verificar logs do runnersudo gitlab-runner statusRunner ativo e sem erros.

Troubleshooting

SintomaCausa provávelCorreção
Pipeline falha ao fazer push da imagemRunner não autenticado no registryVerifique variáveis CI/CD do projeto e login no registry.
Deploy falha por SSHChave SSH não copiada ou permissões erradasRecrie a chave e use ssh-copy-id novamente.
Container não iniciaErro no Dockerfile ou docker-compose.ymlRevise os arquivos e consulte logs com 'docker logs'.
A aplicação não responde na porta 5000Porta não exposta ou bloqueada no firewallVerifique 'ports' no docker-compose.yml e regras do firewall.
Runner não aparece como ativo no GitLabToken errado ou registro incompletoRefaç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

  1. Documentação oficial do Docker Engine · Docker, Inc. (docs.docker.com)
  2. Documentação oficial do Docker Compose · Docker, Inc. (docs.docker.com)
  3. Documentação oficial do GitLab CE · GitLab Inc. (docs.gitlab.com)
  4. Documentação do GitLab Runner · GitLab Inc. (docs.gitlab.com)
  5. Documentação do Container Registry do GitLab · GitLab Inc. (docs.gitlab.com)
Verificação editorial
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
Encontrou um erro? Escreva para comercial@upnetix.com.br com o endereço da página. A revisão semestral por IA nunca altera comandos ou configurações sem passar pela fila de revisão.