Este blog explicará 10 antipadrões de contêineres que vi nos últimos meses:

  1. Dados ou registros em contêineres - Os contêineres são ideais para aplicativos sem estado e devem ser efêmeros. Isso significa que nenhum dado ou registro deve ser armazenado no contêiner, caso contrário, eles serão perdidos quando o contêiner for encerrado. Em vez disso, use mapeamento de volume para mantê-los fora dos contêineres. Pilha ELK pode ser usado para armazenar e processar registros. Se os volumes gerenciados forem usados durante o processo de teste inicial, remova-os usando -v com a chave docker rm comando.
  2.  Endereços IP do contêiner - Cada contêiner recebe um endereço IP. Vários contêineres se comunicam entre si para criar um aplicativo; por exemplo, um aplicativo implantado em um servidor de aplicativos precisará se comunicar com um banco de dados. Os contêineres existentes são encerrados e novos contêineres são iniciados o tempo todo. Depender do endereço IP do contêiner exigirá a atualização constante da configuração do aplicativo. Isso tornará o aplicativo frágil. Em vez disso, crie serviços. Isso fornecerá um nome lógico que pode ser referenciado independentemente do número crescente ou decrescente de contêineres. Além disso, ele também oferece um balanceamento de carga básico.
  3. Executar um único processo em um contêiner - A Dockerfile usou um CMD e PONTO DE ENTRADA. Muitas vezes, o CMD usará um script que executará alguma configuração da imagem e, em seguida, iniciará o contêiner. Não tente iniciar vários processos usando esse script. É importante seguir separação de preocupações ao criar imagens do Docker. Isso dificultará muito o gerenciamento dos contêineres, a coleta de registros e a atualização de cada processo individual. Você pode considerar dividir o aplicativo em vários contêineres e gerenciá-los de forma independente.
  4. Não use execução de docas - O execução de docas inicia um novo comando em um contêiner em execução. Isso é útil para anexar um shell usando o comando docker exec -it {cid} bash. Mas, fora isso, o contêiner já está executando o processo que deveria estar executando.
  5. Mantenha sua imagem enxuta - Crie um novo diretório e inclua o Dockerfile e outros arquivos relevantes nesse diretório. Considere também o uso de .dockerignore para remover todos os registros, código-fonte, registros etc. antes de criar a imagem. Certifique-se de remover todos os artefatos baixados depois de descompactados.
  6. Criar imagem a partir de um contêiner em execução - Uma nova imagem pode ser criada usando o commit do docker comando. Isso é útil quando são feitas alterações no contêiner. Mas as imagens criadas com esse comando não podem ser reproduzidas. Em vez disso, faça alterações no Dockerfile, encerre os contêineres existentes e inicie um novo contêiner com a imagem atualizada.
  7. Credenciais de segurança na imagem do Docker - Não armazene credenciais de segurança no Dockerfile. Elas estão em texto claro e são verificadas em um repositório. Isso as torna completamente vulneráveis. Use -e para especificar as senhas como variável de ambiente de tempo de execução. Alternativamente --env-file pode ser usado para ler variáveis de ambiente de um arquivo. Outra abordagem é usar o CMD ou PONTO DE ENTRADA para especificar um script. Esse script extrairá as credenciais de um terceiro e, em seguida, configurará seu aplicativo.
  8. mais recente etiqueta: Começando com uma imagem como couchbase é tentador. Se nenhuma tag for especificada, um contêiner será iniciado usando a imagem couchbase:latest. Essa imagem pode não ser realmente a mais recente e, em vez disso, referir-se a uma versão mais antiga. Para colocar um aplicativo em produção, é necessário um ambiente totalmente controlado com a versão exata da imagem. Leia isto Docker: a última confusão postagem do colega Docker Captain @adrianmouat. Certifique-se de usar sempre a tag ao executar um contêiner. Por exemplo, use couchbase:enterprise-4.5.1 em vez de apenas couchbase.
  9. Incompatibilidade de impedância - Não use imagens diferentes, nem mesmo tags diferentes nos ambientes de desenvolvimento, teste, preparação e produção. A imagem que é a "fonte da verdade" deve ser criada uma vez e enviada para um repositório. Essa imagem deve ser usada para diferentes ambientes daqui para frente. Em alguns casos, você pode considerar a execução dos testes de unidade no arquivo WAR como parte da compilação do maven e, em seguida, criar a imagem. Mas qualquer teste de integração do sistema deve ser feito na imagem que será enviada para a produção.
  10. Portas de publicação - Não use -P para publicar todas as portas expostas. Isso permitirá que você execute vários contêineres e publique suas portas expostas. Mas isso também significa que todas as portas serão publicadas. Em vez disso, use -p para publicar portas específicas.

Acrescentando mais com base na discussão no Twitter...

  1. Usuário raiz - Não execute contêineres como usuário root. O host e o contêiner compartilham o mesmo kernel. Se o contêiner for comprometido, um usuário root poderá causar mais danos aos hosts subjacentes. Use EXECUTAR groupadd -r couchbase && useradd -r -g couchbase couchbase para criar um grupo e um usuário nele. Use o botão USUÁRIO para mudar para esse usuário. Cada USUÁRIO cria uma nova camada na imagem. Evite alternar o usuário para frente e para trás para reduzir o número de camadas. Graças a @Aleksandar_78 por essa dica!
  2. Dependência entre contêineres - Muitas vezes, os aplicativos dependem de contêineres para serem iniciados em uma determinada ordem. Por exemplo, um contêiner de banco de dados deve estar ativo antes que um aplicativo possa se conectar a ele. O aplicativo deve ser resiliente a essas alterações, pois os contêineres podem ser encerrados ou iniciados a qualquer momento. Nesse caso, faça com que o contêiner do aplicativo espere que a conexão com o banco de dados seja bem-sucedida antes de prosseguir. Não use scripts wait-for no Dockerfile para que os contêineres sejam inicializados em uma ordem específica. Esperar por um determinado número de segundos para que um determinado contêiner seja iniciado é muito frágil. Agradecimentos a @ratnopam por essa dica!

Que outros antipadrões você segue? Docker para desenvolvedores Java é um workshop prático e individualizado que explica como começar a usar o Docker para desenvolvedores Java. Interessado em um tutorial mais aprofundado? Assista a este tutorial de duas horas do JavaOne! couchbase.com/containers mostra como executar o Couchbase em uma variedade de estruturas.

Autor

Postado por Arun Gupta, vice-presidente de defesa do desenvolvedor, Couchbase

Arun Gupta é o vice-presidente de defesa do desenvolvedor na Couchbase. Ele criou e liderou comunidades de desenvolvedores por mais de 10 anos na Sun, Oracle e Red Hat. Ele tem grande experiência na liderança de equipes multifuncionais para desenvolver e executar estratégias, planejamento e execução de conteúdo, campanhas de marketing e programas. Antes disso, liderou equipes de engenharia na Sun e é membro fundador da equipe Java EE. Gupta é autor de mais de 2.000 postagens em blogs sobre tecnologia. Ele tem uma vasta experiência em palestras em mais de 40 países sobre diversos tópicos e é um JavaOne Rock Star há três anos consecutivos. Gupta também fundou o capítulo Devoxx4Kids nos EUA e continua a promover a educação tecnológica entre as crianças. Autor de vários livros sobre tecnologia, corredor ávido, viajante do mundo inteiro, campeão de Java, líder de JUG, membro do NetBeans Dream Team e capitão do Docker, ele pode ser facilmente acessado em @arungupta.

Deixar uma resposta