Imagens - tipos do Docker. Slim vs slim-stretch vs stretch vs alpino

110

Estou procurando uma imagem docker para construir um aplicativo java e vendo as variantes das imagens OpenJDK disponíveis. Estou procurando aqui https://github.com/docker-library/openjdk/tree/master/8/jdk e veja alpine, slim e windows. Quais são as diferenças entre eles e o que cada variante oferece?

mailtobash
fonte
Possível duplicata de imagens do Docker
David Maze,
Ler as FROMlinhas dos Dockerfiles no link que você forneceu também é informativo. As imagens Alpine são muito menores do que as imagens baseadas em Debian, mas também podem encontrar problemas de compatibilidade de várias maneiras.
David Maze
1
Isso também é explicado no README da imagem (da página do Docker Hub da imagem ).
David Maze

Respostas:

106

De acordo com os documentos da biblioteca docker (citação e links abaixo), aqui está um resumo:

  • openjdk:<version>

A imagem de fato. Use-o se não tiver certeza.

  • openjdk:<version>-buster, openjdk:<version>-stretcheopenjdk:<version>-jessie

buster, jessieou stretchsão os nomes de código do conjunto para versões do Debian e indicam em qual versão a imagem é baseada.

  • openjdk:<version>-alpine

Da mesma forma, esta imagem é baseada no Alpine Linux , sendo, portanto, uma imagem de base muito pequena. É recomendado se você precisa que o tamanho da imagem seja o menor possível. A ressalva é que ele usa algumas bibliotecas incomuns, mas não deve ser um problema para a maioria dos softwares. Em caso de dúvida, verifique a documentação oficial abaixo.

  • openjdk:<version>(de 12 em diante), openjdk:<version>-oracleeopenjdk:<version>-oraclelinux7

Começando com openjdk:12a imagem padrão, bem como as variantes -oraclee -oraclelinux7, são baseadas na imagem oficial do Oracle Linux 7 . Os binários do OpenJDK na imagem padrão, bem como as variantes -oraclee -oraclelinux7, são criados pela Oracle e originados da comunidade OpenJDK .

  • openjdk:<version>-slim

Esta imagem contém apenas os pacotes mínimos necessários para executar Java (e não contém muitas das bibliotecas Java relacionadas à IU, por exemplo). A menos que você esteja trabalhando em um ambiente onde apenas a openjdkimagem será implantada e você tenha restrições de espaço, a imagem padrão é recomendada em vez desta.

  • openjdk:<version>-windowsservercore

Esta imagem é baseada no Windows Server Core ( microsoft/windowsservercore) .



Documentos completos ( versão mostrada abaixo aqui , versão mais recente aqui ):

Variantes de imagem

As openjdkimagens vêm em vários sabores, cada um projetado para um caso de uso específico.

openjdk:<version>

Esta é a imagem de fato. Se você não tem certeza de quais são suas necessidades, provavelmente deseja usar este. Ele é projetado para ser usado como um contêiner descartável (monte seu código-fonte e inicie o contêiner para iniciar seu aplicativo), bem como a base para construir outras imagens.

Algumas dessas tags podem ter nomes como jessie ou stretch. Estes são os nomes de código do pacote para versões do Debian e indicam em qual versão a imagem é baseada.

openjdk:<version>-alpine

Esta imagem é baseada na popular projeto Alpine Linux , disponível na alpineimagem oficial . O Alpine Linux é muito menor do que a maioria das imagens de base de distribuição (~ 5 MB) e, portanto, leva a imagens muito mais finas em geral.

Essa variante é altamente recomendada quando o tamanho final da imagem é o menor possível. A principal advertência a ser observada é que ele usa musl libc em vez de glibc e amigos , portanto, certos softwares podem ter problemas dependendo da profundidade de seus requisitos libc. No entanto, a maioria dos softwares não tem problemas com isso, então essa variante geralmente é uma escolha muito segura. Veja este tópico de comentários do Hacker News para mais discussões sobre os problemas que podem surgir e algumas comparações prós / contras do uso de imagens baseadas em Alpine.

Para minimizar o tamanho da imagem, é incomum que ferramentas adicionais relacionadas (como gitou bash) sejam incluídas em imagens baseadas em Alpine. Usando esta imagem como base, adicione o que você precisa em seu próprio Dockerfile (veja a alpinedescrição da imagem para exemplos de como instalar pacotes se você não estiver familiarizado).

openjdk:<version>-windowsservercore

Esta imagem é baseada no Windows Server Core ( microsoft/windowsservercore) . Como tal, só funciona em locais onde essa imagem funciona, como o Windows 10 Professional / Enterprise (Anniversary Edition) ou o Windows Server 2016.

Para obter informações sobre como fazer o Docker funcionar no Windows, consulte o guia de "Início rápido" relevante fornecido pela Microsoft:

openjdk:<version>-slim

Esta imagem instala o -headlesspacote do OpenJDK e, portanto, está faltando muitas das bibliotecas Java relacionadas à IU e alguns pacotes comuns contidos na tag padrão. Ele contém apenas os pacotes mínimos necessários para executar o Java. A menos que você esteja trabalhando em um ambiente onde apenas a openjdkimagem será implantada e você tenha restrições de espaço, é altamente recomendável usar a imagem padrão deste repositório.

acdcjunior
fonte
1

Escolha uma imagem de docker base que atenda às suas necessidades e lembre-se de que o tamanho da imagem também é um aspecto importante .

A imagem pode ser considerada um conjunto de instruções sobre como criar o container. No Docker, uma imagem pode ser herdada de (ou baseada em) outra imagem, adicionando instruções adicionais sobre as básicas. Cada imagem consiste em várias camadas, que são efetivamente imutáveis.

Por favor, leia o artigo sobre como criar o fluxo de construção perfeito do Java Docker .

O tamanho da imagem do Docker é muito importante. O tamanho tem impacto sobre:

  • latência de rede : necessidade de transferir a imagem do Docker pela web
  • armazenamento : precisa armazenar todos esses bits em algum lugar
  • disponibilidade e elasticidade do serviço : ao usar um programador Docker, como Kubernetes, Swarm, Nomad, DC / OS ou outro (o programador pode mover contêineres entre hosts)
  • segurança : você realmente, quero dizer, realmente precisa do pacote libpng com todas as suas vulnerabilidades CVE para seu aplicativo Java?
  • agilidade de desenvolvimento : pequenas imagens Docker == tempo de compilação mais rápido e implantação mais rápida


Para executar um aplicativo java, você precisa pelo menos do JRE. Por exemplo, para um projeto de primavera, sua imagem pode ser baseada em slim Alpine Linux with OpenJDK JRE:

#simple dockerFile for java app:

#here we are using Base Alpine Linux based image with OpenJDK JRE only
#For Java 8, try this
FROM openjdk:8-jre-alpine

#For Java 11, try this
#FROM adoptopenjdk/openjdk11:alpine-jre

#copy application WAR/JAR (with libraries inside)
COPY target/spring-boot-*.war/jar yourName.war/jar
# specify default command
CMD ["/usr/bin/java", "-jar", "/yourName.war/jar"]

Além disso, você pode usar docker history yourImageNamepara ver todas as camadas (e seus tamanhos) que compõem sua imagem.

Ghasem Sadeghi
fonte