Principais conclusões
- Use imagens oficiais do Docker para melhor segurança e desempenho. Construir suas próprias imagens pode resultar em configuração incorreta e levar mais tempo.
- Use versões específicas de imagens Docker para evitar comportamentos imprevisíveis e conflitos com dependências. Extraia e construa usando imagens de uma versão específica.
- Verifique as imagens do Docker em busca de vulnerabilidades de segurança usando o comando docker scan. Determine se uma imagem é segura o suficiente para seu aplicativo.
Docker é o software de conteinerização mais popular, mas nem todo mundo o utiliza de forma eficiente. Se você não seguir as práticas recomendadas do Docker, poderá deixar seus aplicativos vulneráveis a problemas de segurança ou de desempenho.
Aqui estão algumas práticas recomendadas que você pode adotar para usar os recursos do Docker com recursos. Essas medidas melhoram a segurança e garantem a criação de arquivos Docker sustentáveis.
1. Use imagens oficiais do Docker
Ao conteinerizar seu aplicativo, você deve usar uma imagem Docker. Você pode construir uma imagem com configuração personalizada ou usar imagens oficiais do Docker.
Construir suas próprias imagens requer que você mesmo lide com toda a configuração. Por exemplo, para construir uma imagem para um aplicativo node.js, você deve fazer download do node.js e de suas dependências. O processo é demorado e pode não resultar em todas as configurações corretas.
Docker recomenda que você use uma imagem node.js oficial que vem com todas as dependências corretas. As imagens Docker têm melhores medidas de segurança, são leves e testadas para vários ambientes. Você pode encontrar as imagens oficiais em Imagens oficiais do Docker página.
2. Use versões específicas da imagem Docker
Normalmente, quando você extrai uma imagem oficial, é aquela com a tag mais recente que representa a versão atualizada mais recente dessa imagem. Cada vez que você cria um contêiner a partir dessa imagem, é uma versão diferente do último contêiner.
Construir com diferentes versões de imagem do Docker pode causar um comportamento imprevisível em seu aplicativo. As versões podem entrar em conflito com outras dependências e eventualmente causar falhas no seu aplicativo.
Docker recomenda que você extraia e construa usando imagens de uma versão específica. As imagens oficiais também possuem documentação e cobrem os casos de uso mais comuns.
Por exemplo, em vez de docker pull alpino, usar docker pull alpino: 3.18.3. O Docker extrairá essa versão específica. Você pode então usá-lo em compilações sucessivas, reduzindo erros em seu aplicativo. Você pode encontrar as versões específicas das imagens na página oficial de imagens do Docker, em Tags suportadas e respectivos links Dockerfile:
3. Digitalize imagens em busca de vulnerabilidades de segurança
Como você pode determinar se uma imagem com a qual deseja construir não apresenta vulnerabilidades de segurança? Digitalizando-o. Você pode verificar imagens do Docker usando o comando docker scan. A sintaxe é a seguinte:
docker scan [IMAGE]
Você deve primeiro fazer login no docker para digitalizar uma imagem.
docker login
Em seguida, digitalize a imagem específica que deseja verificar:
docker scan ubuntu: latest
Uma ferramenta chamada Sincronizar verifica a imagem, listando quaisquer vulnerabilidades de acordo com sua gravidade. Você pode ver o tipo de vulnerabilidade e links para informações sobre ela, incluindo como corrigi-la. Você pode saber pela digitalização se a imagem é segura o suficiente para sua aplicação.
4. Use imagens Docker de tamanho pequeno
Quando você extrai uma imagem do Docker, ela vem com todos os utilitários do sistema. Isso aumenta o tamanho da imagem com ferramentas desnecessárias.
Imagens grandes do Docker ocupam espaço de armazenamento e podem retardar o tempo de execução dos contêineres. Eles também têm uma maior possibilidade de vulnerabilidades de segurança.
Você pode reduza o tamanho das imagens Docker usando imagens Alpine. As imagens Alpine são leves e vêm apenas com as ferramentas necessárias. Eles reduzem o espaço de armazenamento, fazendo com que seu aplicativo seja executado com mais rapidez e eficiência.
Você encontrará uma versão Alpine para a maioria das imagens oficiais no Docker. Aqui está um exemplo de versões Alpine para PostgreSQL:
5. Otimize o cache de camadas de imagens
Cada comando em um Dockerfile representa uma camada na imagem. As camadas possuem utilidades diferentes e executam diversas funções. Se você olhar as imagens oficiais no Docker Hub, verá as instruções usadas para criá-las.
O Dockerfile inclui tudo que você precisa para criar a imagem. É uma das razões pelas quais muitos desenvolvedores preferem Docker a máquinas virtuais.
Aqui está a estrutura de um exemplo de imagem Alpine:
Ao construir seu aplicativo com base em uma imagem, você adiciona mais camadas à imagem. O Docker executa instruções em um Dockerfile de cima para baixo e, se uma camada for alterada, o Docker precisará reconstruir as camadas subsequentes.
A prática recomendada é organizar seu Dockerfile dos arquivos que menos mudam até aqueles que mudam com mais frequência. As instruções que não mudam, como a instalação, podem estar no topo do arquivo.
Quando você altera um arquivo, o Docker cria a partir dos arquivos alterados e armazena em cache os arquivos inalterados acima dele. Portanto, o processo é executado mais rapidamente.
Veja o exemplo ilustrado na imagem acima. Se houver uma alteração nos arquivos do aplicativo, o Docker compilará a partir daí; não é necessário instalar pacotes npm novamente.
Se você construir a partir da imagem, o processo será executado mais rápido do que reconstruir todas as outras camadas novamente. O cache também acelera a extração e envio de imagens do Docker Hub.
7. Use um arquivo .dockerignore
Ao construir uma imagem usando um Dockerfile, você pode querer manter certas informações privadas. Alguns arquivos e pastas podem fazer parte do projeto, mas você não deseja incluí-los no processo de construção.
Usar um arquivo .dockerignore reduz consideravelmente o tamanho da imagem. Isso ocorre porque o processo de construção inclui apenas os arquivos necessários. Também ajuda a manter os arquivos privados e a evitar a exposição de chaves ou senhas secretas.
O arquivo .dockerignore é um arquivo que você cria na mesma pasta do seu Dockerfile. É um arquivo de texto, muito parecido um arquivo .gitignore, que contém os nomes de todos os arquivos que você não deseja incluir no processo de compilação.
Aqui está um exemplo:
8. Use o princípio do usuário menos privilegiado
Por padrão, o Docker usa o usuário root como administrador para obter permissão para executar comandos, mas isso é uma prática recomendada. Se houver uma vulnerabilidade em um dos contêineres, os hackers poderão acessar o host Docker.
Para evitar esse cenário, crie um usuário e um grupo dedicados. Você pode definir as permissões necessárias para o grupo proteger informações confidenciais. Se um usuário for comprometido, você poderá excluí-lo sem expor todo o projeto.
Aqui está um exemplo que mostra como criar um usuário e definir suas permissões:
Algumas imagens base possuem pseudousuários criados nelas. Você pode usar os usuários instalados em vez das permissões do usuário root.
Por que você deve adotar as melhores práticas do Docker
As práticas recomendadas são uma ótima maneira de reduzir vulnerabilidades e escrever um código mais limpo. Existem muitas práticas recomendadas que você pode aplicar a cada recurso do Docker usado.
Um projeto bem organizado facilita a sincronização com outras ferramentas de orquestração, como o Kubernetes. Você pode começar com os descritos no artigo e adotar mais à medida que aprende o Docker.