Java for Beginner
743 subscribers
709 photos
200 videos
12 files
1.15K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
🗓 История IT сегодня — 23 августа


ℹ️ Кто родился в этот день

Константи́н Серге́евич Новосёлов (англ. Konstantin Sergeevich Novoselov; род. 23 августа 1974, Нижний Тагил, СССР) российский и британский физик. Лауреат Нобелевской премии по физике 2010 года (совместно с Андреем Геймом), член Лондонского королевского общества (2011), иностранный член Национальной академии наук США (2019).

Георгий Павлович Лопато (23 августа 1924 — 13 февраля 2003) — советский инженер-компьютерщик, один из создателей серии ЭВМ «Минск».

Сигаев, Фёдор Геннадьевич (23 августа 1973 г.) — российский программист, сооснователь и технический директор компании Постгресс Профессиональный (Postgres Pro), ведущий разработчик (Major Contributor) и коммитер СУБД PostgreSQL, один из крупнейших мировых экспертов по этой СУБД.

Эдгар Франк «Тед» Кодд (англ. Edgar Frank Codd; 23 августа 1923 — 18 апреля 2003)британский учёный, работы которого заложили основы теории реляционных баз данных. Работая в компании IBM, он создал реляционную модель данных. Он также внёс существенный вклад в другие области информатики.


🌐 Знаковые события

1955 — первый полёт первого конвертоплана с поворотным ротором — «Белл XV-3».

1966 — аппарат Lunar Orbiter 1 сделал первую в истории фотографию Земли с Луны. Эталонное событие в истории ДЗЗ и лунной разведки площадок для «Сервеера» и «Аполлона».

1991 Всемирная паутина стала общедоступной: британский ученый Тим Бернерс-Ли открыл доступ к первому в мире веб-серверу, расположенному в ЦЕРН, что ознаменовало начало доступности Всемирной паутины (World Wide Web) для широкой публики.

2023Chandrayaan-3 совершил посадку у южного полюса Луны — первая успешная посадка Индии и первая близ южнополярной области.


#Biography #Birth_Date #Events #23Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Предлагаем темы для разбора и публикации! 📖

В комментариях к данному посту предлагайте вопросы, которые вы хотели бы увидеть максимально подробно разобранными в постах, а если будет интересно то и на видео.

Голосование будет проводиться всю неделю, а статья или видео - выходить по выходным.

Примерные правила:
🟢 темы, не выше уровня middle, чтоб был интерес общим.
🟢Один человек - одна тема.
🟢Тема должна быть отдельным теоретически-практическим вопросом. Готовый проект - это не тема!

Жду Ваших предложений! 👏
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Выбираем темы для рассмотрения в следующие выходные! 🤨
Anonymous Poll
30%
AOP
37%
NoSQL BD, вводная информация
30%
REST рекомендации
3%
Phaser
👍4
Forwarded from ChatRoom (Java for Beginner) (Первожрец Java)
«МТС Линк»;
«Контур Толк»;
SaluteJazz;
VK Звонки;
Saby Meet;
CallBridge;
FreeConference;
Jisti Meet.

вот аналоги для встреч, кто что советует?
🗓 История IT-технологий сегодня — 24 августа


ℹ️ Кто родился в этот день

Ви́ктор Миха́йлович Глушко́в (24 августа 1923, Ростов-на-Дону, РСФСР, СССР — 30 января 1982, Москва, СССР)советский математик, кибернетик. Основоположник советской кибернетики; проекты ОГАС и теоретические основы ИТ. Автор трудов по алгебре, кибернетике и вычислительной технике. Под его руководством в 1966 году была разработана первая в СССР персональная ЭВМ «МИР-1».

Хидэо Кодзима (яп. 小島 秀夫 Кодзима Хидэо, род. 24 августа 1963, Токио) — японский геймдизайнер, геймдиректор, режиссёр, сценарист, продюсер и актёр.

Майкл Артур Сайман (родился 24 августа 1996 года) — перуано - боливийско-американский предприниматель в области мобильных приложений, инженер-программист, политический активист и писатель. Он наиболее известен созданием популярных приложений в подростковом возрасте.

🌐 Знаковые события

