Category Archives: Docker

Prompt Partição Linux

Prompt

Estou criando uma VM na Azure, com Linux. Estou com extrema dúvida com relação à configuração das partições do disco. Estou usando um disco de 200GB e pretendo rodar uma aplicação Python com Docker. Defina a melhor configuração das partições (/, /home, /boot, /tmp, /usr, /var, etc).

ChatGPT (Adapta)

Aqui vai um guia completo e prático para particionar um Linux na Azure (disco de 200 GB) visando rodar uma aplicação Python em Docker, com foco em segurança, facilidade de manutenção e espaço adequado para imagens/volumes.

Resumo rápido (recomendação direta)

  • Sistema de arquivos: ext4 (simples e sem pegadinhas). Se optar por XFS, garanta ftype=1 no /var/lib/docker.
  • Layout recomendado (com LVM):
    • EFI (Gen2): /boot/efi — 550 MB (FAT32)
    • /boot — 1 GB (ext4)
    • swap — 8–16 GB (em geral 1x a RAM até 16 GB; sem hibernação)
    • / — 40 GB (ext4)
    • /var/lib/docker — 120 GB (ext4)
    • /var/log — 8 GB (ext4)
    • /home — 10 GB (ext4)
    • /tmp — tmpfs 2–4 GB (não em disco; memória)
    • Reserva livre no VG — ~5–10 GB para crescimento futuro
  • Opções de montagem (segurança e performance):
    • /: defaults,noatime
    • /boot: nodev
    • /tmp: tmpfs,size=4G,noexec,nodev,nosuid
    • /var/log: nodev,nosuid,noexec
    • /var/lib/docker: defaults,noatime (não usar noexec aqui)
  • Docker: usar overlay2; configurar rotação de logs (max-size=100m, max-file=5).
  • Azure: use o disco temporário (normalmente /dev/sdb, montado em /mnt ou /mnt/resource) só para swap temporária e caches. Não coloque dados persistentes nem /var/lib/docker ali.

Por que esse layout?

  • Docker consome pesado em /var/lib/docker (imagens, camadas, volumes). Dedicar um LV/partição ajuda a evitar que o host “morra” por falta de espaço no /.
  • /var/log separado evita que logs tomem a máquina. Com noexec/nodev/nosuid, reduz risco.
  • /tmp em tmpfs é rápido e não ocupa disco. Para cargas muito grandes em /tmp, ajuste o size ou redirecione a aplicação.
  • LVM permite crescer/shrink com mais segurança (especialmente crescer). Deixe um “colchão” livre no VG.
  • Manter /usr junto do / (sem separar) simplifica boot e evita problemas (muitos sistemas já assumem /usr disponível cedo).

Tamanhos sugeridos (200 GB)

  • EFI (se Gen2): 550 MB
  • /boot: 1 GB
  • swap: 8–16 GB (depende da RAM; sem hibernação)
  • / (root): 40 GB
  • /var/lib/docker: 120 GB
  • /var/log: 8 GB
  • /home: 10 GB
  • Sobra no VG: ~5–10 GB (ajuste conforme necessidade) Observação: os números são aproximados. Se você prevê muitas imagens/volumes, aumente /var/lib/docker e reduza a sobra ou /home.

Alternativas de layout (escolha conforme seu cenário)

  1. Simples e robusto (recomendado para a maioria)
  • LVM: sim
  • Partições/LVs: /boot, swap, /, /var/lib/docker, /var/log, /home, /tmp em tmpfs
  • Vantagens: segurança contra “disco cheio”, fácil de ajustar, bom para Docker
  • Desvantagens: um pouco mais de passos na configuração inicial
  1. Minimalista (tudo em / + swap) — só se você quer simplicidade extrema
  • /boot (1 GB), swap, / (todo o resto)
  • /tmp em tmpfs
  • Vantagens: simples
  • Desvantagens: se /var/lib/docker crescer demais, derruba o host; precisa de quotas ou monitoramento rigoroso
  1. Melhor prática Azure (ideal): OS + disco(s) de dados separados
  • OS disk menor (por exemplo 64–128 GB) e 1 data disk para /var/lib/docker (200 GB, Premium SSD, cache None)
  • Vantagens: isolamento, performance e backup melhores
  • Desvantagens: exige anexar outro disco (mas na Azure é fácil e recomendado)

Sistema de arquivos

  • ext4: padrão, estável e simples. Bom para tudo, inclusive Docker.
  • xfs: excelente performance com arquivos grandes; se usar em /var/lib/docker, formate com ftype=1 (obrigatório para overlay2).
  • Btrfs/ZFS: possíveis, mas aumentam a complexidade. Para produção simples em Azure, prefira ext4/xfs.

Notas específicas da Azure (importante)

  • Disco temporário (local/efêmero): aparece como /dev/sdb e monta em /mnt ou /mnt/resource (em Ubuntu). Use para swap temporária, cache de build, pip cache. Dados podem sumir a qualquer momento (reinício, realocação).
  • TRIM/Discard: mantenha o fstrim.timer ativado (padrão nas distros modernas) para recuperar espaço em Managed Disks.
  • Tipo de disco: para Docker em produção, prefira Premium SSD ou Premium SSD v2. Defina o Host Cache do data disk de Docker como None para cargas de escrita intensas.
  • Monitoramento: use métricas de disco no Azure Monitor, crie alertas para uso > 80% em /var/lib/docker.

Exemplo de /etc/fstab Ajuste UUIDs conforme seus sistemas. Exemplo de opções sólidas:

UUID=xxxx-efi /boot/efi vfat umask=0077 0 1 UUID=xxxx-boot /boot ext4 nodev,nofail 0 2 UUID=xxxx-root / ext4 defaults,noatime,errors=remount-ro 0 1 UUID=xxxx-log /var/log ext4 nodev,nosuid,noexec,noatime 0 2 UUID=xxxx-dkr /var/lib/docker ext4 defaults,noatime 0 2 UUID=xxxx-home /home ext4 nodev,nosuid,noatime 0 2 tmpfs /tmp tmpfs defaults,size=4G,noexec,nodev,nosuid 0 0

Swap: prefira swapfile no disco temporário da Azure (se disponível) ou um LV de swap no OS disk. Exemplo de tmp-based swap:

  • Crie em /mnt (disco efêmero): sudo fallocate -l 8G /mnt/swapfile && sudo chmod 600 /mnt/swapfile && sudo mkswap /mnt/swapfile && echo “/mnt/swapfile none swap sw 0 0” | sudo tee -a /etc/fstab
  • Lembre-se: swap no disco efêmero some em eventos de realocação. Mas é aceitável para swap.

Configuração do Docker

  • Driver de storage: overlay2 (padrão nas distros recentes)
  • Mover a raiz do Docker para a partição dedicada:
    • Parar Docker: sudo systemctl stop docker
    • Garantir /var/lib/docker vazio ou mover conteúdo temporariamente
    • Montar a partição/LV em /var/lib/docker
    • Iniciar Docker: sudo systemctl start docker
  • Rotação de logs (importantíssimo, evita “/var cheio”):
    • /etc/docker/daemon.json: { “log-driver”: “json-file”, “log-opts”: { “max-size”: “100m”, “max-file”: “5” }, “storage-driver”: “overlay2” }
    • sudo systemctl daemon-reload && sudo systemctl restart docker
  • journald: limite o espaço em /var/log/journal:
    • Em /etc/systemd/journald.conf, por exemplo: SystemMaxUse=1G SystemMaxFileSize=200M
    • sudo systemctl restart systemd-journald

