Ir diretamente para o conteúdo

Definições de cookies

Escolha que tipos de cookies permite. Pode alterar a sua escolha a qualquer momento em Definições de cookies, no fundo de cada página. Política de privacidade

Necessários

Sempre ativos

Necessários para iniciar sessão, manter o seu carrinho e memorizar as suas escolhas. Estão sempre ativos.

Que cookies?
  • weboke_sessie, weboke_klant, weboke_remember: a sua sessão e manter a sessão iniciada
  • weboke_basket: o seu carrinho
  • wkBtwIncl: mostrar preços com ou sem IVA
  • wok_cookies: a sua escolha de cookies, 12 meses

Mede que anúncio leva a uma visita ou encomenda, para não pagarmos por anúncios que não dão resultado.

Que cookies?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), até 90 dias
  • OpenAI Ads, anúncios no ChatGPT
  • wok_aff: através de que parceiro chegou até nós (programa de afiliados), 60 dias

4,6

País e idioma

Cada país tem o seu próprio site, com os preços e o IVA desse país.

Ver

Instalar o Docker e o seu primeiro contentor

Módulo 9: Docker e docker compose · Tempo de leitura: 11 minutos

Objetivo de aprendizagem: No final desta lição, saberá instalar o Docker Engine a partir do repositório oficial de pacotes e iniciar, consultar, inspecionar por dentro e limpar contentores. Saberá também porque é que o grupo docker equivale a root.

Conceitos-chave: Docker Engine, Docker Desktop, repositório apt oficial, docker.io do Debian, grupo docker, rootless mode, docker run, -d, -p, -v, --name, docker ps, docker logs, docker exec, docker stop, docker rm, docker image prune, docker system df

Qual Docker?

Num servidor, instala o Docker Engine: o serviço em segundo plano (dockerd) e o comando docker. O Docker Desktop é outra coisa: um programa com janelas para Windows, macOS e ambientes de trabalho Linux. Não tem lugar num servidor.

Existem duas fontes fiáveis para o Docker Engine:

  1. O repositório de pacotes do próprio Docker (download.docker.com). Sempre a versão mais recente, incluindo o plug-in docker compose que utilizará na lição 9.3. É o que a documentação do Docker descreve e o que este curso utiliza.
  2. O pacote docker.io do Debian ou do Ubuntu. Mais antigo, mas atualizado pela distribuição através das suas atualizações de segurança habituais (lição 4.2). É uma boa opção se preferir não ter nada de fora da distribuição; nesse caso, verifique se docker compose (com um espaço) está disponível.

Escolha apenas uma. Misturar as duas instalações provoca conflitos; por isso, a documentação do Docker indica que deve remover primeiro pacotes não oficiais como docker.io, docker-compose e podman-docker.

Instalar a partir do repositório do Docker

Estes são os passos da documentação do Docker para Debian, com a chave guardada à parte e um Signed-By próprio (lição 4.1). Se lhe der mais tranquilidade, crie primeiro um snapshot.

anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install ca-certificates curl
anna@web1:~$ sudo install -m 0755 -d /etc/apt/keyrings
anna@web1:~$ sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
anna@web1:~$ sudo chmod a+r /etc/apt/keyrings/docker.asc

Em seguida, o ficheiro de repositório /etc/apt/sources.list.d/docker.sources (formato deb822):

Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.asc

Em Suites coloca o nome de código da sua versão (cat /etc/os-release, lição 4.3) e em Architectures o resultado de dpkg --print-architecture. No Ubuntu, o URL é https://download.docker.com/linux/ubuntu e a suite é, por exemplo, noble.

Depois, instale:

anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
anna@web1:~$ sudo docker run hello-world
...
Hello from Docker!
This message shows that your installation appears to be working correctly.

No Debian e no Ubuntu, o Docker arranca automaticamente após a instalação e também após cada reinício (systemctl status docker, lição 6.1).