1995 — Windows 95 поступила в розницу (GA). Запуск, введший «Пуск»/Taskbar и массовое «Plug and Play», стал поворотным для пользовательских ОС.


#Biography #Birth_Date #Events #24Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Предлагаю сегодня собраться! Пообсуждать наболевшее и просто интересное.

Время встречи в 16:00 МСК!😎
Anonymous Poll
44%
Я приду! 👋
44%
Я хотел бы, но не смогу 🤷‍♀️
13%
Не интересно 👎
👍2
Программист — это не тот, кто знает все.
А тот, кто не боится не знать всего.


Вот скажи, ты реально думаешь, что программисты — это ходячие энциклопедии?
Что в голове у седого синьора-джависта сидят все библиотеки, алгоритмы и спецификации?

Если кто-то говорит что это так, не верь. Это вранье.

Вот несколько лет назад, я вообще не знал о существовании Java. Я видел только установщик JVM и java-игры на древнем телефоне. Ничего не слышал о SOLID и ACID, Spring даже на английском встречал редко.
А теперь я программист. И каждый день узнаю что-то новое о Java (по крайней мере стараюсь).

Почему так получилось? И почему 40-летний дяденька, смог успешно поменять свою жизнь?

Потому, что я признал, что не знаю ВСЕГО.

Но могу попытаться.


Что не смотря на накопленный опыт и знания, мне есть еще чему поучиться.

Чем собственно ежедневно я и занимаю
сь. ☺️



Культ незнания

Вот запускаешь ты код.
Видишь ошибку и стек-трейс на 200 строк.
И мозг кричит: Твою мать WTF?! Я не понимаю, что это такое!


И тут ты можешь решить для себя, кто ты.

🙅‍♂️ Либо ты впадешь в панику и начнешь сомневаться в себе, в своем выборе и вернешься к тому месту, где удобнее и привычнее.
🆗 Либо ты спокойно говоришь себе: Да, я не знаю. Но я разберусь.

На самом деле это происходит ежедневно даже с топовыми программистами. Всегда находится новая ошибка, новая логика, новое приложение которое им не знакомо и не понятно.

Но топовый программист тем и отличается от новичка, что он точно знает как и когда он разберется в этом.

Нужно просто понять и принять то, что КАЖДЫЙ день, ты БУДЕШЬ встречать что-то новое и разбираться в этом.
Нужно просто понять и принять то, что КАЖДЫЙ день, ты ОБЯЗАН искать что-то новое и разбираться в этом.


И это бесконечный процесс пока ты программист.


Почему это важно

Технологии меняются быстрее, чем ты успеваешь их выучить.
Сегодня ты крутой джавист, завтра твоя компания мигрирует на Kotlin или Go.
Через 5 лет твой стек устареет, и если ты привык знать всё, ты сгоришь.

Настоящая сила — не в том, чтобы знать всё.
Настоящая сила — не бояться не знать и быстро учиться.


Иначе завтра, тебя задвинут как старую печатную машинку на антресоль (вроде бы и нахер не нужен, но вдруг пригодится), если вообще не выкинут на свалку.


Как приручить хаос незнания

🟡Признай его. Не пытайся выглядеть всезнайкой. Скажи - я не знаю, но разберусь. Это нормальная фраза для профессионала.

🟡Задавай вопросы. Коллегам, гуглу, сообществам, LLM. Ты не глупый, если спрашиваешь. Ты глуп, если молчишь и деградируешь или не развиваешься.

🟡Учись учиться. Не накапливай статические знания, а тренируй мышцу поиска и анализа.

🟡Не прячься за комфортным. Вечно ковыряться в том, что ты знаешь — это не рост, это болото.


И вот парадокс: именно постоянное напоминание, что я чего-то не знаю, даёт мне такое чувство свободы и силы. Ежедневный поиск и изучение, напоминает, что я уже на шаг впереди тех, кто что-то выучил на отлично и довольствуется этим.

Я не обязан знать всё.

Я ОБЯЗАН не бояться не знать.



Понравилась статья - поделись с другом, позови его на канал и будет тебе моя благодарность 🤝

😎

#motivation
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥31
Всем привет!