Passo a passo (exemplo com LVM no mesmo disco de 200 GB) Atenção: adapte a nomenclatura do disco (em muitos casos o OS disk é /dev/sda). Se a VM já veio com partições padrão, considere adicionar um data disk novo e aplicar esses passos nele em vez de reprovisionar o OS disk.

  1. Criar partições (GPT, Gen2 com UEFI)
  • ESP (FAT32, 550 MB) — se já existir, não duplique
  • /boot (ext4, 1 GB)
  • PV LVM (restante do disco)

Exemplo com parted (ajuste o dispositivo!): sudo parted /dev/sda –script
mklabel gpt
mkpart ESP fat32 1MiB 551MiB
set 1 esp on
mkpart boot ext4 551MiB 1551MiB
mkpart lvm 1551MiB 100%

  1. Preparar sistemas de arquivos e LVM sudo mkfs.vfat -F32 /dev/sda1 sudo mkfs.ext4 /dev/sda2 sudo pvcreate /dev/sda3 sudo vgcreate vg0 /dev/sda3
  2. Criar LVs (ajuste tamanhos ao seu caso) sudo lvcreate -L 40G -n lv_root vg0 sudo lvcreate -L 8G -n lv_swap vg0 # ou 16G sudo lvcreate -L 120G -n lv_docker vg0 sudo lvcreate -L 8G -n lv_log vg0 sudo lvcreate -L 10G -n lv_home vg0

deixe ~10G livres no VG (não crie tudo de uma vez)

  1. Formatar e ativar sudo mkfs.ext4 /dev/vg0/lv_root sudo mkfs.ext4 /dev/vg0/lv_docker sudo mkfs.ext4 /dev/vg0/lv_log sudo mkfs.ext4 /dev/vg0/lv_home sudo mkswap /dev/vg0/lv_swap sudo swapon /dev/vg0/lv_swap
  2. Montagem e migração (se aplicável)
  • Monte em diretórios temporários, rsync de dados atuais (se já havia sistema), atualize /etc/fstab com as opções sugeridas e reinicie.
  • Para Docker, pare o serviço, mova conteúdo (se existir) e monte o LV em /var/lib/docker.

Boas práticas adicionais

  • fstrim: verifique se está ativo: systemctl status fstrim.timer (ative se necessário)
  • logrotate: garanta políticas para logs de app e do sistema
  • Monitoramento: crie alertas no Azure Monitor para:
    • Uso de disco do LV /var/lib/docker > 80%
    • Uso de inodes (df -i)
  • Segurança de montagem:
    • Noexec/nodev/nosuid em /tmp, /var/tmp, /var/log, /home (conforme sua necessidade)
    • Não aplique noexec em /var/lib/docker
  • Backups/snapshots: snapshots do disco gerenciado são úteis. Separar /var/lib/docker em um disco de dados ajuda a gerenciar snapshots independentemente do OS.

Quando separar ainda mais?

  • /opt: se você instala muitas ferramentas fora do gerenciador de pacotes (ex.: 5–10 GB)
  • /srv ou /data: se sua aplicação escreve dados persistentes fora de volumes Docker
  • /var/lib/postgresql, /var/lib/mysql: bancos de dados em partição/disk dedicado, com IOPS/latência melhores

Se quiser a solução mais simples possível

  • Use apenas /boot (1 GB), / (resto do disco), swap, e /tmp em tmpfs.
  • Ainda assim, configure a rotação de logs do Docker e journald para evitar que / encha.
  • Essa configuração é aceitável para ambientes de teste/dev ou produção com pouco footprint de Docker.

Quer que eu gere os comandos exatos adaptados à sua distro (Ubuntu, Debian, RHEL, etc.) e ao tipo de VM Azure (Gen1/Gen2)? Me diga:

  • Distro e versão
  • Tipo da VM (Gen1 BIOS ou Gen2 UEFI)
  • Tamanho de RAM
  • Se você pode anexar um disco de dados separado para o Docker (recomendado) ou se precisa ficar só no disco de 200 GB do SO

 

Prompt

Estou criando uma VM na Azure, com Linux. Estou com extrema dúvida com relação à configuração das partições do disco. Estou usando um disco de 250GB e pretendo rodar uma aplicação Python com Docker. Defina a melhor configuração das partições (/, /home, /boot, /tmp, /usr, /var, etc). Exemplifique comandos e ações na Azure Cloud.

ONE (Adapta)

Olá! Entendo perfeitamente sua dúvida. A configuração de partições é um ponto crucial para a estabilidade e performance de qualquer sistema Linux, especialmente quando se trata de cargas de trabalho como Docker, que podem consumir bastante espaço e I/O.

Vamos abordar as melhores práticas para sua VM Linux na Azure com um disco de 250GB, focando em uma aplicação Python com Docker.


🚀 Recomendações Iniciais e Contexto Azure

Antes de mergulharmos nas partições, é fundamental entender o contexto da Azure:

  1. Disco do SO (OS Disk): Na Azure, o disco do sistema operacional geralmente é gerenciado e otimizado para o boot e arquivos do sistema. Ele pode ter um custo por GB mais elevado que discos de dados. Para produção, é recomendado mantê-lo relativamente pequeno (ex: 64GB, 128GB) e usar discos de dados adicionais para cargas de trabalho de I/O intensas ou que exigem muito espaço.
  2. Discos de Dados (Data Disks): São discos adicionais que você anexa à VM. Eles oferecem maior flexibilidade, melhor performance de I/O (especialmente com Premium SSDs) e são ideais para /var/lib/docker, bancos de dados, logs pesados, etc. Para sua carga de trabalho com Docker, a melhor prática na Azure é usar um disco de dados separado para /var/lib/docker.
  3. Disco Temporário (Temporary Disk): Toda VM Azure tem um disco local efêmero (ex: /dev/sdb, montado em /mnt ou /mnt/resource). Ele é muito rápido, mas não persistente. Se a VM for realocada, reiniciada ou desligada (não apenas reboot), os dados neste disco podem ser perdidos. Use-o apenas para swap temporária, caches de build, logs efêmeros, etc. Nunca coloque dados persistentes ou /var/lib/docker nele.

🎯 Cenário Ideal (Recomendado): OS Disk Menor + Data Disk Dedicado para Docker

Este é o cenário mais robusto e performático para Docker na Azure.

1. VM na Azure: Criação e Anexação de Discos

Ao criar sua VM, você pode manter o disco de SO padrão (ex: 64GB, 128GB) e, após a criação, adicionar um novo disco de dados de 200GB (ou o tamanho que precisar para Docker).

Ações na Azure Cloud:

  • Criação da VM: Selecione sua imagem Linux preferida (Ubuntu Server, RHEL, CentOS, Debian) e o tamanho do disco do SO (padrão de 64GB ou 128GB é suficiente).
  • Anexar Data Disk (Portal Azure):
    1. Vá para sua VM no Portal Azure.
    2. No menu esquerdo, em “Configurações”, clique em “Discos”.
    3. Clique em “+ Criar e anexar um novo disco” ou “+ Anexar disco existente”.
    4. Configure o tamanho (ex: 200 GB), tipo de armazenamento (recomendo Premium SSD para Docker), e cache do host (defina para “Nenhum” ou “Read-only” para o disco do Docker, “Nenhum” é melhor para escritas pesadas).
    5. Clique em “Salvar”.

