Eu tinha um amigo que disse:
Docker é incrível. Você pode usá-lo para replicar a produção e todas as suas peculiaridades na sua máquina local. Em seguida, você pode implantar essa instância através de todos os fluxos de trabalho de teste super rápido .
Agora isso seria verdade se os desenvolvedores estivessem escrevendo Ruby, PHP ou Go - onde havia um link binário de direção para o sistema operacional.
Porém, ao usar Java - já existe uma camada virtual entre o sistema operacional e a linguagem, tornando a operação consistente, independentemente do sistema operacional subjacente.
Indiscutivelmente, nesse caso, os benefícios de executar o Docker para desenvolvedores localmente para replicar o ambiente de produção são negados . (Comparado com Ruby, PHP ou Go).
Estou aberto à discussão sobre isso e estou ansioso para ouvir um ponto de vista divergente (com evidências).
Os benefícios de desenvolvimento do uso do Docker são negados ao usar Java em comparação com outros idiomas mais próximos dos binários do Unix?
fonte
Respostas:
De modo nenhum.
Imagine que você esteja executando a versão 1.8.0 do Java na máquina de desenvolvimento e no servidor. A propósito, você está trabalhando simultaneamente em dois projetos, ambos usando Java.
Um dia, um erro é encontrado na JVM e os servidores que executam o primeiro projeto em que você está trabalhando são migrados para a 1.8.1. A propósito, os servidores que executam o segundo projeto não são afetados pelo bug e são gerenciados por uma equipe diferente de administradores de sistema, que podem não estar dispostos a atualizar para a 1.8.1.
Agora, pelo menos para um dos projetos, você está executando uma versão diferente do Java.
Isso pode não incomodá-lo muito (até que um servidor migre para 1.9, enquanto o outro mantém a versão antiga), mas isso significa que você não está mais replicando o ambiente de produção em sua máquina local, o que torna possível para pequenas empresas. erros para se infiltrar.
Se você imagina que seu sistema de arquivos, suas dependências, suas configurações de segurança, sua configuração local e sua própria versão do Linux diferem da produção, você corre o risco de escrever um código que falhará na produção. Em vez de correr esse risco, você pode usar a virtualização ou o Docker, com pouca ou nenhuma perda de produtividade.
fonte
Você raramente implanta um "Java App". Seu aplicativo java possui muitos programas de suporte diferentes. Usamos o Apache HTTPD, Apache Tomcat, ActiveMQ para envio de mensagens, um FTP Deamon, MySQL e um punhado de serviços personalizados para integrar com programas que não funcionam diretamente com Java.
Isso nem entra no software de desenvolvimento que o acompanha - eclipse, formiga, adobe flex, groovy, firefox e subversão (estou pulando alguns)
Demora entre um dia e uma semana para configurar uma nova estação de trabalho - discutimos a mudança para o Docker para simplificar esse problema. Seria incrível se pudéssemos lançar de forma confiável uma nova estação de trabalho em algumas horas.
Sem mencionar o fato de que, quando implantamos, precisamos manter mais de - 20 servidores; O Docker está começando a parecer um bom negócio!
(20 parece bastante doloroso para um aplicativo que roda apenas em um único servidor por vez ... mas multiplica esse servidor por clusters (x2), teste / preparo / produção (x3), Interno / Externo (x2) e site principal / site de backup (x2) e você chega lá rapidamente)
fonte
Essa pergunta também seria pertinente para o golang, onde você pode extrair binários vinculados estaticamente e executá-los em algum lugar, em vez de Python ou C ++, onde você normalmente tem um grande número de bibliotecas vinculadas, o que leva as pessoas a criar apenas um contêiner de docker a partir do diretório ambiente de desenvolvimento.
Há dois pontos a serem respondidos aqui:
Um: deve haver uma maneira melhor , e existe: você pode criar contêineres menores (e mais eficientes) usando apenas o ambiente de instalação, o que leva a vantagens semelhantes, como no caso Golang com ambiente versus Golang apenas - recipientes binários. No caso do Java, você pode criar um jar gordo ou um aplicativo instalável que contenha todos os jarros da biblioteca e um script de shell; no caso do Python, você pode usar o auditwheel para criar rodas independentes que são independentes do ambiente de construção (e você pode usar o C ++ com vinculação estática para quase o mesmo efeito).
Dois: para que você precisa do docker? Em Java, é possível fazer muita separação entre diferentes componentes usando carregadores de classes, mas o ponto principal é o que há em torno do aplicativo Java. Nenhum aplicativo Java é executado por si só - se não for executado no docker, normalmente precisará ser supervisionado pela supervisord ou systemd ou similares. Digite a nuvem Kubernetes, Marathon ou Docker, que usa a abstração de contêiner para virtualizar não o próprio host, mas virtualiza toda a rede de forma que você possa implantar contêineres e eles executarem em algum host aleatório.
Os microsserviços geralmente são executados em nuvens baseadas em janela de encaixe, pois permitem tratar os hosts da janela de encaixe como gado, não como animais de estimação e da mesma forma com os aplicativos com encaixe. Obviamente, essa abstração fica com vazamento assim que você monta volumes do host na janela de encaixe e precisa executar contêineres na janela de encaixe exatamente no host que possui esses volumes. Algumas pessoas se esquecem disso.
fonte
Essa é uma pergunta muito boa, mas depois de trabalhar com o Docker, eu mudaria:
Os contêineres realmente desafiam muitas das suposições que tenho sobre o desenvolvimento advindas da minha experiência. Por exemplo, se alguém codificasse um caminho para um arquivo de recurso em um aplicativo, muitos desenvolvedores experientes saberiam que isso é problemático e você deve configurá-lo. Mas se você estiver segmentando um contêiner, esse é realmente o caso? Ao criar o contêiner, você diz quais são as estruturas de diretório. Você está configurando o caminho lá. Então você deve configurá-lo duas vezes? Qual o benefício? Se você não as combinar, não funcionará tão ... SECO?
Recentemente, criei um aplicativo de protótipo com Java e Docker que assistia essencialmente aos eventos do GC e, quando a parte antiga do heap atingia uma porcentagem limite, ele se desligava. O Docker (modo de enxame) criaria um novo. Essencialmente, eliminou a necessidade de grandes ciclos de GC na JVM e deixou o docker gerenciá-los. Não funcionou tão bem quanto eu esperava (os clientes viram algum impacto do desligamento), mas foi funcional o suficiente para fazer uma demonstração ao vivo para uma multidão.
Você realmente deve apenas experimentar recipientes se estiver curioso. É realmente uma tecnologia disruptiva e você precisará lidar com ela. O Docker é um ótimo lugar para começar, mas há pelo menos uma outra alternativa viável que é boa para todos, a IMO.
fonte