Criando imagens do Docker para suporte a vários ambientes

4

Estou criando imagens docker para nossos servidores e estou procurando as melhores práticas relacionadas ao suporte a vários ambientes ao criar o (s) DOCKERFILE (s).

O objetivo principal dos servidores é executar o LAMP no topo do Centos 6, e eu quero tornar o DOCKERFILE (s) o mais genérico possível para suportar os ambientes de desenvolvimento e produção. As imagens terão muitas configurações / utils comuns e algumas diferenças.

Diferenças, por exemplo:

  • Somente produção: ferramentas de monitoramento, antivírus e diferentes configurações de LAMP
  • Desenvolvimento apenas: xdebug, utilitários de criação de perfil e diferentes configurações de LAMP

Eu pensei em usar algo como a seguinte estrutura:

  • SO base personalizado (C1)
    • Prod. SO base (C1E1)
    • Dev. SO base (C1E2)
  • Imagem da Web (httpd, apache ..) (C2)
    • Prod. ajustes (C2E1)
    • Dev. ajustes (C2E2)
  • Imagem do banco de dados (C3)
    • Prod. ajustes (C3E1)
    • Dev. ajustes (C3E2)
  • Imagem de dados (C4)
    • Prod. ajustes (C4E1)
    • Dev. ajustes (C4E2)
  • Imagem do Samba (somente dev.) (C5)

mas como você pode ver, é impossível fazê-lo com o mecanismo de herança atual, e mesmo se fosse, não é sustentável.

Não consigo encontrar uma maneira de usar as condições ENV em um DOCKERFILE (apenas com condições baseadas em Linux no comando RUN, por exemplo).

No momento, estou usando a seguinte estrutura:

  • Imagem de base (coisas comuns, como LAMP, utils ..)
    • Dev. Imagem (Utilitários específicos de desenvolvimento / configuração)
    • Prod. Imagem (Prod. Específica ...)

Existe alguma prática recomendada para o acima? Duplicação de imagens (manutenção dupla) é a única possibilidade?

    
por Rotem 16.09.2015 / 16:13

1 resposta

3

Um dos conceitos do Docker é ter o mesmo ambiente - se você tem um ambiente diferente em produção do que o dev, então você não sabe que ele realmente funcionará com total certeza quando o aplicativo é movido para produção.

Do docker.com:

Eliminate Environment Inconsistencies

By packaging up the application with its configs and dependencies together and shipping as a container, the application will always work as designed locally, on another machine, in test or production. No more worries about having to install the same configs into a different environment.

Dito isto, é claro que produção e desenvolvimento terão diferenças, mas isso deve ser principalmente em termos de configuração de aplicativo - por exemplo, a instância de desenvolvimento não envia e-mails para os clientes, mas sim para uma caixa de correio fictícia etc. / p>

Eu não acho que seria a coisa certa a fazer para ter tanta diferença entre produção e desenvolvimento quanto o que você passa no seu post.

Quanto à diferença entre o dev e a configuração de produção (como o exemplo que eu dei acima), eu pessoalmente vejo duas formas viáveis de fazê-lo.

  1. No Dev, um Dockerfile que sobrescreve certas configurações de uma base comum para produção e desenvolvimento.

  2. Seu contêiner executa algo - inicia o httpd, etc. O script que inicia o processo primeiro puxa a configuração do Git ou de qualquer repositório, com base em uma variável de ambiente (por exemplo, docker run ... -e RUNAS=PROD ... ) - isso é o que eu faço . No meu caso, rodando um container para o Tomcat, os scripts de inicialização do Tomcat simplesmente baixam a versão war file baseada em uma variável de ambiente (por exemplo, -e VERSION=current ) e extrai dos arquivos de configuração baseados em uma variável que define se é produção ou desenvolvimento. ( -e RUNAS=DEV ).

por 16.09.2015 / 17:06

Tags