2. Configuração de Partições no Disco do SO (Ex: 64GB)

Assumindo que o disco do SO seja /dev/sda e você esteja usando uma VM Gen2 (UEFI):

  • Particionamento: Use LVM para maior flexibilidade.
  • Sistema de Arquivos: ext4 é o padrão e muito confiável.
  • Tamanhos Sugeridos:
    • /boot/efi: 550MB (FAT32) – Necessário para VMs Gen2 (UEFI).
    • /boot: 1GB (ext4) – Armazena o kernel e arquivos de boot.
    • swap: 8GB (Linux swap) – Geralmente 1x RAM até 16GB. Se usar disco temporário, pode ser menor aqui.
    • /: 40GB (ext4) – Raiz do sistema, contém /usr, /etc, etc.
    • /var/log: 8GB (ext4) – Logs do sistema.
    • /home: 10GB (ext4) – Diretórios de usuários.
    • VG Livre: ~5GB – Deixe espaço no Volume Group para futuros LVs.

Exemplo de Comandos (dentro da VM, como root ou com sudo):

  1. Identificar o disco: Use lsblk ou fdisk -l para ver seus discos. O disco do SO é geralmente /dev/sda.
  2. Particionar o disco do SO (ex: /dev/sda) com parted (para GPT/UEFI):
    # Cuidado! Substitua /dev/sda pelo seu disco do SO se for diferente.
    # Este comando apagará TUDO no disco. Faça em uma VM nova!
    sudo parted /dev/sda --script \
      mklabel gpt \
      mkpart ESP fat32 1MiB 551MiB \
      set 1 esp on \
      mkpart boot ext4 551MiB 1551MiB \
      mkpart lvm ext4 1551MiB 100%
    
  3. Criar sistemas de arquivos para EFI e /boot:
    sudo mkfs.vfat -F32 /dev/sda1 # Para /boot/efi
    sudo mkfs.ext4 /dev/sda2     # Para /boot
    
  4. Configurar LVM no restante do disco:
    sudo pvcreate /dev/sda3         # Criar Physical Volume
    sudo vgcreate vg0 /dev/sda3     # Criar Volume Group (vg0 é um nome comum)
    
  5. Criar Logical Volumes (LVs) para o OS:
    sudo lvcreate -L 40G -n lv_root vg0      # LV para /
    sudo lvcreate -L 8G -n lv_swap vg0       # LV para swap
    sudo lvcreate -L 8G -n lv_log vg0        # LV para /var/log
    sudo lvcreate -L 10G -n lv_home vg0      # LV para /home
    # Deixe espaço livre no vg0 para expansão futura
    
  6. Criar sistemas de arquivos nos LVs:
    sudo mkfs.ext4 /dev/vg0/lv_root
    sudo mkfs.ext4 /dev/vg0/lv_log
    sudo mkfs.ext4 /dev/vg0/lv_home
    sudo mkswap /dev/vg0/lv_swap
    

3. Configuração de Partições no Data Disk Dedicado (Ex: 200GB)

Assumindo que o Data Disk é /dev/sdc (o próximo disponível após /dev/sda e /dev/sdb – o temporário):

  • Particionamento: Use o disco inteiro ou LVM se planeja ter mais LVs nele futuramente. Para um único uso (/var/lib/docker), uma única partição primária é suficiente.
  • Sistema de Arquivos:
    • ext4: Simples e eficaz.
    • xfs: Excelente para cargas de trabalho com muitos arquivos pequenos ou arquivos grandes, como imagens Docker. Se usar XFS para Docker, é crucial formatar com ftype=1.

Exemplo de Comandos (dentro da VM):

  1. Identificar o Data Disk: Use lsblk ou fdisk -l. Ex: /dev/sdc.
  2. Particionar o Data Disk (ex: /dev/sdc):
    # Para uma única partição cobrindo todo o disco
    sudo parted /dev/sdc --script \
      mklabel gpt \
      mkpart primary ext4 0% 100% # Ou xfs
    
  3. Criar o sistema de arquivos:
    # Opção 1: ext4 (simples)
    sudo mkfs.ext4 /dev/sdc1
    
    # Opção 2: xfs (recomendado para Docker) - IMPRESCINDÍVEL ftype=1 para overlay2
    sudo mkfs.xfs -f -i ftype=1 /dev/sdc1
    
  4. Criar o ponto de montagem e montar:
    sudo mkdir -p /var/lib/docker
    # Se você já tem Docker instalado e em uso, precisará parar o serviço,
    # mover o conteúdo existente de /var/lib/docker para um local temporário
    # (ex: /tmp/docker_backup), montar o novo disco, e depois mover de volta.
    sudo mount /dev/sdc1 /var/lib/docker
    

4. Configuração do /etc/fstab (Para ambos os discos)

É crucial adicionar as novas partições ao /etc/fstab para que sejam montadas automaticamente no boot. Use os UUIDs para garantir que a montagem seja robusta e não dependa da ordem dos discos.

  1. Obter UUIDs:
    sudo blkid
    
  2. Exemplo de /etc/fstab:
    # <file system>        <mount point>   <type>   <options>                               <dump> <pass>
    UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /boot/efi        vfat   umask=0077                              0 1
    UUID=yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy /boot            ext4   nodev,nofail                            0 2
    UUID=zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzzz /                ext4   defaults,noatime,errors=remount-ro      0 1
    UUID=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa /var/log         ext4   nodev,nosuid,noexec,noatime             0 2
    UUID=bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbbb /var/lib/docker  ext4   defaults,noatime                        0 2 # Ou xfs
    UUID=cccccccc-cccc-cccc-cccc-cccccccccccc /home            ext4   nodev,nosuid,noatime                    0 2
    /dev/vg0/lv_swap                         none             swap   sw                                      0 0
    tmpfs                                    /tmp             tmpfs  defaults,size=4G,noexec,nodev,nosuid    0 0
    
    • noatime: Melhora a performance ao evitar atualizações de acesso a arquivos.
    • nodev, nosuid, noexec: Aumenta a segurança, impedindo execução de binários, uso de dispositivos ou setuid em partições específicas (especialmente tmp, var/log, home). NÃO use noexec em /var/lib/docker!
  3. Testar montagens: Após salvar fstab, execute sudo mount -a para testar. Se não houver erros, tudo está bem.

💻 Cenário Alternativo: Apenas um Disco de SO de 250GB

Se por algum motivo você não puder anexar um disco de dados separado e precisar usar o disco de 250GB para tudo, esta é a configuração recomendada, ainda com LVM.

1. Layout de Partições (com LVM) para 250GB

  • /boot/efi: 550MB (FAT32) – Para VMs Gen2 (UEFI).
  • /boot: 1GB (ext4) – Kernel e arquivos de boot.
  • swap: 8GB (Linux swap) – Ajuste à RAM da sua VM (1x RAM até 16GB é uma boa regra geral sem hibernação).
  • /: 50GB (ext4) – Raiz do sistema.
  • /var/lib/docker: 150GB (ext4 ou xfs) – Dedicado para imagens e volumes Docker.
  • /var/log: 8GB (ext4) – Logs do sistema.
  • /home: 10GB (ext4) – Diretórios de usuários.
  • VG Livre: ~20GB – Deixe espaço livre no Volume Group para futuras expansões.