Жду Вас в Яндекс.Телемост!

Заходите поболтаем о IT и около него.
Интересно Ваше мнение о происходящем на рынке и в целом!


Ссылку Вам выдаст бот, не стесняйтесь писать ему) ->

@JFB_admin_bot
👍3
Всем спасибо кто заходил! Хорошо поболтали 🙂

Бот пошел баиньки, можете ему не писать)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
🗓 История IT-технологий сегодня — 25 августа


ℹ️ Кто родился в этот день

Чен Шиджун (кит. трад. 陳士駿, пиньинь Chén Shìjùn), впоследствии известный как Стивен «Стив» Ши Чен (англ. Steven «Steve» Shih Chen; род. 18 августа 1978 года) — со-основатель YouTube, отвечал за раннюю архитектуру и масштабирование сервиса.

Майк Кон (англ. Mike Cohn; род. 25 августа 1962, Анахайм, Калифорния) — американский эксперт в области разработки программного обеспечения, известный своим вкладом в развитие гибких методологий, в частности Scrum и Agile. Является одним из основателей и лидеров Scrum Alliance, одной из ведущих организаций, продвигающих Scrum как метод управления проектами.

Роберт Джексон Маркс II (родился 25 августа 1950 года) американский инженер-электрик , учёный в области вычислительной техники и выдающийся профессор Университета Бэйлора . Среди его вкладов — распределение времени и частоты Чжао-Атласа-Маркса (ZAM) в области обработки сигналов, теорема Чынга-Маркса в теории выборок Шеннона и подход Папулиса-Маркса-Чынга (PMC) в многомерной выборке . Он сыграл важную роль в определении области вычислительного интеллекта и был соредактором первой книги, в названии которой был использован термин «вычислительный интеллект» .

Зенон Уолтер Пилишин FRSC ( / ˈ z ɛ n ən p ə ˈ l ɪ ʃ ən / ; 25 августа 1937 — 6 декабря 2022) — когнитивная наука и ИИ, работы по зрению и символической архитектуре разума.


🌐 Знаковые события

1609 — Галилео Галилей демонстрирует Большому совету и дожу Венеции новое устройство — телескоп.

1981Voyager 2: ближайшее сближение с Сатурном (первая детальная съёмка колец, триггер к будущей миссии Cassini-Huygens).

1989Voyager 2: исторический пролёт Нептуна (первые крупные планы планеты/Тритона, фиксирование штормов и тонких колец).

1991 — Линус Торвальдс опубликовал в comp.os.minix знаменитое сообщение: «маленький хобби-проект», который стал Linux. Дата письма — 25.08.1991 20:57:08 GMT (архив CMU).


#Biography #Birth_Date #Events #25Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Основы ООП в Java

Глава 2. Инкапсуляция

Геттеры и сеттеры. Инкапсуляция как интерфейс класса

Геттеры и сеттеры — это специальные методы, которые предоставляют контролируемый доступ к приватным полям класса. Они являются инструментом для реализации инкапсуляции на практике.

Геттеры (Getters): Методы для чтения значения поля. Они возвращают значение и обычно называются getFieldName() (например, getName()).
Сеттеры (Setters): Методы для записи значения в поле. Они принимают параметр и обычно называются setFieldName() (например, setName(String name)). В сеттерах можно добавить проверки для обеспечения валидности данных.

Это позволяет скрыть поля (private), но дать внешнему коду возможность работать с ними безопасно.

Пример класса с геттерами и сеттерами:
public class Person {
private String name; // Скрытое поле
private int age; // Скрытое поле

// Геттер для name
public String getName() {
return name;
}

// Сеттер для name
public void setName(String name) {
if (name != null && !name.isEmpty()) {
this.name = name;
} else {
System.out.println("Имя не может быть пустым!");
}
}

// Геттер для age
public int getAge() {
return age;
}

// Сеттер для age с проверкой
public void setAge(int age) {
if (age > 0 && age < 150) {
this.age = age;
} else {
System.out.println("Некорректный возраст!");
}
}
}

Здесь поля private, так что внешний код не может напрямую сказать person.name = "Invalid";.
Сеттеры добавляют логику: проверка на пустоту или диапазон, что сохраняет целостность объекта.



