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?


53

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?


34
Por que você acha que ruby ​​e php são binários? Ruby e php são tecnicamente ainda mais virtuais que Java - em Java você precisa compilar primeiro e depois executar seu programa em uma máquina virtual. Em Ruby e php, você envia o código-fonte e a máquina virtual lê a fonte diretamente.
Slebetman 17/07

12
"Mas 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." Java inventou "escreva uma vez, teste em todos os lugares".
21717 Andy

2
Java é um alvo em movimento. Ocasionalmente, são introduzidos recursos que quebram as coisas (o aperto de segurança há alguns anos atrás era um excelente exemplo) ou você encontra um bug que requer o uso de uma versão específica. É muito mais fácil controlar isso na janela de encaixe do que usar o sistema de empacotamento nativo do computador host.
Thorbjørn Ravn Andersen

11
"tornando a consistência da operação independentemente do sistema operacional subjacente" Observe que fazer com que o tempo de execução do idioma se comporte de maneira consistente não nega o fato de que você provavelmente ainda possui algumas dependências externas. Pode ser algo tão simples quanto usar um caminho de arquivo específico para seus logs.
jpmc26

Respostas:


86

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.


20
Além disso, esse tipo de coisa acontece o tempo todo em empresas maiores. Não é apenas uma coisa teórica.
Enderland 17/07

5
O que você faz quando descobre um bug no Docker?
Owen

Além disso, o Java 9 vai quebrar as coisas. Haverá algum esforço necessário.
Thorbjørn Ravn Andersen

8
@ Owen A mesma coisa que você faz quando encontra um bug em Java. Ou em {Linux, Windows}. Ou na sua CPU .
Kroltan

11
@ Trilarion: Sim, embora principalmente na forma de postagens de blog de desenvolvedores da empresa. Dito isto, qualquer um dos links "Saiba mais" em docker.com/customers fornecerá exemplos de grandes empresas que usam o docker para resolver esses problemas. Dito isto, geralmente essas empresas estavam assumindo que precisavam de uma combinação perfeita entre produção e desenvolvimento, e conseguiram isso com as VMs. Mais tarde, eles perceberam: "Ei, o Docker resolve o mesmo problema que as VMs, exceto que roda mais rápido e pode ser usado para manter as implantações consistentes".
19717 Brian

35

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)


Por que não fazer imagens?
Dmitry Kudriavtsev

Nós esperamos que. Somos uma equipe pequena tentando adicionar recursos a um sistema muito usado / importante e não temos controle suficiente sobre os servidores para determinar sua implantação. No entanto, podemos usá-lo para dev, já estamos bastante restritos a 32mb de ram - presumo que a execução de uma imagem do docker tenha alguma sobrecarga ... mas nosso plano é seguir nessa direção.
Bill K

Eu quis dizer para as estações de trabalho
Dmitry Kudriavtsev

Tempo e memória - já precisamos deixar as peças para rodar em nossas estações de trabalho de 32 GB (os servidores de 64 GB executam tudo bem). No entanto, experimentamos um pouco e podemos tentar da próxima vez que precisarmos construir uma nova estação de trabalho para desenvolvedores.
Bill K

8

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.


5

Essa é uma pergunta muito boa, mas depois de trabalhar com o Docker, eu mudaria:

Os benefícios da JVM são negados pela conteinerização (por exemplo, Docker)?

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.


"... mas há pelo menos uma outra alternativa viável que é boa para todos" Então, qual poderia ser essa outra alternativa viável?
Trilarion

@Trilarion rkt (ou foguete) . Atualmente, ele é suportado pelo Kubernetes junto com o Docker.
21417 JimmyJames
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.