2. Comandos de Particionamento e LVM

O processo é idêntico ao do cenário ideal, mas com os tamanhos ajustados e tudo no mesmo disco (/dev/sda).

  1. Particionar o disco (ex: /dev/sda) com parted:
    # Cuidado! Substitua /dev/sda pelo seu disco do SO se for diferente.
    sudo parted /dev/sda --script \
      mklabel gpt \
      mkpart ESP fat32 1MiB 551MiB \
      set 1 esp on \
      mkpart boot ext4 551MiB 1551MiB \
      mkpart lvm ext4 1551MiB 100%
    
  2. Criar sistemas de arquivos para EFI e /boot:
    sudo mkfs.vfat -F32 /dev/sda1 # Para /boot/efi
    sudo mkfs.ext4 /dev/sda2     # Para /boot
    
  3. Configurar LVM:
    sudo pvcreate /dev/sda3
    sudo vgcreate vg0 /dev/sda3
    
  4. Criar LVs:
    sudo lvcreate -L 50G -n lv_root vg0
    sudo lvcreate -L 8G -n lv_swap vg0
    sudo lvcreate -L 150G -n lv_docker vg0
    sudo lvcreate -L 8G -n lv_log vg0
    sudo lvcreate -L 10G -n lv_home vg0
    
  5. Criar sistemas de arquivos nos LVs:
    sudo mkfs.ext4 /dev/vg0/lv_root
    sudo mkfs.ext4 /dev/vg0/lv_docker  # Ou mkfs.xfs -f -i ftype=1 /dev/vg0/lv_docker
    sudo mkfs.ext4 /dev/vg0/lv_log
    sudo mkfs.ext4 /dev/vg0/lv_home
    sudo mkswap /dev/vg0/lv_swap
    
  6. Configurar /etc/fstab: O formato é o mesmo do cenário ideal, apenas os UUIDs e tamanhos de LV serão diferentes.
    # Exemplo (substitua UUIDs)
    UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /boot/efi        vfat   umask=0077                              0 1
    UUID=yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy /boot            ext4   nodev,nofail                            0 2
    UUID=zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzzz /                ext4   defaults,noatime,errors=remount-ro      0 1
    UUID=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa /var/log         ext4   nodev,nosuid,noexec,noatime             0 2
    UUID=bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbbb /var/lib/docker  ext4   defaults,noatime                        0 2
    UUID=cccccccc-cccc-cccc-cccc-cccccccccccc /home            ext4   nodev,nosuid,noatime                    0 2
    /dev/vg0/lv_swap                         none             swap   sw                                      0 0
    tmpfs                                    /tmp             tmpfs  defaults,size=4G,noexec,nodev,nosuid    0 0
    

🐳 Configuração Específica para Docker

Independentemente do cenário de disco, estas configurações são cruciais para o Docker:

  1. Verificar Driver de Armazenamento: O Docker moderno usa overlay2 por padrão, que é eficiente. Verifique com docker info | grep "Storage Driver".
  2. Rotação de Logs dos Containers: Impedir que logs de containers encham o disco é vital. Crie ou edite o arquivo /etc/docker/daemon.json:
    {
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m",
        "max-file": "5"
      },
      "storage-driver": "overlay2"
    }
    

    Isso limita cada log de container a 100MB e mantém um máximo de 5 arquivos de log (total de 500MB por container).

  3. Reiniciar Docker para aplicar as mudanças:
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

🧹 Limpeza e Boas Práticas Adicionais

  • fstrim: Ative o serviço fstrim.timer para garantir que o Linux notifique o Azure sobre blocos não utilizados, permitindo a recuperação de espaço em discos gerenciados.
    sudo systemctl enable fstrim.timer
    sudo systemctl start fstrim.timer
    
  • /tmp em tmpfs: Montar /tmp como tmpfs (sistema de arquivos baseado em RAM) é rápido, seguro e não consome espaço em disco persistente. Já está incluído nos exemplos de fstab. Ajuste size=4G conforme a RAM da sua VM.
  • Journald: Limite o tamanho dos logs do journald em /etc/systemd/journald.conf para evitar que /var/log (ou /) encha:
    [Journal]
    SystemMaxUse=1G   # Máximo de 1GB para logs do sistema
    SystemMaxFileSize=200M # Máximo de 200MB por arquivo de log
    

    Após editar, reinicie: sudo systemctl restart systemd-journald.

  • Monitoramento: Use o Azure Monitor para criar alertas de uso de disco (especialmente /var/lib/docker e /) para que você seja notificado antes que o espaço se esgote.

Espero que este guia detalhado ajude você a configurar suas partições de forma otimizada na Azure! A escolha entre usar um único disco ou um disco de dados separado para Docker é importante, e o cenário com o disco de dados dedicado é geralmente a melhor opção para produção e escalabilidade.

Se tiver mais perguntas ou quiser adaptar algo para uma distribuição Linux específica, me diga! 😊

Docker – Database

Postgres

Subir novo banco

$ sudo docker run –name postgres -p 5432:5432 -e POSTGRES_PASSWORD=postgres -d postgres

OBS: Caso apresente a seguinte mensagem:

docker: Error response from daemon: Conflict. The container name “/postgres” is already in use by container

Execute o comando para listar os containers

$ sudo docker container ls -a

Possível retorno (caso algum container tenha sido executado):

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d1eeef8cb196 postgres "docker-entrypoint.s…" 8 minutes ago Exited (1) 8 minutes ago strange_driscoll
a15a476e5762 postgres:latest "docker-entrypoint.s…" 15 minutes ago Exited (1) 15 minutes ago upbeat_almeida
6e848c2aa472 postgres "docker-entrypoint.s…" 2 months ago Exited (0) 2 months ago postgres
6384a84eb8a0 postgres:14-alpine "docker-entrypoint.s…" 3 months ago Exited (0) 8 weeks ago my-postgres
d4033c9b13ae mysql "docker-entrypoint.s…" 3 months ago Exited (0) 8 weeks ago mysql

Reiniciar o container pelo nome

$ sudo docker restart my-postgres

Como Instalar e Utilizar o Docker no Ubuntu 20.04

Introdução

Docker é um aplicativo que simplifica o processo de gerenciamento de processos de aplicação em containers. Os containers deixam você executar suas aplicações em processos isolados de recurso. Eles são semelhantes a máquinas virtuais, mas os containers são mais portáveis, mais fáceis de usar e mais dependentes do sistema operacional do host.

Para uma introdução detalhada aos diferentes componentes de um container Docker, verifique O Ecossistema Docker: Uma Introdução aos Componentes Comuns.

Neste tutorial, você irá instalar e usar a Edição Community (CE) do Docker no Ubuntu 20.04. Você instalará o Docker propriamente dito, trabalhará com contêineres e imagens, e enviará uma imagem para um repositório do Docker.

Pré-requisitos

Para seguir este tutorial, você precisará do seguinte:

Passo 1 — Instalando o Docker