Инкапсуляция как интерфейс класса

Инкапсуляция превращает класс в "капсулу" с четким интерфейсом — набором публичных методов (включая геттеры и сеттеры), которые определяют, как внешний код может взаимодействовать с объектом. Интерфейс класса — это как API: он показывает, что можно делать, но скрывает как.

Интерфейс через геттеры/сеттеры: Внешний код видит только методы, такие как getAge() или setName(), а не внутренние данные. Это делает класс "черным ящиком": вы можете изменить реализацию (например, хранить возраст в днях), но интерфейс остается тем же, и внешний код не сломается.

Преимущества как интерфейса:
Гибкость: Изменения внутри класса не влияют на пользователей.
Контроль: Сеттеры позволяют валидировать входные данные, геттеры — форматировать выход (например, вернуть возраст как строку).
Безопасность: Скрытие предотвращает прямой доступ к чувствительным данным.


Пример использования:
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.setName("Алексей"); // Через сеттер
person.setAge(35); // Через сеттер с проверкой

System.out.println("Имя: " + person.getName()); // Имя: Алексей
System.out.println("Возраст: " + person.getAge()); // Возраст: 35

person.setAge(-5); // Вывод: Некорректный возраст! (поле не изменится)
}
}

Внешний код работает только через интерфейс, что обеспечивает инкапсуляцию.



Как создать это в IntelliJ IDEA

Генерация геттеров/сеттеров:

В классе Person выделите поля.
Правой кнопкой → Generate → Getter and Setter.
Выберите поля и сгенерируйте методы — IntelliJ добавит их автоматически.


Тестируйте:

Создайте Main, добавьте код и запустите.


Полезные советы для новичков

Конвенции имен: Всегда используйте get/set + имя поля с большой буквы (CamelCase).
Добавляйте логику: В сеттерах проверяйте вход (if-else), в геттерах — форматируйте (например, добавить единицы измерения).
Избегайте публичных полей: Даже если кажется проще — это нарушает инкапсуляцию.
Автоматизация: В IDE генерируйте геттеры/сеттеры, чтобы сэкономить время.
Ресурсы: Почитайте о "JavaBeans" — стандарте, где геттеры/сеттеры играют ключевую роль.



#Java #для_новичков #beginner #incapsulation #setter #getter
👍4
Есть желание создать отдельный чат для АКТИВНЫХ пользователей (так сказать "только для своих").
Интересно?
Anonymous Poll
44%
Да! Я с радостью присоединюсь! 🙂
52%
Интересно, но не понятно чем лучше текущего чата? 🚽
4%
Не интересно. Я здесь не чтобы общаться. 🤓
👍1
Что выведет код?

public class Task250825 {
private int value = 0;

public int getValue() {
return value++;
}

public void setValue(int value) {
this.value = value;
}

public static void main(String[] args) {
Task250825 obj = new Task250825();
obj.setValue(5);
System.out.println(obj.getValue() + " " + obj.getValue());
}
}


#Tasks
👍2
Варианты ответа:
Anonymous Quiz
13%
"6 7"
30%
"6 6"
37%
"5 6"
20%
"5 5"
👍2
Карточка для запоминания class 😎

#memory_card
👍4
Что такое bytecode verification в JVM? 🤓

Ответ:
Bytecode verification
это процесс, выполняемый JVM перед выполнением кода, чтобы проверить байт-код на безопасность и соответствие спецификациям (например, отсутствие недопустимых операций).

Это предотвращает ошибки, такие как доступ к неинициализированным переменным или неправильные типы. Происходит в фазе загрузки классов. Если верификация не проходит, выбрасывается VerifyError. Это часть модели безопасности Java, обеспечивающая, что вредоносный код не сможет навредить системе.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7😱1
🗓 История IT-технологий сегодня — 26 августа


ℹ️ Кто родился в этот день

Леони́д Никола́евич Пресну́хин (26 августа 1918 года, деревня Харлово, Тверская губерния — 27 июня 2007 года, Зеленоград)организатор отечественной микроэлектроники, первый ректор МИЭТ; внёс вклад в создание элементной базы для вычислительной техники в СССР.

