Introdução
Bem-vindo a este laboratório prático sobre os fundamentos de segurança de contêineres com Docker. Docker é uma plataforma poderosa para desenvolver, distribuir e executar aplicações em contêineres. Embora os contêineres forneçam isolamento de processos, a sua segurança é crucial para proteger as suas aplicações e o sistema hospedeiro.
Neste laboratório, você explorará os fundamentos de segurança de contêineres Docker. Primeiro, você verificará se o Docker está configurado corretamente no ambiente LabEx. Em seguida, você executará um contêiner básico de servidor web Nginx, inspecionará seus processos em execução e examinará seu consumo de recursos. Finalmente, você aprenderá como aplicar controles de segurança fundamentais definindo limites de recursos em um contêiner.
Ao final deste laboratório, você terá uma compreensão prática dos passos iniciais envolvidos na segurança de um ambiente Docker.
Verificar Instalação e Configuração do Docker
Nesta etapa, você verificará se o Docker já está instalado no ambiente LabEx e garantirá que você tenha as permissões adequadas para usá-lo.
A máquina virtual LabEx vem com o Docker pré-instalado. Vamos primeiro verificar a versão do Docker para confirmar que ele está disponível.
docker --version
Você deverá ver uma saída semelhante a esta, confirmando que o Docker está instalado corretamente:
Docker version 20.10.21, build 20.10.21-0ubuntu1~22.04.3
Agora vamos verificar se o daemon do Docker está em execução:
sudo systemctl status docker
Este comando mostrará o status do serviço Docker. Você deverá ver que ele está ativo e em execução.
Para executar comandos Docker sem sudo, seu usuário precisa pertencer ao grupo docker. No ambiente LabEx, seu usuário já está configurado com as permissões adequadas. Vamos verificar isso:
groups $USER
Você deverá ver docker na saída, confirmando que seu usuário tem as permissões necessárias:
labex : labex sudo docker ssl-cert
Como seu usuário já está no grupo docker, você pode executar comandos Docker diretamente sem precisar de sudo.
Vamos testar se o Docker está funcionando corretamente executando um comando simples:
docker info
Este comando exibirá informações sobre o Docker em todo o sistema, confirmando que você pode se comunicar com o daemon do Docker com sucesso.
Executar um Contêiner Básico de Servidor Web
Nesta etapa, você executará seu primeiro contêiner. Usaremos a imagem oficial nginx, que fornece um servidor web leve e de alto desempenho.
Para executar um contêiner, você usa o comando docker run. Usaremos algumas flags comuns:
-d: Executa o contêiner em modo detached (em segundo plano).-p 8080:80: Mapeia a porta 8080 no host para a porta 80 dentro do contêiner. Isso permite que você acesse o servidor Nginx através delocalhost:8080.--name webserver: Atribui um nome memorável ao seu contêiner.nginx: O nome da imagem a ser usada.
Execute o seguinte comando para iniciar o contêiner Nginx:
docker run -d -p 8080:80 --name webserver nginx
O Docker primeiro verificará se a imagem nginx está disponível localmente. Se não estiver, ele a baixará automaticamente do Docker Hub e, em seguida, iniciará o contêiner. Você pode ver que o contêiner está em execução usando o comando docker ps.
docker ps
A saída mostrará seu contêiner webserver, seu ID, a imagem na qual ele se baseia e o mapeamento de portas.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 nginx "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 0.0.0.0:8080->80/tcp webserver
Agora, vamos testar se o servidor web está funcionando. Use curl para enviar uma requisição ao servidor na porta mapeada.
curl localhost:8080
Você deverá ver o HTML da página de boas-vindas padrão do Nginx como saída, o que confirma que seu contêiner está em execução e acessível.
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html {
color-scheme: light dark;
}
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>
If you see this page, the nginx web server is successfully installed and
working. For further configuration, refer to the
<a href="http://nginx.org/">nginx.org</a> documentation.
</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
Examinar Processos e Uso de Recursos do Contêiner
Nesta etapa, você aprenderá como inspecionar os processos em execução dentro de um contêiner e monitorar seu consumo de recursos. Esta é uma habilidade fundamental para depurar e entender como sua aplicação conteinerizada se comporta.
Uma característica chave dos contêineres é o isolamento de processos. Da perspectiva do host, você pode ver o que está em execução dentro de um contêiner sem precisar usar exec para entrar nele. O comando docker top permite visualizar os processos principais de um contêiner.
Execute o seguinte comando para ver os processos dentro do seu contêiner webserver:
docker top webserver
A saída mostra o processo mestre do Nginx em execução como root e seus processos de trabalho em execução como systemd+ (um usuário do sistema para melhor segurança). Observe que existem múltiplos processos de trabalho, o que é típico para o Nginx lidar com requisições concorrentes de forma eficiente.
UID PID PPID C STIME TTY TIME CMD
root 4098 4078 0 14:34 ? 00:00:00 nginx: master process nginx -g daemon off;
systemd+ 4161 4098 0 14:34 ? 00:00:00 nginx: worker process
systemd+ 4162 4098 0 14:34 ? 00:00:00 nginx: worker process
Em seguida, vamos analisar o uso de recursos do contêiner. O comando docker stats fornece um fluxo em tempo real da CPU, memória, rede e I/O de disco de um contêiner. Para obter um snapshot estático para este laboratório, usaremos a flag --no-stream.
docker stats --no-stream webserver
Este comando exibirá uma tabela com as métricas de recursos atuais para o contêiner webserver.
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
bda2386621a1 webserver 0.00% 3.125MiB / 3.505GiB 0.09% 6.31kB / 1.27kB 0B / 12.3kB 3
A partir desta saída, você pode ver que o contêiner está usando muito pouca CPU (0,00%), cerca de 3,1 MiB de memória dos 3,5 GiB de memória do sistema disponíveis (0,09%) e tem 3 processos em execução (o mestre do Nginx e 2 processos de trabalho). Essas informações são vitais para identificar gargalos de desempenho ou possíveis vazamentos de recursos em suas aplicações.
Inspecionar Propriedades de Segurança do Contêiner, como Limites de Recursos
Nesta etapa, você explorará um dos recursos de segurança de contêineres mais básicos, porém críticos: os limites de recursos. Por padrão, um contêiner pode usar o quanto de CPU e memória do host desejar. Definir limites impede que um único contêiner consuma todos os recursos disponíveis e afete outros contêineres ou o próprio host.
Primeiro, vamos inspecionar a configuração do contêiner webserver que criamos anteriormente. O comando docker inspect fornece uma saída JSON detalhada com todas as configurações do contêiner.
docker inspect webserver
A saída é muito longa. Você pode usar a flag --format para extrair campos específicos. Vamos verificar se algum limite de memória está definido.
docker inspect --format='{{.HostConfig.Memory}}' webserver
A saída será 0, o que significa que não há limite de memória.
0
Agora, vamos criar um novo contêiner com um limite de memória. Primeiro, você precisa parar e remover o contêiner existente, pois reutilizaremos o mapeamento de porta.
docker stop webserver
docker rm webserver
Em seguida, execute um novo contêiner Nginx, mas desta vez adicione a flag --memory="100m" para limitar seu uso de memória a 100 megabytes. Também daremos a ele um novo nome.
docker run -d -p 8080:80 --name webserver-limited --memory="100m" nginx
Agora, inspecione o limite de memória deste novo contêiner.
docker inspect --format='{{.HostConfig.Memory}}' webserver-limited
Desta vez, a saída será o limite de memória em bytes (100 × 1024 × 1024).
104857600
Você aplicou com sucesso uma restrição de recursos a um contêiner, o que é um passo fundamental na segurança de contêineres e no gerenciamento de recursos.
Resumo
Neste laboratório, você adquiriu experiência prática com os aspectos fundamentais do Docker e da segurança de contêineres.
Você com sucesso:
- Verificou a instalação do Docker e configurou permissões de acesso adequadas no ambiente LabEx.
- Executou um servidor web Nginx básico como um contêiner Docker.
- Mapeou portas para acessar a aplicação conteinerizada a partir do host.
- Inspecionou os processos em execução dentro de um contêiner usando
docker top. - Monitorou o uso de recursos em tempo real com
docker stats. - Aprendeu como definir limites de recursos, como memória, em um contêiner para melhorar a estabilidade e segurança do sistema.
Essas habilidades são os blocos de construção para gerenciar e proteger aplicações mais complexas e com múltiplos contêineres em um ambiente de produção.



