Как собрать минимальный 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, который быстр и довольно прост в использовании. И еще одна интересная особенность — это функция запуска из оперативной памяти.
Действительно ли размер изображения имеет значение?
Docker — это все о минимализме, НО, когда дело доходит до JVM на Docker, официальный образ Java Docker может составить более 800 МБ. Это боль, даже если вы не чувствительны к дисковому пространству по двум основным причинам.
Чем больше размер изображения, тем больше времени требуется для:
- Построить это
- Отправьте его по сети
Когда вы имеете дело с десятками и сотнями контейнеров или постоянно отправляете обновления, это усиливает негативные последствия больших размеров изображений, так что, да, это имеет значение. В то же время базовое изображение Alpine займет всего 5 МБ.
Вот сравнение с изображением gliderlabs / alpine, которое служит источником для официального изображения docker-alpine :
По сравнению с Ubuntu, который, вероятно, является самым популярным дистрибутивом для пользователей Docker, это более чем 37-кратное улучшение, экономящее 183 МБ дискового пространства. С учетом вышесказанного, Alpine не для всех и требует некоторого изучения в зависимости от вашего конкретного случая использования и типа функций, которые вы ожидаете получить от своей ОС. Если ваша чистота и минимальность — одна из ваших самых больших проблем, то вы обязательно должны это проверить.
Начало работы с Alpine: ознакомьтесь с Alpine wiki с его практическим сравнением с другими дистрибутивами .
Супер полезно на Java
Хотя Alpine не является специфическим для сценариев использования Java, он дает огромные преимущества при использовании вместе с JVM в Docker. Официальное официальное изображение Java-докера из коробки занимает более 800 МБ, а с Alpine оно может уменьшиться до 117 МБ, если вы включаете только JRE на Java 8. Это почти в 7 раз легче! Что касается фактической установки, это зависит от того, какую версию Java вы собираетесь использовать. Поскольку Alpine использует musl libc, у нас есть 2 варианта:
- Установки OpenJDK работают из коробки с musl libc, вот пример .
- 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. Специально для случая использования контейнера. Вы могли бы даже назвать их … микроконтейнеры.
Мы надеемся, что этот пост помог вам открыть для себя что-то новое, и будем рады услышать ваши мысли об этом. Пожалуйста, не стесняйтесь использовать раздел комментариев ниже.
Ссылка: | Lean, Mean, виртуальная машина Java: сделать ваш Docker в 7 раз легче с Alpine Linux от нашего партнера по JCG Алекса Житницкого в блоге Takipi . |