Карен Спарк Джонс (член британской академии; 26 августа 1935 — 4 апреля 2007)пионер информационного поиска, автор идеи IDF/взвешивания терминов, лежащих в основе поисковиков.

Ричард Эрнест Бе́ллман (англ. Richard Ernest Bellman; 26 августа 1920, Нью-Йорк, США — 19 марта 1984, Лос-Анджелес, США) создатель динамического программирования; его идеи легли в основу оптимизации и обучения с подкреплением.

Кэ́трин Ко́улман Гобл Джо́нсон (при рождении — Крео́ла Кэтрин Коулман, в первом замужестве — Кэтрин Коулман Гобл) (англ. Katherine Coleman Goble Johnson; 26 августа 1918, Уайт-Салфер-Спрингс, Западная Виргиния, США — 24 февраля 2020, Ньюпорт-Ньюс, Виргиния, США) — «человеческий компьютер» NASA, чьи расчёты траекторий стали критичны для ранних космических миссий.

Ли де Фо́рест (англ. Lee De Forest; 26 августа 1873, Каунсил-Блафс, штат Айова — 30 июня 1961, Голливуд, штат Калифорния, США)американский изобретатель, имеющий на своём счету 300 патентов на изобретения. Де Форест изобрёл триод — электронную лампу, которая принимает на входе относительно слабый электрический сигнал и затем усиливает его. Де Форест является одним из отцов «века электроники», потому что триод помог открыть дорогу широкому использованию электроники.


🌐 Знаковые события

1858отправлена первая новость телеграфом.

1984«Miss Manners Addresses Computer Correspondence» — Комментатор Miss Manners публикует колонку о вежливом поведении в электронной переписке (часть культурного осмысления новой эры e-mail)


#Biography #Birth_Date #Events #26Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Docker

Контейнеры, образы и сборка


Что такое контейнер и как он работает

Контейнер — это легковесный способ упаковки и запуска приложения вместе с его зависимостями в изолированной среде. Представьте контейнер как отдельную "комнату" в операционной системе, где ваше приложение живет само по себе, не мешая другим. В отличие от традиционных программ, которые запускаются напрямую на хост-машине (компьютере, где все работает), контейнер использует механизмы операционной системы для создания иллюзии полной изоляции.

На уровне системы контейнер строится на двух ключевых технологиях ядра Linux (поскольку Docker изначально ориентирован на Linux, хотя теперь работает и на других платформах через эмуляцию): пространства имен и группы контроля ресурсов.

Пространства имен — это способ разделить системные ресурсы так, чтобы процессы внутри контейнера видели только свою часть системы. Например, пространство имен для процессов (PID namespace) делает так, что процессы в контейнере имеют свои собственные идентификаторы, начиная с 1, как будто они в отдельной системе. Пространство имен для сети изолирует сетевые интерфейсы, так что контейнер может иметь свой IP-адрес. Есть также пространства для пользователей, файловой системы и других. В памяти это значит, что процессы контейнера не видят процессы хоста напрямую — они работают в своем "пузыре", но делят одно ядро операционной системы. Это экономит ресурсы: нет overhead от полной виртуализации.

Группы контроля ресурсов (cgroups) — это механизм ограничения ресурсов, таких как процессор, память и диск. Например, вы можете сказать: "Этот контейнер может использовать не больше 512 МБ памяти". В памяти это работает через ядро, которое отслеживает использование и при превышении может убить процессы (OOM killer). Cgroups также помогают в изоляции ввода-вывода, чтобы один контейнер не "загружал" диск для всех.

Когда вы запускаете контейнер, Docker создает новый процесс (или группу процессов) с этими изоляциями. В памяти хоста процессы контейнера выглядят как обычные, но с метками для изоляции. Это делает контейнеры быстрыми: запуск занимает секунды, в отличие от виртуальных машин.



Отличие контейнера от виртуальной машины

Виртуальная машина (VM) — это полная эмуляция отдельного компьютера с собственным ядром операционной системы, процессором и памятью. Она использует гипервизор (программу вроде VirtualBox или VMware), который эмулирует аппаратное обеспечение. В памяти хоста VM занимает отдельный блок: ее процессы работают в изолированном пространстве с overhead от эмуляции (до 10-20% потерь производительности).