O pacote de instalação do Docker disponível no repositório oficial do Ubuntu pode não ser a versão mais recente. Para garantir que tenhamos a versão mais recente, iremos instalar o Docker do repositório oficial do Docker. Para fazer isso, adicionaremos uma nova fonte de pacote, adicionaremos a chave GPG do Docker para garantir que os downloads sejam válidos, e então instalaremos o pacote.

Primeiro, atualize sua lista existente de pacotes:

sudo apt update

 Copy

Em seguida, instale alguns pacotes pré-requisito que deixam o apt usar pacotes pelo HTTPS:

sudo apt install apt-transport-https ca-certificates curl software-properties-common

 Copy

Então, adicione a chave GPG para o repositório oficial do Docker no seu sistema:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

 Copy

Adicione o repositório do Docker às fontes do APT:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

 Copy

Em seguida, atualize o banco de dados do pacote com os pacotes do Docker do recém adicionado repositório:

sudo apt update

 Copy

Certifique-se de que você está prestes a instalar do repositório do Docker ao invés do repositório padrão do Ubuntu:

apt-cache policy docker-ce

 Copy

Você verá um resultado assim, embora o número da versão para o Docker possa ser diferente:Output of apt-cache policy docker-ce

docker-ce:
  Installed: (none)
  Candidate: 5:19.03.9~3-0~ubuntu-focal
  Version table:
     5:19.03.9~3-0~ubuntu-focal 500
        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

 Copy

Observe que o docker-ce não está instalado, mas o candidato para a instalação é do repositório do Docker para o Ubuntu 20.04 (focal).

Finalmente, instale o Docker:

sudo apt install docker-ce

 Copy

O Docker deve agora ser instalado, o daemon iniciado e o processo habilitado a iniciar no boot. Verifique se ele está funcionando:

sudo systemctl status docker

 Copy

O resultado deve ser similar ao mostrado a seguir, mostrando que o serviço está ativo e funcionando:

Output● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2020-05-19 17:00:41 UTC; 17s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 24321 (dockerd)
      Tasks: 8
     Memory: 46.4M
     CGroup: /system.slice/docker.service
             └─24321 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Instalando o Docker agora não dá apenas o serviço do Docker (daemon), mas também o utilitário de linha de comando docker, ou o cliente do Docker. Vamos explorar como usar o comando docker mais tarde neste tutorial.

Passo 2 — Executando o Comando Docker Sem Sudo (Opcional)

Por padrão, o comando docker só pode ser executado pelo usuário root ou por um usuário no grupo docker, que é criado automaticamente no processo de instalação do Docker. Se você tentar executar o comando docker sem prefixar ele com o sudo ou sem estar no grupo docker, você terá um resultado como este:

Outputdocker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.

Se você quiser evitar digitar sudo sempre que você executar o comando docker, adicione seu nome de usuário no grupo docker:

sudo usermod -aG docker ${USER}

 Copy

Para inscrever o novo membro ao grupo, saia do servidor e logue novamente, ou digite o seguinte:

su - ${USER}

 Copy

Você será solicitado a digitar a senha do seu usuário para continuar.

Confirme que seu usuário agora está adicionado ao grupo docker digitando:

id -nG

 Copy

Outputsammy sudo docker

Se você precisar adicionar um usuário ao grupo docker com o qual você não está logado, declare esse nome de usuário explicitamente usando:

sudo usermod -aG docker username

 Copy

O resto deste artigo supõe que você esteja executando o comando docker como um usuário no grupo docker. Se você escolher não fazer isso, por favor preencha os comandos com sudo.

Vamos explorar o comando docker a seguir.

Passo 3 — Usando o Comando Docker

Usar o docker consiste em passar a ele uma cadeia de opções e comandos seguidos de argumentos. A sintaxe toma esta forma:

docker [option] [command] [arguments]

 Copy

Para ver todos os subcomandos disponíveis, digite:

docker

 Copy

No Docker 19, a lista completa de subcomandos disponíveis inclui:

Output  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

Para visualizar as opções disponíveis para um comando específico, digite:

docker docker-subcommand --help

 Copy

Para visualizar informações de sistema sobre o Docker, use:

docker info

 Copy

Vamos explorar alguns desses comandos. Começaremos trabalhando com imagens.

Passo 4 — Trabalhando com Imagens do Docker

Os containers do Docker são construídos com imagens do Docker. Por padrão, o Docker puxa essas imagens do Docker Hub, um registro Docker gerido pelo Docker, a empresa por trás do projeto Docker. Qualquer um pode hospedar suas imagens do Docker no Docker Hub, então a maioria dos aplicativos e distribuições do Linux que você precisará terá imagens hospedadas lá.

Para verificar se você pode acessar e baixar imagens do Docker Hub, digite:

docker run hello-world

 Copy

O resultado irá indicar que o Docker está funcionando corretamente:

OutputUnable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

...

O Docker inicialmente não conseguiu encontrar a imagem hello-world localmente, então ele baixou a imagem do Docker Hub, que é o repositório padrão. Uma vez baixada a imagem, o Docker criou um container da imagem e executou o aplicativo no container, mostrando a mensagem.

Você pode procurar imagens disponíveis no Docker Hub usando o comando docker com o subcomando search. Por exemplo, para procurar a imagem do Ubuntu, digite:

docker search ubuntu

 Copy

O script irá vasculhar o Docker Hub e devolverá uma lista de todas as imagens cujo nome correspondam ao string de pesquisa. Neste caso, o resultado será similar a este:

OutputNAME                                                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                                    Ubuntu is a Debian-based Linux operating sys…   10908               [OK]
dorowu/ubuntu-desktop-lxde-vnc                            Docker image to provide HTML5 VNC interface …   428                                     [OK]
rastasheep/ubuntu-sshd                                    Dockerized SSH service, built on top of offi…   244                                     [OK]
consol/ubuntu-xfce-vnc                                    Ubuntu container with "headless" VNC session…   218                                     [OK]
ubuntu-upstart                                            Upstart is an event-based replacement for th…   108                 [OK]
ansible/ubuntu14.04-ansible                               Ubuntu 14.04 LTS with
...

Na coluna OFICIAL, o OK indica uma imagem construída e suportada pela empresa por trás do projeto. Uma vez que você tenha identificado a imagem que você gostaria de usar, você pode baixá-la para seu computador usando o subcomando pull.

Execute o comando a seguir para baixar a imagem oficial ubuntu no seu computador:

docker pull ubuntu

 Copy

Você verá o seguinte resultado:

OutputUsing default tag: latest
latest: Pulling from library/ubuntu
d51af753c3d3: Pull complete
fc878cd0a91c: Pull complete
6154df8ff988: Pull complete
fee5db0ff82f: Pull complete
Digest: sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

Após o download de uma imagem, você pode então executar um container usando a imagem baixada com o subcomando run. Como você viu com o exemplo hello-world, caso uma imagem não tenha sido baixada quando o docker for executado com o subcomando run, o cliente do Docker irá primeiro baixar a imagem e então executar um container usando ele.

Para ver as imagens que foram baixadas no seu computador, digite:

docker images

 Copy

O resultado se parecerá com o seguinte:

OutputREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              1d622ef86b13        3 weeks ago         73.9MB
hello-world         latest              bf756fb1ae65        4 months ago        13.3kB

