Статьи

Lean, Mean, виртуальная машина Java: сделать ваш Docker в 7 раз легче с Alpine Linux

Как собрать минимальный JVM-контейнер с Docker на Alpine Linux?

Определенно произошло какое-то пробуждение. В последнее время мы все больше и больше слышим об Alpine Linux, легком дистрибутиве, популярность которого растет в основном из-за использования Docker. Один чат поддержки Takipi несколько месяцев назад пробудил у нас интерес, и с тех пор мы видим, что все больше и больше наших пользователей пробуют его в своих контейнерах. В этом посте мы сделаем краткий обзор и пошаговое описание Alpine и того, как вы можете использовать его для создания легких контейнеров Docker с Java или любым другим языком JVM.

Давайте начнем.

Так что же такое Alpine Linux?

Alpine Linux — это независимый урезанный вариант Linux, основанный на musl libc (произносится «мускул») и busybox . Помимо легкости, он также ориентирован на безопасность и использует grsec / Pax, который является улучшением безопасности ядра Linux. Простое наличие меньшего количества пакетов и утилит, которые по умолчанию добавляются в другие дистрибутивы, также повышает его безопасность.

Кроме того, Alpine использует свой собственный менеджер пакетов apk, который быстр и довольно прост в использовании. И еще одна интересная особенность — это функция запуска из оперативной памяти.

Alpine Linux на подъеме - Google Trends

Alpine Linux на подъеме — Google Trends

Действительно ли размер изображения имеет значение?

Docker — это все о минимализме, НО, когда дело доходит до JVM на Docker, официальный образ Java Docker может составить более 800 МБ. Это боль, даже если вы не чувствительны к дисковому пространству по двум основным причинам.

Чем больше размер изображения, тем больше времени требуется для:

  1. Построить это
  2. Отправьте его по сети

Когда вы имеете дело с десятками и сотнями контейнеров или постоянно отправляете обновления, это усиливает негативные последствия больших размеров изображений, так что, да, это имеет значение. В то же время базовое изображение Alpine займет всего 5 МБ.

Вот сравнение с изображением gliderlabs / alpine, которое служит источником для официального изображения docker-alpine :

Размер изображения

По сравнению с Ubuntu, который, вероятно, является самым популярным дистрибутивом для пользователей Docker, это более чем 37-кратное улучшение, экономящее 183 МБ дискового пространства. С учетом вышесказанного, Alpine не для всех и требует некоторого изучения в зависимости от вашего конкретного случая использования и типа функций, которые вы ожидаете получить от своей ОС. Если ваша чистота и минимальность — одна из ваших самых больших проблем, то вы обязательно должны это проверить.

Официальные изображения Docker в Alpine и Ubuntu: 1,1 млн. Тянет на Alpine и 39,3 млн. На Ubuntu

Официальные изображения Docker в Alpine и Ubuntu : 1,1 млн. Тянет на Alpine и 39,3 млн. На Ubuntu

Начало работы с Alpine: ознакомьтесь с Alpine wiki с его практическим сравнением с другими дистрибутивами .

Супер полезно на Java

Хотя Alpine не является специфическим для сценариев использования Java, он дает огромные преимущества при использовании вместе с JVM в Docker. Официальное официальное изображение Java-докера из коробки занимает более 800 МБ, а с Alpine оно может уменьшиться до 117 МБ, если вы включаете только JRE на Java 8. Это почти в 7 раз легче! Что касается фактической установки, это зависит от того, какую версию Java вы собираетесь использовать. Поскольку Alpine использует musl libc, у нас есть 2 варианта:

  1. Установки OpenJDK работают из коробки с musl libc, вот пример .
  2. Oracle HotSpot зависит от glibc и требует дополнительного шага.

Самые популярные файлы Docker для Oracle Java были опубликованы frolvlad (9.3K Pulls) и Anapsix (6.9K Pulls), включая различные конфигурации для минимальной установки, включая glibc. Вот один из способов добавить glibc на Alpine:

1
2
3
RUN apk --update add curl ca-certificates tar && \
    curl -Ls https://circle-artifacts.com/gh/andyshinn/alpine-pkg-glibc/6/artifacts/0/home/ubuntu/alpine-pkg-glibc/packages/x86_64/glibc-2.21-r2.apk > /tmp/glibc-2.21-r2.apk && \
    apk add --allow-untrusted /tmp/glibc-2.21-r2.apk

На заметке приятный маленький трюк — просмотр изображений докера через imagelayers.io. Вот как выглядит образ Java 8 из anapsix:

Как установить Takipi на Alpine Linux?

Впервые мы услышали о Alpine после запросов от пользователей, которые хотели отслеживать свои виртуальные машины с помощью Takipi . Чтобы запустить Takipi на Alpine, нам нужно было включить еще несколько зависимостей. Помимо glibc нам также потребуются библиотека сжатия zlib , libstdc ++ и низкоуровневая библиотека времени выполнения libgcc . Держись крепче! Прикрепленный файл Docker, который описывает все необходимые шаги с комментариями. Вы узнаете, как установить Java на Alpine с помощью glibc, добавить дополнительные зависимости, установить Takipi и отслеживать простой сервер Scala с несколькими ошибками (кстати, чтобы узнать больше о Takipi, вы можете проверить эту страницу ) :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# Takipi
FROM alpine:3.2
 