Контейнер, напротив, делит ядро хоста. Нет эмуляции аппаратного уровня — все процессы используют одно ядро. Это делает контейнеры легче: образ (шаблон для контейнера) может быть в разы меньше (сотни МБ vs гигабайты для VM), запуск быстрее, и overhead минимален (1-5%). Но есть минус: контейнеры менее безопасны, если есть уязвимость в ядре, она может затронуть все. Для Java это значит, что ваше приложение в контейнере запускается на той же JVM (виртуальной машине Java), что и на хосте, но с изоляцией зависимостей, что упрощает развертывание.



#Java #middle #Docker #DockerFile #Docker_compose #Buildx
👍6🔥1
OCI-спецификации: образы, манифесты и слои

Open Container Initiative (OCI) — это стандарт, который определяет, как должны выглядеть контейнерные образы и runtime (среда выполнения). Docker следует этим спецификациям, чтобы образы были совместимы с другими инструментами, вроде Podman или containerd.

Образ — это шаблон для контейнера, как архив с файлами, конфигурацией и инструкциями. Он состоит из слоев (layers) — последовательных изменений файловой системы. Каждый слой — это blob (бинарный объект), хранящий дельту (изменения) от предыдущего.

Манифест — это JSON-файл, описывающий образ: платформу (архитектуру процессора), слои, конфигурацию (команда запуска, порты). Для multi-platform образов (для разных CPU, как AMD64 и ARM) есть index-манифест, указывающий на подманифесты.

Content-addressable storage
— хранение по хэшу содержимого. Каждый слой имеет уникальный хэш (SHA256), так что если слой не изменился, он не перезагружается. Это влияет на кэш: при сборке Docker проверяет хэш и использует кэш, если ничего не поменялось. "Тонкие" образы (thin images) — это когда слои минимальны, без лишних файлов, что экономит место в памяти и на диске. В памяти при запуске слои монтируются как union-файловая система (overlayfs): верхние слои перекрывают нижние, но в RAM загружается только то, что нужно.


Это позволяет эффективно хранить образы: общие слои (например, базовый Ubuntu) делятся между образами, снижая использование диска.


Регистры образов: Docker Hub, теги и управление

Регистр — это хранилище для образов, как репозиторий для кода. Docker Hub — публичный регистр, где хранятся официальные образы (например, openjdk). Можно использовать частные, вроде в AWS ECR или self-hosted.

Теги — это метки для версий образа, как "latest" или "21-jre". Образы иммутабельны (неизменяемы): после загрузки в регистр их нельзя изменить, только перезаписать тег. Это обеспечивает воспроизводимость: тег "1.0" всегда тот же.

Удаление и сборка мусора (GC): Когда вы удаляете тег, слой не удаляется сразу, если он используется другими тегами. GC (garbage collection) — процесс, который чистит неиспользуемые слои. В Docker Hub это автоматически, но в частных регистрах нужно настраивать. Нюанс: dangling images (висячие, без тегов) накапливаются и жрут место; используйте "docker image prune" для очистки.

Для Java полезно: официальные образы вроде eclipse-temurin:21-jre хранятся в Docker Hub, и теги помогают управлять версиями JVM.


Dockerfile: декларативный подход и подводные камни

Dockerfile — это текстовый файл с инструкциями для сборки образа. Он декларативный: вы описываете, что нужно, а Docker строит слои последовательно.

Ключевые инструкции:
FROM: базовый образ, например, FROM eclipse-temurin:21-jre.
RUN: выполняет команду, создает слой (например, RUN apt-get install ...).
COPY/ADD: копирует файлы в образ.
CMD/ENTRYPOINT: команда запуска.


Подводные камни:
Порядок инструкций: Docker кэширует слои по порядку. Если часто меняющийся RUN в начале, весь кэш сломается. Ставьте стабильные инструкции первыми.
Кэш: Каждый слой кэшируется по хэшу. Если файл в COPY изменился, слои ниже инвалидируются.
Слои: Много RUN создают много слоев — объединяйте в один RUN с && для минимизации. В памяти это значит меньше overhead при монтировании.