Como você verá mais tarde neste tutorial, imagens que você usa para executar containers podem ser modificadas e usadas para gerar novas imagens, que podem então ser enviadas (pushed é o termo técnico) para o Docker Hub ou outros registros do Docker.

Vamos ver como executar containers mais detalhadamente.

Passo 5 — Executando um Container do Docker

O container hello-world que você executou no passo anterior é um exemplo de um container que executa e finaliza após emitir uma mensagem de teste. Os containers podem ser muito mais úteis do que isso, e eles podem ser interativos. Afinal, eles são semelhantes a máquinas virtuais, apenas mais fáceis de usar.

Como um exemplo, vamos executar um container usando a última imagem do Ubuntu. A combinação dos switches -i e -t dá a você um acesso de shell interativo no container:

docker run -it ubuntu

 Copy

Seu prompt de comando deve mudar para refletir o fato de você agora estar trabalhando dentro do container e deve assumir esta forma:

Outputroot@d9b100f2f636:/#

Observe o id do container no prompt de comando. Neste exemplo, é d9b100f2f636. Você precisará do ID do container mais tarde para identificar o container quando você quiser removê-lo.

Agora você pode executar qualquer comando dentro do container. Por exemplo, vamos atualizar o banco de dados do pacote dentro do container. Você não precisa prefixar nenhum comando com sudo, porque você está operando dentro do container como o usuário root:

apt update

 Copy

Então, instale qualquer aplicativo nele. Vamos instalar o Node.js:

apt install nodejs

 Copy

Isso instala o Node.js no container do repositório oficial do Ubuntu. Quando a instalação terminar, verifique se o Node.js está instalado:

node -v

 Copy

Você verá o número da versão exibido no seu terminal:

Outputv10.19.0

Qualquer alteração que você faça dentro do container apenas se aplica a esse container.

Para sair do container, digite exit no prompt.

Vamos ver como gerenciar os containers no nosso sistema a seguir.

Passo 6 — Gerenciando os Containers do Docker

Após usar o Docker por um tempo, você terá muitos containers ativos (executando) e inativos no seu computador. Para visualizar os ativos, use:

docker ps

 Copy

Você verá um resultado similar ao seguinte:

OutputCONTAINER ID        IMAGE               COMMAND             CREATED             

Neste tutorial, você iniciou dois containers; um da imagem hello-world e outro da imagem ubuntu. Ambos os containers já não estão funcionando, mas eles ainda existem no seu sistema.

Para ver todos os containers — ativos e inativos, execute docker ps com o switch -a:

docker ps -a

 Copy

Você verá um resultado similar a este:

1c08a7a0d0e4        ubuntu              "/bin/bash"         2 minutes ago       Exited (0) 8 seconds ago                       quizzical_mcnulty
a707221a5f6c        hello-world         "/hello"            6 minutes ago       Exited (0) 6 minutes ago                       youthful_curie

Para ver o último container que você criou, passe o switch -l:

docker ps -l

 Copy

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
1c08a7a0d0e4        ubuntu              "/bin/bash"         2 minutes ago       Exited (0) 40 seconds ago                       quizzical_mcnulty

 Copy

Para iniciar um container parado, use o docker start, seguido do ID do container ou nome do container. Vamos iniciar o contêiner baseado no Ubuntu com o ID do 1c08a7a0d0e4:

docker start 1c08a7a0d0e4

 Copy

O container irá iniciar e você pode usar o docker ps para ver seu status:

OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
1c08a7a0d0e4        ubuntu              "/bin/bash"         3 minutes ago       Up 5 seconds                            quizzical_mcnulty

Para parar um container em execução, use o docker stop, seguido do ID ou nome do container. Desta vez, usaremos o nome que o Docker atribuiu ao contêiner, que é quizzical_mcnulty:

docker stop quizzical_mcnulty

 Copy

Uma vez que você tenha decidido que você já não precisa mais de um container, remova ele com o comando docker rm, novamente usando o ID do container ou o nome. Use o comando docker ps -a para encontrar o ID ou nome do container associado à imagem hello-world e remova-o.

docker rm youthful_curie

 Copy

Você pode iniciar um novo container e dar a ele um nome usando o switch --name. Você também pode usar o switch --rm para criar um container que remove a si mesmo quando ele é parado. Veja o comando docker run help para obter mais informações sobre essas e outras opções.

Os containers podem ser transformados em imagens que você pode usar para criar novos containers. Vamos ver como isso funciona.

Passo 7 —Enviando Alterações em um Container para uma Imagem do Docker

Quando você iniciar uma imagem do Docker, você pode criar, modificar e deletar arquivos assim como você pode com uma máquina virtual. As alterações que você faz apenas se aplicarão a esse container. Você pode iniciá-lo e pará-lo, mas uma vez que você o destruir com o comando docker rm, as alterações serão perdidas para sempre.

Esta seção mostra como salvar o estado de um container como uma nova imagem do Docker.

Após instalar o Node.js dentro do container do Ubuntu, você agora tem um container executando uma imagem, mas o container é diferente da imagem que você usou para criá-lo. Mas você pode querer reutilizar este container Node.js como a base para novas imagens mais tarde.

Então, envie as alterações a uma nova instância de imagem do Docker usando o comando a seguir.

docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name

 Copy

O switch -m é para a mensagem de envio que ajuda você e outros a saber quais as alterações que você fez, enquanto -a é usado para especificar o autor. O container_id é aquele que você anotou anteriormente no tutorial quando você iniciou a sessão interativa do Docker. A menos que você tenha criado repositórios adicionais no Docker Hub, repository é normalmente seu nome de usuário do Docker Hub.

Por exemplo, para o usuário sammy, com o ID do container d9b100f2f636, o comando seria:

docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs

 Copy

Quando você envia uma imagem, a nova imagem é salva localmente no seu computador. Mais tarde neste tutorial, você aprenderá como empurrar uma imagem para um registro do Docker para que outros possam acessá-la.

Listando as imagens do Docker novamente irá mostrar a nova imagem, além da antiga da qual ela foi derivada:

docker images

 Copy

Você verá um resultado como esse:

OutputREPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
sammy/ubuntu-nodejs   latest              7c1f35226ca6        7 seconds ago       179MB
...

Neste exemplo, o ubuntu-nodejs é a nova imagem, que foi derivada da imagem ubuntu existente do Docker Hub. A diferença de tamanho reflete as alterações que foram feitas. E neste exemplo, a mudança foi que o NodeJS foi instalado. Então, da próxima vez que você precisar executar um container usando o Ubuntu com o NodeJS pré-instalado, você pode apenas usar a nova imagem.

Você também pode construir Imagens de um Dockerfile, que permite a você automatizar a instalação de software em uma nova imagem. No entanto, isso está fora do âmbito deste tutorial.

Agora vamos compartilhar a nova imagem com outros para que eles possam criar containers a partir dela.

Passo 8 — Empurrando Imagens do Docker para um Repositório do Docker

O próximo passo lógico após criar uma nova imagem de uma imagem existente é compartilhá-la com alguns de seus amigos, todo o mundo no Docker Hub, ou outro registro do Docker que você tenha acesso. Para empurrar uma imagem para o Docker Hub ou qualquer outro registro do Docker, você deve ter uma conta lá.

