Módulo 9 · 9.2
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:
- O repositório de pacotes do próprio Docker (
download.docker.com). Sempre a versão mais recente, incluindo o plug-indocker composeque utilizará na lição 9.3. É o que a documentação do Docker descreve e o que este curso utiliza. - O pacote
docker.iodo 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 sedocker 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.ascEm 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.ascEm 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 annaFaç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 /hoste 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:
| Parte | Significado |
|---|---|
-d | Executar em segundo plano (detached) |
--name proef | Um nome, para não ter de trabalhar com IDs longos |
-p 127.0.0.1:8080:80 | A porta 80 do contentor passa a ser a porta 8080 do anfitrião, apenas em loopback |
nginx:stable | A 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 removerdocker 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 prunedocker 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 odocker.ioda distribuição, nunca ambos. - O grupo docker equivale a root;
sudo dockerdeixa 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:taginicia um contentor acessível apenas localmente; verifique comss.docker ps,logs,exec,stopermsã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--volumescom moderação.
Questionário
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.
A partir do repositório da Docker, o unattended-upgrades não o atualiza por predefinição; o docker.io da distribuição, sim. O ss deve mostrar 127.0.0.1:8080, não 0.0.0.0:8080. O grupo docker dá direitos de root; com sudo docker, cada comando fica registado no registo do sudo.
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
- Documentação do Docker, Install Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
- Documentação do Docker, Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Documentação do Docker, Linux post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
- Documentação do Docker, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Documentação do Docker, Rootless mode: https://docs.docker.com/engine/security/rootless/
- Documentação do Docker, JSON File logging driver: https://docs.docker.com/engine/logging/drivers/json-file/
- VPS: do primeiro início de sessão a um servidor seguro 6.1: Instalar o Docker a partir da fonte oficial