Atenção: o unattended-upgrades (lição 4.2) não atualiza automaticamente, por predefinição, os pacotes deste repositório. Inclua sudo apt update && sudo apt upgrade para o Docker no seu ritmo de manutenção (lição 10.4), ou adicione o repositório de forma consciente às suas atualizações automáticas.

O grupo docker é root

Em toda a internet se lê que deve adicionar-se ao grupo docker, para deixar de ter de escrever sudo:

anna@web1:~$ sudo usermod -aG docker anna

Faça-o apenas se compreender o que isso significa. A documentação do Docker é clara: o grupo docker concede privilégios equivalentes aos de root. Quem pode controlar o serviço Docker pode iniciar um contentor com todo o disco do anfitrião montado no seu interior:

docker run -it -v /:/host debian chroot /host

e passa assim a ser root no seu servidor, sem palavra-passe e sem registo no log do sudo. A documentação do Docker resume-o assim: apenas utilizadores de confiança devem poder controlar o serviço Docker.

Num servidor que só o próprio administra, é uma escolha: comodidade em troca de mais um caminho para root. É mais seguro continuar simplesmente a escrever sudo docker ...; assim, cada comando fica registado no log do sudo (lição 3.2). Em todo o caso, nunca adicione ao grupo um utilizador que não deva ser root, como um utilizador de serviço de um site.

Rootless mode

O Docker também pode funcionar sem root: o serviço e os contentores são então executados por um utilizador comum, com um user namespace próprio. Instala-o como esse utilizador com dockerd-rootless-setuptool.sh install (do pacote docker-ce-rootless-extras; é necessário instalar antes o pacote uidmap). Uma falha de segurança num contentor deixa assim de dar acesso root ao anfitrião. Há limitações e a configuração é mais trabalhosa; neste curso utilizamos a instalação normal e mantemo-la segura com as regras deste módulo.

Um primeiro contentor a sério

Vamos iniciar um servidor web nginx num contentor, acessível apenas a partir do próprio servidor:

anna@web1:~$ sudo docker run -d --name proef -p 127.0.0.1:8080:80 nginx:stable
Unable to find image 'nginx:stable' locally
stable: Pulling from library/nginx
...
3f1c9e0d7a2b...

Os componentes:

ParteSignificado
-dExecutar em segundo plano (detached)
--name proefUm nome, para não ter de trabalhar com IDs longos
-p 127.0.0.1:8080:80A porta 80 do contentor passa a ser a porta 8080 do anfitrião, apenas em loopback
nginx:stableA imagem oficial do nginx, tag stable

Verificar:

anna@web1:~$ sudo docker ps
CONTAINER ID   IMAGE          COMMAND                  STATUS         PORTS                    NAMES
3f1c9e0d7a2b   nginx:stable   "/docker-entrypoint.…"   Up 5 seconds   127.0.0.1:8080->80/tcp   proef
anna@web1:~$ curl -I http://127.0.0.1:8080
HTTP/1.1 200 OK
Server: nginx/1.28.0
anna@web1:~$ sudo ss -tlnp | grep 8080
LISTEN 0 4096 127.0.0.1:8080 0.0.0.0:* users:(("docker-proxy",pid=2211,fd=7))

ss (lição 5.1) confirma: apenas em 127.0.0.1. Se tivesse escrito -p 8080:80, veria 0.0.0.0:8080 e [::]:8080, e o seu contentor estaria acessível a partir da internet, mesmo que o ufw não permita a porta 8080 (lição 9.3). A versão no cabeçalho Server pode ser diferente no seu caso.

Observar e intervir

anna@web1:~$ sudo docker logs proef            # o que o programa escreveu (stdout e stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef   # as últimas 20 linhas e continuar a acompanhar
anna@web1:~$ sudo docker exec -it proef sh     # uma shell no contentor em execução
# cat /etc/os-release
# exit
anna@web1:~$ sudo docker stop proef
anna@web1:~$ sudo docker start proef
anna@web1:~$ sudo docker rm -f proef           # parar e remover