Esta seção mostra como empurrar uma imagem do Docker para o Docker Hub. Para aprender a criar seu próprio registro privado do Docker, verifique Como Configurar um Registro Privado do Docker no Ubuntu 14.04.

Para empurrar sua imagem, primeiro logue no Docker Hub.

docker login -u docker-registry-username

 Copy

Você será solicitado a autenticar-se usando sua senha do Docker Hub. Se você especificou a senha correta, a autenticação deve ser bem sucedida.

Nota: se seu nome de usuário de registro do Docker for diferente do nome de usuário local que você usou para criar a imagem, você terá que anexar sua imagem com seu nome de usuário de registro. Para o exemplo dado no último passo, você digitaria:

docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

 Copy

Então você pode empurrar sua própria imagem usando:

docker push docker-registry-username/docker-image-name

 Copy

Para empurrar a imagem ubuntu-nodejs no repositório sammy, o comando seria:

docker push sammy/ubuntu-nodejs

 Copy

O processo pode levar algum tempo para se completar uma vez que ele envia as imagens, mas quando finalizado, o resultado se parecerá com este:

OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed

...


Após empurrar uma imagem para um registro, ela deve estar listada no painel da sua conta, como mostrado na imagem abaixo.

New Docker image listing on Docker Hub

Se uma tentativa de empurrar resultar em um erro deste tipo, então você provavelmente não logou:

OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Preparing
5f70bf18a086: Preparing
a3b5c80a4eba: Preparing
7f18b442972b: Preparing
3ce512daaf78: Preparing
7aae4540b42d: Waiting
unauthorized: authentication required

Logue com docker login e repita a tentativa de empurrar. Então verifique se ela existe na sua página de repositório do Docker Hub.

Você agora pode usar o docker pull sammy/ubuntu-nodejs para puxar a imagem para uma nova máquina e usá-la para executar um novo contêiner.

Fonte: https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04-pt

PostgreSQL, PgAdmin e Docker

Neste post, vamos configurar o docker-compose, para disponibilizar o PostgreSQL com PgAdmin, de maneira fácil e rápida.

Premissa: Espera-se que tenha instalado o Docker e Docker-Compose.

docker-compose.yml


version: '3'

services:
  teste-postgres-compose:
    image: postgres
    environment:
      POSTGRES_PASSWORD: "Postgres2021!"
    ports:
      - "15432:5432"
    volumes:
      - /home/fernando/data/postgres:/var/lib/postgresql/data 
    networks:
      - postgres-compose-network
      
  teste-pgadmin-compose:
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: "lfchaim@gmail.com"
      PGADMIN_DEFAULT_PASSWORD: "PgAdmin2021!"
    ports:
      - "16543:80"
    depends_on:
      - teste-postgres-compose
    networks:
      - postgres-compose-network

networks: 
  postgres-compose-network:
    driver: bridge

Subindo os conteiners

$ sudo docker-compose up -d

Ao final do processo, deve aparecer o log final

Status: Downloaded newer image for dpage/pgadmin4:latest
Creating postgres_teste-postgres-compose_1 ... done
Creating postgres_teste-pgadmin-compose_1  ... done

Pode-se verificar os conteiners rodando, com o comando

$ sudo docker ps

Deverá aparecer

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                            NAMES
1fffaaa4887c        dpage/pgadmin4      "/entrypoint.sh"         About a minute ago   Up About a minute   443/tcp, 0.0.0.0:16543->80/tcp   postgres_teste-pgadmin-compose_1
63e1934f7cdb        postgres            "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:15432->5432/tcp          postgres_teste-postgres-compose_1

Agora, vamos acessar o PgAdmin

Abra um navegador e digite: http://localhost:16543

Forneça o usuário e senha informados no docker-compose

Exemplo: lfchaim@gmail.com / PgAdmin2021!

Na tela do PgAdmin, clique em “Add New Server”

Dê um nome: teste-postgres-compose

Repita o nome em Host: teste-postgres-compose

Usuário: postgres

Senha: Postgres2021! (mesma do docker-compose)

Clicar em “Save”

Pronto! Seu ambiente está criado!

Instalando ELK no Ubuntu

Este post apresenta de forma fácil, a instalação do ELK no Ubuntu.

Baixando a imagem Docker

Para baixar a imagem ELK, execute o comando abaixo.

$ sudo docker pull sebp/elk:latest

Subindo a imagem ELK

Para subir a aplicação, execute o comando abaixo.

$ sudo docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --name elk sebp/elk

OBS: Se apresentar erro de memória, execute o comando abaixo.

$ sudo sysctl -w vm.max_map_count=262144

Esse comando é uma solução temporária, ao reiniciar o sistema, volta o valor padrão.

Para configurar a memória de forma definitiva, utilize o comando:

$ sudo gedit /etc/sysctl.conf

Adicionar a linha abaixo e salvar o arquivo.

vm.max_map_count=262144

Após subir a aplicação, pode-se testar os ambientes.

Elasticsearch:

http://localhost:9200

Kibana:

http://localhost:5601

Para a imagem

$ sudo docker ps

Resultado:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7b1600afd168 sebp/elk “/usr/local/bin/star…” 15 minutes ago Up 14 minutes 0.0.0.0:5044->5044/tcp, 0.0.0.0:5601->5601/tcp, 0.0.0.0:9200->9200/tcp, 9300/tcp elk

Para com o id do container

$ sudo docker stop 7b1600afd168

Remover o nome elk

$ sudo docker rm elk

 

Instalando Docker Compose no Ubuntu

Este post demonstra como instalar o Docker Compose no Ubuntu.

Procedimento via curl

Faça o download conforme o comando abaixo

$ sudo curl -L “https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)” -o /usr/bin/docker-compose

Altere as permissões para executar o arquivo

$ sudo chmod +x /usr/bin/docker-compose

Verifique a instalação

$ docker-compose -v

 

Docker – Principais Aplicações

Este post tem por objetivo, demonstrar de forma fácil, as principais aplicações do Docker.

Elasticsearch

Baixando a imagem

$ sudo docker pull docker.elastic.co/elasticsearch/elasticsearch:6.4.3

Rodando a imagem

$ sudo docker run -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” docker.elastic.co/elasticsearch/elasticsearch:6.4.3

Logstash

Baixando a imagem

$ sudo docker pull docker.elastic.co/logstash/logstash:6.4.3

Rodando a imagem

$ sudo docker run –rm -it -v ~/pipeline/:/usr/share/logstash/pipeline/ docker.elastic.co/logstash/logstash:6.4.3

Kibana

Baixando a imagem

$ sudo docker pull docker.elastic.co/kibana/kibana:6.4.3

Rodando a imagem

$ sudo docker run -dt -p 5601:5601 -e “ELASTICSEARCH_URL=http://elastic:9200” –network=elastic docker.elastic.co/kibana/kibana:6.4.3

Informações Adicionais

Docker & Elastic

Fonte: https://www.docker.elastic.co

Comandos do Docker

Docker info

docker info

Quando nós acabamos de subir o Docker Engine, nós utilizamos esse comando para verificarmos as informações do nosso Docker Host.

Docker version

docker version

Com o version nós conseguimos ver a versão do nosso Client, para esse artigo estou utilizando o Windows e o Server que para esse exemplo estamos utilizar o Linux. Quanto ao OS/Arch do server nós podemos trabalhar com Windows ou Linux, caso você esteja utilizando o Docker for Windows basta clicar em Swith to Windows Containers que ele irá realizar essa alteração.