Для Java: избегайте установки лишнего в RUN, чтобы образ был маленьким.



#Java #middle #Docker #DockerFile #Docker_compose #Buildx
👍6
Современная сборка образов: BuildKit и Buildx как стандарт

BuildKit — это новый движок сборки, который с 2023 года используется по умолчанию в Docker. В отличие от старого билдера, который обрабатывал инструкции последовательно, BuildKit анализирует весь Dockerfile как граф зависимостей. Это значит, что он может выполнять независимые инструкции параллельно. Например, если у вас несколько RUN, которые не зависят друг от друга, BuildKit запустит их одновременно на разных ядрах процессора. На уровне системы это снижает время сборки: вместо линейного ожидания, вы получаете параллельное использование ресурсов, что в памяти хоста проявляется как более эффективное распределение CPU и RAM во время билда.

Одна из ключевых фишек BuildKit — улучшенный кэш. В классическом подходе кэш хранится локально и может сломаться при изменении инструкций. BuildKit вводит inline-кэш: вы можете экспортировать кэш прямо в образ или в регистр. При следующей сборке Docker pulls (загружает) этот кэш, что ускоряет процесс в CI/CD-пайплайнах (системах непрерывной интеграции и доставки). Например, если вы собираете образ в GitHub Actions, inline-кэш позволяет избежать полной перестройки каждый раз.

Еще нюанс — обработка секретов. В старом билдере пароли или API-ключи могли попасть в слои образа, что небезопасно. BuildKit позволяет передавать секреты через --secret флаг: они монтируются временно в память во время RUN, но не сохраняются в финальном образе. В памяти это работает как tmpfs (временная файловая система в RAM), так что секреты не пишутся на диск и не остаются в истории.

Buildx — это расширение BuildKit для сборки мультиплатформенных образов. Оно позволяет создавать один образ, который работает на разных архитектурах процессоров, таких как x86 (AMD64) и ARM (для Raspberry Pi или облачных инстансов). Под капотом Buildx использует эмуляцию через QEMU: для каждой платформы он запускает виртуальный билдер, собирает слой, и объединяет в манифест. Это влияет на память: эмуляция может потреблять больше RAM, но результат — универсальный образ, который Docker сам выбирает под хост.


Для Java это критично: JVM (виртуальная машина Java) имеет версии для разных платформ, и Buildx обеспечивает, что ваш образ с Java 21 будет работать везде без перестройки. Подводный камень: эмуляция медленнее нативной сборки, так что для больших проектов используйте удаленные билдеры в облаке.


Docker Compose версии 2: оркестрация для локальной разработки и CI

Оркестрация — способ запуска нескольких контейнеров как единой системы. Docker Compose v2 — это инструмент, который стал дефолтным для этого. Он позволяет описать весь стек приложений в одном YAML-файле, включая сервисы, сети и volumes (тома для хранения данных).

Compose работает как надстройка над Docker: он парсит файл docker-compose.yml и вызывает docker run для каждого сервиса. В памяти хоста это значит создание сети по умолчанию (bridge), где контейнеры общаются по именам, и volumes, которые монтируются как bind-mounts (привязки к хост-файлам) или named volumes (управляемые Docker).
Для локальной разработки Compose идеален: команда docker compose up запускает все сервисы, и вы можете отлаживать Java-приложение с базой данных, например, PostgreSQL. В CI, таком как Jenkins или GitLab CI, Compose используется для тестов: он поднимает окружение, запускает тесты и сносит все после.


Нюансы: Compose v2 быстрее v1 благодаря Go-реализации (вместо Python), и лучше интегрируется с Docker Desktop. Подводный камень — зависимости: если сервис A зависит от B, укажите depends_on, но это не гарантирует готовность (например, база данных может стартовать медленно). Для Java используйте healthchecks: в compose-файле добавьте проверку, чтобы приложение ждало базу.
Еще фишка — профили: вы можете группировать сервисы для разных сред (dev, test), чтобы не запускать все сразу.



#Java #middle #Docker #DockerFile #Docker_compose #Buildx
👍5