docker logs é o primeiro sítio onde deve olhar quando um contentor não se comporta como espera, tal como journalctl para os serviços comuns (lição 6.2). Com docker exec pode espreitar lá dentro, mas é preferível não alterar nada: as alterações no contentor desaparecem na atualização seguinte (lição 9.1).

Limpar

As imagens e os contentores parados permanecem até os remover. Num VPS com um disco pequeno, isso acumula-se sem dar por isso.

anna@web1:~$ sudo docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          7         3         1.9GB     1.2GB (63%)
Containers      3         3         12MB      0B (0%)
Local Volumes   2         2         180MB     0B (0%)
Build Cache     0         0         0B        0B
anna@web1:~$ sudo docker image prune

docker image prune remove as imagens sem nome que já não pertencem a nada; com -a, remove também todas as imagens que não são usadas por nenhum contentor. Tenha cuidado com docker system prune --volumes: remove também os volumes anónimos (sem nome) que, nesse momento, não pertencem a nenhum contentor, e docker volume prune -a remove até volumes com nome. É neles que podem estar os seus dados. Por isso, dê sempre um nome aos volumes ou utilize um bind mount (lição 9.1), e verifique primeiro com docker volume ls.

Os registos dos contentores também podem crescer. Por predefinição, o Docker guarda-os em ficheiros JSON sem limite de tamanho. Define um limite em /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "10m", "max-file": "3" }
}

Depois, sudo systemctl restart docker; a definição aplica-se apenas a contentores criados de novo, pelo que os contentores existentes têm de ser recriados.

Na prática

O Docker funciona num VPS da WebOké da mesma forma que em qualquer outro fornecedor: é software dentro do seu próprio servidor, que instala e atualiza por sua conta. Num VPS pequeno, verifique regularmente o espaço em disco com docker system df e df -h (lição 1.4).

Resumo

  • Instale o Docker Engine a partir do repositório do Docker (com chave própria e Signed-By) ou o docker.io da distribuição, nunca ambos.
  • O grupo docker equivale a root; sudo docker deixa um rasto no log do sudo. O rootless mode é uma alternativa mais segura, mas mais limitada.
  • docker run -d --name ... -p 127.0.0.1:host:container image:tag inicia um contentor acessível apenas localmente; verifique com ss.
  • docker ps, logs, exec, stop e rm são as suas ferramentas do dia a dia.
  • Limpe as imagens com docker image prune, limite os registos dos contentores (ilimitados por predefinição) e use --volumes com moderação.

Questionário

1. Porque é que pertencer ao grupo docker dá, na prática, privilégios de root?



2. Depois de docker run -d -p 8080:80 nginx, o comando ss -tlnp mostra a linha 0.0.0.0:8080. O que deveria ter escrito para publicar a porta apenas localmente?



3. Um contentor arranca, mas o site que contém não funciona. O que verifica em primeiro lugar?



4. Porque escolhe uma única fonte para o Docker em vez de instalar docker.io e docker-ce em simultâneo?



5. O que faz docker system prune --volumes que é importante saber?



Exercício

Exercício O9.2: O seu primeiro contentor. Instale o Docker Engine no seu servidor seguindo esta lição (ou numa máquina de teste). Inicie um contentor nginx que escute apenas em 127.0.0.1:8080, verifique com docker ps, curl -I e ss -tlnp, consulte os registos e, por fim, remova-o. Responda às perguntas: a partir de que fonte instalou o Docker, o que mostrou ss para a porta 8080 e adicionou-se ao grupo docker (porquê ou porque não)?

Exercício O9.2: O seu primeiro contentor

Este exercício faz você mesmo; ninguém o verifica. Assinale o que já fez e marque o exercício como concluído.




As suas marcações e notas ficam apenas neste navegador; não as enviamos para lado nenhum. Se tiver sessão iniciada, guardamos em Os meus cursos apenas que concluiu o exercício.

Para saber mais

Um momento…

Configurar os seus domínios

Para cada domínio, defina os servidores de nomes, a ligação ao seu alojamento e quem fica como titular.

A carregar os seus domínios…