Docker images

docker images

Nós utilizamos ele para listarmos as imagens que nós temos no nosso host, como eu acabei de instalar o Docker no meu Windows a lista está vazia como podemos ver na imagem a baixo:

  • Repository: repositório;
  • TAG: tag utilizada no repositório;
  • IMAGE ID: o id na nossa imagem;
  • Created: data de quando nós criamos a nossa imagem;
  • Size: tamanho da imagem;

Docker search

docker search (parametro)

Para que possamos procurar uma imagem, nós podemos utilizar o comando a baixo com o parâmetro nome Ex.: ubuntu, dotnetcore, node … etc, assim ele irá buscar as imagens que são compatíveis com o nosso server que para esse exemplo estamos utilizando o Linux.

Docker pull

docker pull (parametro)

Quando encontrarmos a imagem que precisamos para a nossa aplicação, nós precisamos baixar ela para o nosso host.

Docker run

docker pull (nome da imagem)

Para que nós possamos criar um contêiner, nós precisamos de uma imagem. Caso você não tenha essa imagem no seu host ainda ele irá até o repositório central e irá baixar ela para o seu host, em seguida ele irá criar o contêiner.

Docker ps

docker ps 

Agora vamos verificar o status do nosso contêiner, execute o comando acima no seu terminal.

Docker status

docker stats (id ou apelido do container)

Para que possamos ter informações sobre um contêiner nos executamos o comando acima, ele nos retorna dados como:

  • CONTAINER — ID do Container;
  • CPU % — uso de CPU em porcentagem;
  • MEM USAGE / LIMIT — Memória usada/Limite que você pode ter setado;
  • MEM — uso de memória em porcentagem;
  • NET I/O — I/O de Internet;
  • BLOCK IO — Outros processos de I/O;

Docker inspect

docker inspect (id da imagem ou container)

Caso você precise de mais detalhes sobre a sua imagem ou o seu contêiner, podemos utilizar o comando inspect. Ele irá retornar um json com todas as informações relacionadas a nossa busca.

Docker rmi

docker rmi (nome da imagem)

Caso você tenha baixado uma imagem errada ou queira deletar alguma por um outro motivo, basta executar o comando a cima que ele deleta ela do seu host.

Docker rm e ps

Você pode excluir todos os containers criados

$ sudo docker rm ($ sudo docker ps -a)

Ou remover os criados e parados

$ sudo docker rm ($ sudo docker ps -a -q)

Docker exec

docker exec (id_container ou nome_container) 

Com o exec nós podemos executar qualquer comando nos nossos contêineres sem precisarmos estar na console deles.

Vejamos a baixo alguns dos parâmetros que podemos utilizar com ele:

  • -i permite interagir com o container
  • -t associa o seu terminal ao terminal do container
  • -it é apenas uma forma reduzida de escrever -i -t
  • --name algum-nome permite atribuir um nome ao container em execução
  • -p 8080:80 mapeia a porta 80 do container para a porta 8080 do host
  • -d executa o container em background
  • -v /pasta/host:/pasta/container cria um volume ‘/pasta/container’ dentro do container com o conteúdo da pasta ‘/pasta/host’ do host

Docker attach

docker attach (id_container ou nome_container)

Vamos agora entrar dentro do nosso contêiner e verificar o nosso novo arquivo criado. Para isso execute o comando acima + o nome do ou id do seu contêiner, podemos observar que a execução dele irá nos dar acesso de root no nosso contêiner.

Docker start

docker start (id do container)

Quando nós saimos do nosso container com o comando exit, ele mata o nosso processo.

Para que possamos dar um dettach ou em outras palavras sair sem fecharmos ele, nós precisamos dos comandos: Ctrl+p + Ctrl+q. Para que possamos subir ele novamente vamos utilizar o comando start.

Agora execute o comando attach novamente para entrar no seu contêiner e depois os comandos : Ctrl+p + Ctrl+q, em seguida podemos verificar que o nosso contêiner ainda está em execução.

Docker stop

docker stop (id ou nome container)

Para que possamos parar um contêiner que esteja sendo executado, nós utilizamos o comando stop. Sua execução é bem simples, nós passamos o mesmos parâmetros que utilizamos no start.

Mapeamento de Portas

-p host:container

Para que possamos testar o mapeamento de portas iremos baixar a imagem do ngnix e passarmos para ele a porta 80. Para isso execute o comando a baixo no seu terminal:

docker run -it -p 8080:80 nginx

Ele irá baixar a imagem do nginx para o seu host e abrir ele na porta 8080 do seu host. Para testar assim que ele finalizar a execução do comando acima, abra no seu navegador o endereço: http://localhost:8080/, podemos ver o seu retorno na imagem a baixo.

Mas executando ele dessa forma nós ficamos com o nosso console travado.

Para que possamos ter um contêiner sendo executado em background, nós podemos utilizar eles em segundo plano. Para isso, só precisamos passar o comando -d. Caso ainda esteja o seu contêiner ainda esteja sendo executado, execute o comando control c para sair dele, em seguida execute o mesmo comando anterior só que agora com o parâmetro -d:

docker run -it -d -p 8080:80 nginx

Docker – Spring Data REST e H2

Introdução

Este post tem por objetivo, incluir a aplicação Spring Data REST e H2 sob o container Docker.

Premissa

Procedimento

Com a aplicação importada em sua IDE de preferência, crie o arquivo Dockerfile (sem extensão) na raiz do projeto.

IMPORTANTE: O arquivo deve ser criado com a primeira letra maiúscula e o restante minúscula (Dockerfile). Se não for respeitado o nome, não funcionará.

Dockerfile

FROM java:8
VOLUME /tmp
ADD target/spring-rest-data-h2-1.0.0.jar app.jar
ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

Prompt de Comando (Terminal)

# docker build .

Aguarde todo o processo de download e instalação.

# docker images

Mostrará a imagem criada, conforme o arquivo de configuração (ex: java:8).

# docker build -t java:8 .

Identificará o REPOSITORY e TAG.

# docker run -it -p 8000:8080 java:8

Isso fará subir a imagem (java:8) sob a porta local 8000 e porta no container 8080. Perceba também que já subirá sua aplicação Spring Boot (java -jar /app.jar).

Agora, basta abrir um navegador na máquina e digitar:

http://localhost:8000

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Wed Jan 17 22:28:41 UTC 2018
There was an unexpected error (type=Not Found, status=404).
No message available
Sob a URL http://localhost:8000/user/list

[]

Aparecerá 2 colchetes, informando que o banco de usuários está vazio.
Pronto! Sua aplicação agora, está rodando sob o container Docker.
# CTRL + p + q (sairá do container, mas continuará rodando)
# docker stats [[CONTAINER_ID]] (apresentará o consumo de CPU, Memória e IO)

CONTAINER    CPU % MEM USAGE / LIMIT     MEM % NET I/O          BLOCK I/O    PIDS
bbcf887896ac 0.09% 326.9MiB /  3.659GiB  8.72% 26.4kB / 4.44kB  90.2MB / 0B  34

# docker stop bbcf887896ac (baixará o container)

# docker start

Remover todas as imagens (CUIDADO)

# docker rmi $(docker images -q)