MAINTAINER Chen Harel "https://github.com/chook"
 
# Install dependencies
RUN apk --update add curl ca-certificates tar sqlite icu bash && \
    curl -Ls https://circle-artifacts.com/gh/andyshinn/alpine-pkg-glibc/6/artifacts/0/home/ubuntu/alpine-pkg-glibc/packages/x86_64/glibc-2.21-r2.apk > /tmp/glibc-2.21-r2.apk && \
    apk add --allow-untrusted /tmp/glibc-2.21-r2.apk
 
# Java version
ENV JAVA_VERSION_MAJOR 7
ENV JAVA_VERSION_MINOR 79
ENV JAVA_VERSION_BUILD 15
ENV JAVA_PACKAGE       jdk
 
# Download and unarchive Java
RUN mkdir /opt && curl -jksSLH "Cookie: oraclelicense=accept-securebackup-cookie"\
  http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz \
    | tar -xzf - -C /opt &&\
    ln -s /opt/jdk1.7.0_79 /opt/jdk &&\
    rm -rf /opt/jdk/*src.zip \
           /opt/jdk/lib/missioncontrol \
           /opt/jdk/lib/visualvm \
           /opt/jdk/lib/*javafx* \
           /opt/jdk/jre/lib/plugin.jar \
           /opt/jdk/jre/lib/ext/jfxrt.jar \
           /opt/jdk/jre/bin/javaws \
           /opt/jdk/jre/lib/javaws.jar \
           /opt/jdk/jre/lib/desktop \
           /opt/jdk/jre/plugin \
           /opt/jdk/jre/lib/deploy* \
           /opt/jdk/jre/lib/*javafx* \
           /opt/jdk/jre/lib/*jfx* \
           /opt/jdk/jre/lib/amd64/libdecora_sse.so \
           /opt/jdk/jre/lib/amd64/libprism_*.so \
           /opt/jdk/jre/lib/amd64/libfxplugins.so \
           /opt/jdk/jre/lib/amd64/libglass.so \
           /opt/jdk/jre/lib/amd64/libgstreamer-lite.so \
           /opt/jdk/jre/lib/amd64/libjavafx*.so \
           /opt/jdk/jre/lib/amd64/libjfx*.so \
    && addgroup -g 999 app && adduser -D  -G app -s /bin/false -u 999 app \
    && rm -rf /tmp/* \
    && rm -rf /var/cache/apk/* \
    && echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf
 
# Set environment
ENV JAVA_HOME /opt/jdk
ENV PATH ${PATH}:/opt/jdk/bin  
 
### Takipi Installation
 
# Takipi installer dependencies (we need xz for a future untar process)
RUN apk --update add xz
 
# Download required libraries libgcc_s.so.1, libstdc++.so.6
RUN curl -Ls https://www.archlinux.org/packages/core/x86_64/gcc-libs/download > /tmp/gcc-libs.tar.gz && \
    mkdir /usr/libgcc && tar -xvf /tmp/gcc-libs.tar.gz -C /usr/libgcc
 
# Download required libraries libz.so.1
RUN curl -Ls https://www.archlinux.org/packages/core/x86_64/zlib/download/ > /tmp/zlib.tar.gz && \
    mkdir /usr/zlib && tar -xvf /tmp/zlib.tar.gz -C /usr/zlib
 
# Register the new libraries (before starting the Takipi installation process)
RUN echo /usr/zlib/usr/lib >> /etc/ld.so.conf
RUN echo /usr/libgcc/usr/lib >> /etc/ld.so.conf
RUN /usr/glibc/usr/bin/ldconfig
 
# Starting the default run level to avoid errors while starting Takipi
RUN rc default
 
# Install Takipi
RUN curl -s /dev/null http://s3.amazonaws.com/get.takipi.com/takipi-t4c-installer | \
    bash /dev/stdin -i --sk=<SECRET_KEY>
 
# Register Takipi libraries
RUN echo /opt/takipi/lib >> /etc/ld.so.conf
RUN /usr/glibc/usr/bin/ldconfig
 
# We must add Takipi to the PATH so the agent be able to start Takipi by itself
ENV PATH ${PATH}:/opt/takipi/bin
 
### Takipi installation complete
 
# Get a Java tester app
RUN wget https://s3.amazonaws.com/app-takipi-com/chen/scala-boom.jar -O scala-boom.jar
 
# Running a Java process with Takipi
CMD java -agentlib:TakipiAgent -jar scala-boom.jar

сообщество

Чтобы углубиться в Alpine и принять участие в его разработке, вы можете проверить их IRC-каналы на FreeNode : # alpine-linux и # alpine-devel, где тусуются разработчики ядра. Вы также можете присоединиться к спискам рассылки и форумам .

Из комментариев, которые мы видим в твиттере, HN и Reddit, общее настроение очень положительное, и многие пользователи Alpine видят значительное уменьшение размера изображения без ущерба для других функций ОС. Цифры не лгут, они набирают серьезный импульс.

Последние мысли

Преимущества использования полноценного дистрибутива иногда просто не стоят того по сравнению с минимальной ОС, такой как Alpine. Специально для случая использования контейнера. Вы могли бы даже назвать их … микроконтейнеры.

Мы надеемся, что этот пост помог вам открыть для себя что-то новое, и будем рады услышать ваши мысли об этом. Пожалуйста, не стесняйтесь использовать раздел комментариев ниже.