1 added
1 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>19 янв 2023</li>
2
<ul><li>19 янв 2023</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><h2>Что такое контейнер? Объясняем простыми словами</h2>
4
</ul><h2>Что такое контейнер? Объясняем простыми словами</h2>
5
<p>Заходят как-то в бар дизайнер и айтишник, а джун их спрашивает: "И как это понимать?"</p>
5
<p>Заходят как-то в бар дизайнер и айтишник, а джун их спрашивает: "И как это понимать?"</p>
6
<p>Иллюстрация: Оля Ежак для Skillbox Media</p>
6
<p>Иллюстрация: Оля Ежак для Skillbox Media</p>
7
<p>Контейнер - это термин, который встречается и в дизайне, и в айти. Он означает одно и то же? Или в каждой области подразумевается своё значение?</p>
7
<p>Контейнер - это термин, который встречается и в дизайне, и в айти. Он означает одно и то же? Или в каждой области подразумевается своё значение?</p>
8
<p>Простыми словами объясняют, что значит "контейнер", эксперт в дизайне Алексей Нибо и эксперт в разработке Егор Яковишен.</p>
8
<p>Простыми словами объясняют, что значит "контейнер", эксперт в дизайне Алексей Нибо и эксперт в разработке Егор Яковишен.</p>
9
<p>Дизайн-директор "<a>Атвинты</a>", эксперт курсов по UX/UI-дизайну.</p>
9
<p>Дизайн-директор "<a>Атвинты</a>", эксперт курсов по UX/UI-дизайну.</p>
10
<p>Если рассматривать понятие в общем, то контейнер - это элемент, который содержит в себе что-то ещё. Подумайте о коробке, в которую вы можете положить разные предметы. Так же и контейнер представляет собой некий "бокс" - в нём дизайнер тоже размещает объекты, только всё это происходит в контексте интерфейса.</p>
10
<p>Если рассматривать понятие в общем, то контейнер - это элемент, который содержит в себе что-то ещё. Подумайте о коробке, в которую вы можете положить разные предметы. Так же и контейнер представляет собой некий "бокс" - в нём дизайнер тоже размещает объекты, только всё это происходит в контексте интерфейса.</p>
11
<em>Изображение:<a>freepik</a></em><p>В контейнере могут находиться любые компоненты:</p>
11
<em>Изображение:<a>freepik</a></em><p>В контейнере могут находиться любые компоненты:</p>
12
<ul><li>текст,</li>
12
<ul><li>текст,</li>
13
<li>изображения,</li>
13
<li>изображения,</li>
14
<li>таблицы,</li>
14
<li>таблицы,</li>
15
<li>карточки и так далее.</li>
15
<li>карточки и так далее.</li>
16
</ul>Контейнеры на макете сайта: невидимые - когда границы явно не очерчены, видимые - с чёткими границами: изображение, фон, рамка<em>Изображение: "Атвинта"</em><p>Наполнение "бокса" может состоять из одного компонента или нескольких. Например, только текста, или текста с изображением, или любых других комбинаций.</p>
16
</ul>Контейнеры на макете сайта: невидимые - когда границы явно не очерчены, видимые - с чёткими границами: изображение, фон, рамка<em>Изображение: "Атвинта"</em><p>Наполнение "бокса" может состоять из одного компонента или нескольких. Например, только текста, или текста с изображением, или любых других комбинаций.</p>
17
<p>Также контейнером может быть область, настраивающая контент под определённый формат. Пример - контейнер для карточки товара, который сам кадрирует изображение по прямоугольной форме. Каким бы загруженное фото ни было, всё лишнее за пределами контейнера будет обрезано.</p>
17
<p>Также контейнером может быть область, настраивающая контент под определённый формат. Пример - контейнер для карточки товара, который сам кадрирует изображение по прямоугольной форме. Каким бы загруженное фото ни было, всё лишнее за пределами контейнера будет обрезано.</p>
18
Прототип и макет карточки с изображением в каталоге<em>Изображение: "Атвинта"</em><p><strong>1.</strong>Страница сайта или приложения - это вообще большой контейнер, внутри которого дизайнер может создать более мелкие контейнеры, чтобы<strong>выстроить задуманную композицию</strong>.</p>
18
Прототип и макет карточки с изображением в каталоге<em>Изображение: "Атвинта"</em><p><strong>1.</strong>Страница сайта или приложения - это вообще большой контейнер, внутри которого дизайнер может создать более мелкие контейнеры, чтобы<strong>выстроить задуманную композицию</strong>.</p>
19
<p>Особенно это актуально для элементов, которые трудно подстроить под общую сетку проекта. Внутри контейнера можно создать свою маленькую экосистему и задать нужные параметры для его собственной сетки.</p>
19
<p>Особенно это актуально для элементов, которые трудно подстроить под общую сетку проекта. Внутри контейнера можно создать свою маленькую экосистему и задать нужные параметры для его собственной сетки.</p>
20
Сетки на прототипе сайта курорта<em>Изображение: "Атвинта"</em><p>Например, если дизайнеру нужны дополнительные столбцы, чтобы разместить и выстроить сложный или детализированный контент (таблицы, инфографику), то можно добавить внутрь ещё одну модульную сетку и размещать объекты уже по ней.</p>
20
Сетки на прототипе сайта курорта<em>Изображение: "Атвинта"</em><p>Например, если дизайнеру нужны дополнительные столбцы, чтобы разместить и выстроить сложный или детализированный контент (таблицы, инфографику), то можно добавить внутрь ещё одну модульную сетку и размещать объекты уже по ней.</p>
21
Сетки на макетах образовательной платформы<em>Изображение: "Атвинта"</em>Сетки на макетах образовательной платформы<em>Изображение: "Атвинта"</em><p><strong>2.</strong>Контейнеры помогают<strong>расставить акценты</strong>. Например, часто в вёрстке текста под цитаты создают отдельный блок, чтобы выделить экспертное мнение.</p>
21
Сетки на макетах образовательной платформы<em>Изображение: "Атвинта"</em>Сетки на макетах образовательной платформы<em>Изображение: "Атвинта"</em><p><strong>2.</strong>Контейнеры помогают<strong>расставить акценты</strong>. Например, часто в вёрстке текста под цитаты создают отдельный блок, чтобы выделить экспертное мнение.</p>
22
<p>В этом случае дизайнер может разместить внутри контейнера:</p>
22
<p>В этом случае дизайнер может разместить внутри контейнера:</p>
23
<ul><li>символ кавычек;</li>
23
<ul><li>символ кавычек;</li>
24
<li>рамку, в которой будет находиться текст;</li>
24
<li>рамку, в которой будет находиться текст;</li>
25
<li>текст с более крупным шрифтом;</li>
25
<li>текст с более крупным шрифтом;</li>
26
<li>изображение с фотографией спикера;</li>
26
<li>изображение с фотографией спикера;</li>
27
<li>должность и имя;</li>
27
<li>должность и имя;</li>
28
<li>акцентный фон.</li>
28
<li>акцентный фон.</li>
29
</ul>Оформление цитаты в блоге "Атвинты"<em>Скриншот: "Атвинта"</em><p><strong>3.</strong>Также инструмент пригодится, чтобы отделить один тип информации от другой и <strong>сделать интерфейс более структурированным</strong>.</p>
29
</ul>Оформление цитаты в блоге "Атвинты"<em>Скриншот: "Атвинта"</em><p><strong>3.</strong>Также инструмент пригодится, чтобы отделить один тип информации от другой и <strong>сделать интерфейс более структурированным</strong>.</p>
30
<p>Такое хорошо видно на примере дашбордов.</p>
30
<p>Такое хорошо видно на примере дашбордов.</p>
31
<p>Чтобы пользователь легко различал группы данных, у каждой из них должен быть свой контейнер с подходящими цифрами и диаграммами. В интерфейсе это выглядит как плашки с разным набором контента.</p>
31
<p>Чтобы пользователь легко различал группы данных, у каждой из них должен быть свой контейнер с подходящими цифрами и диаграммами. В интерфейсе это выглядит как плашки с разным набором контента.</p>
32
Использование контейнеров на дашбордах<em>Изображение: "Атвинта"</em>Использование контейнеров на дашбордах<em>Изображение: "Атвинта"</em><p>Итог: зачем дизайнеру контейнеры?</p>
32
Использование контейнеров на дашбордах<em>Изображение: "Атвинта"</em>Использование контейнеров на дашбордах<em>Изображение: "Атвинта"</em><p>Итог: зачем дизайнеру контейнеры?</p>
33
<p>Благодаря контейнеру у дизайнера меньше ограничений: с его помощью можно реализовать любую композицию, расставить акценты, отделить разные виды информации и задать параметры контента для фронтендера, который будет собирать макет.</p>
33
<p>Благодаря контейнеру у дизайнера меньше ограничений: с его помощью можно реализовать любую композицию, расставить акценты, отделить разные виды информации и задать параметры контента для фронтендера, который будет собирать макет.</p>
34
<p>Основной критерий - элементы, которые будут размещаться внутри. От этого будут зависеть форма, размер, рамка, необходимость акцентного фона и другие характеристики контейнера.</p>
34
<p>Основной критерий - элементы, которые будут размещаться внутри. От этого будут зависеть форма, размер, рамка, необходимость акцентного фона и другие характеристики контейнера.</p>
35
Процесс создания контейнера на прототипе сайта курорта<em>Видео: "Атвинта"</em><p>В Figma и других графических программах область контейнера намечают как простую геометрическую фигуру. Дизайнер может задать любую форму, но, как правило, это прямоугольник, внутри которого размещаются объекты.</p>
35
Процесс создания контейнера на прототипе сайта курорта<em>Видео: "Атвинта"</em><p>В Figma и других графических программах область контейнера намечают как простую геометрическую фигуру. Дизайнер может задать любую форму, но, как правило, это прямоугольник, внутри которого размещаются объекты.</p>
36
<p>Предварительно спланируйте, какие элементы вы разместите внутри и понадобится ли им своя модульная сетка. Визуально выделить содержимое поможет рамка или акцентный фон, а также размер шрифта и цвет текста.</p>
36
<p>Предварительно спланируйте, какие элементы вы разместите внутри и понадобится ли им своя модульная сетка. Визуально выделить содержимое поможет рамка или акцентный фон, а также размер шрифта и цвет текста.</p>
37
<p><strong>Маша ???:</strong>Вася, а ты задеплоил уже? Что-то на стейджинге белый экран :(</p>
37
<p><strong>Маша ???:</strong>Вася, а ты задеплоил уже? Что-то на стейджинге белый экран :(</p>
38
<p><strong>Вася ??:</strong>Странно, у меня локально всё работает… Сейчас посмотрю.</p>
38
<p><strong>Вася ??:</strong>Странно, у меня локально всё работает… Сейчас посмотрю.</p>
39
<p>[…]</p>
39
<p>[…]</p>
40
<p><strong>Вася ??:</strong>Я посмотрел, там версия ноды старая, надо обновить.</p>
40
<p><strong>Вася ??:</strong>Я посмотрел, там версия ноды старая, надо обновить.</p>
41
<p><strong>Маша ???:</strong>Эх, давно пора всё в контейнеры завернуть…</p>
41
<p><strong>Маша ???:</strong>Эх, давно пора всё в контейнеры завернуть…</p>
42
<p>Знакомая ситуация?</p>
42
<p>Знакомая ситуация?</p>
43
<p>Часто это происходит из-за того, что на компьютере разработчика и на сервере разные параметры<strong>окружения</strong>. Объясню, что это такое и как контейнеры помогают избегать подобных проблем.</p>
43
<p>Часто это происходит из-за того, что на компьютере разработчика и на сервере разные параметры<strong>окружения</strong>. Объясню, что это такое и как контейнеры помогают избегать подобных проблем.</p>
44
<p>Код никогда не работает сам по себе, он всегда выполняется в определённом окружении (environment). Как правило, окружение - это либо<strong>компьютер разработчика</strong>, на котором он пишет и отлаживает код, либо<strong>сервер</strong>, на котором этот код запускается. Чтобы код работал везде корректно и одинаково, необходимо настроить все эти окружения единообразно.</p>
44
<p>Код никогда не работает сам по себе, он всегда выполняется в определённом окружении (environment). Как правило, окружение - это либо<strong>компьютер разработчика</strong>, на котором он пишет и отлаживает код, либо<strong>сервер</strong>, на котором этот код запускается. Чтобы код работал везде корректно и одинаково, необходимо настроить все эти окружения единообразно.</p>
45
<p>Из чего состоит окружение?</p>
45
<p>Из чего состоит окружение?</p>
46
<p>-<strong>Операционная система.</strong>Разработчики часто используют Windows или macOS, а серверы обычно работают на различных версиях Linux.</p>
46
<p>-<strong>Операционная система.</strong>Разработчики часто используют Windows или macOS, а серверы обычно работают на различных версиях Linux.</p>
47
<p>- <strong>Среда выполнения (runtime environment)</strong>используемого языка программирования - Python, Node.js, Go, PHP и др. Когда вы пишете команды вроде python my_script.py или node main.js, ваш скрипт запускается в среде выполнения.</p>
47
<p>- <strong>Среда выполнения (runtime environment)</strong>используемого языка программирования - Python, Node.js, Go, PHP и др. Когда вы пишете команды вроде python my_script.py или node main.js, ваш скрипт запускается в среде выполнения.</p>
48
<p>-<strong>Необходимые библиотеки</strong>. Они нужны приложению для работы с сетью, графикой, видео, аудио, шифрованием и другими системными возможностями.</p>
48
<p>-<strong>Необходимые библиотеки</strong>. Они нужны приложению для работы с сетью, графикой, видео, аудио, шифрованием и другими системными возможностями.</p>
49
<p>-<strong>Конфигурационные файлы и настройки системы.</strong></p>
49
<p>-<strong>Конфигурационные файлы и настройки системы.</strong></p>
50
<p>-<strong>Другие приложения</strong>, которые должны быть запущены и доступны. Например, веб‑серверы (nginx), базы данных (PostgreSQL, MongoDB), системы обмена сообщениями (RabbitMQ, Kafka) и прочие.</p>
50
<p>-<strong>Другие приложения</strong>, которые должны быть запущены и доступны. Например, веб‑серверы (nginx), базы данных (PostgreSQL, MongoDB), системы обмена сообщениями (RabbitMQ, Kafka) и прочие.</p>
51
<p>Составные части окружения называются<strong>зависимостями</strong>(dependencies).</p>
51
<p>Составные части окружения называются<strong>зависимостями</strong>(dependencies).</p>
52
<p><strong>Важно:</strong>значение имеет не только наличие конкретных зависимостей, но и их версии. Например, если на одном компьютере установлена Node.js 16-й версии, а на другом - 18-й, то код может работать неправильно или не запуститься вообще.</p>
52
<p><strong>Важно:</strong>значение имеет не только наличие конкретных зависимостей, но и их версии. Например, если на одном компьютере установлена Node.js 16-й версии, а на другом - 18-й, то код может работать неправильно или не запуститься вообще.</p>
53
<p>Но даже если настроить всё правильно один раз, надолго этого не хватит:</p>
53
<p>Но даже если настроить всё правильно один раз, надолго этого не хватит:</p>
54
<ul><li>В команду придут новые разработчики, и им нужно будет подготовить рабочую среду.</li>
54
<ul><li>В команду придут новые разработчики, и им нужно будет подготовить рабочую среду.</li>
55
<li>Появятся важные обновления операционной системы или библиотек, которые нужно будет установить везде.</li>
55
<li>Появятся важные обновления операционной системы или библиотек, которые нужно будет установить везде.</li>
56
<li>С ростом количества пользователей продукта возникнет потребность в новых серверах.</li>
56
<li>С ростом количества пользователей продукта возникнет потребность в новых серверах.</li>
57
</ul><p>Вручную следить за конфигурацией постоянно увеличивающегося и меняющегося зоопарка окружений становится очень тяжело.</p>
57
</ul><p>Вручную следить за конфигурацией постоянно увеличивающегося и меняющегося зоопарка окружений становится очень тяжело.</p>
58
<p>И тут на помощь приходят контейнеры.</p>
58
<p>И тут на помощь приходят контейнеры.</p>
59
<p>Контейнеры в разработке - это способ "упаковать" свой код вместе со всеми его зависимостями в единую изолированную среду. Контейнер можно передать другому разработчику или запустить на сервере - и он будет воспроизведён с точно такой же конфигурацией, с которой был создан.</p>
59
<p>Контейнеры в разработке - это способ "упаковать" свой код вместе со всеми его зависимостями в единую изолированную среду. Контейнер можно передать другому разработчику или запустить на сервере - и он будет воспроизведён с точно такой же конфигурацией, с которой был создан.</p>
60
<p>Самый популярный инструмент для создания и запуска контейнеров -<a>Docker</a>.</p>
60
<p>Самый популярный инструмент для создания и запуска контейнеров -<a>Docker</a>.</p>
61
<p>Давайте рассмотрим пример жизненного цикла контейнера.</p>
61
<p>Давайте рассмотрим пример жизненного цикла контейнера.</p>
62
<p>Всё начинается с того, что мы берём существующее приложение и описываем конфигурацию контейнера для него. В Docker для этого есть специальный файл под названием Dockerfile, который хранится вместе с кодом проекта.</p>
62
<p>Всё начинается с того, что мы берём существующее приложение и описываем конфигурацию контейнера для него. В Docker для этого есть специальный файл под названием Dockerfile, который хранится вместе с кодом проекта.</p>
63
<p>Вот пример Dockerfile для веб-приложения на Node.js:</p>
63
<p>Вот пример Dockerfile для веб-приложения на Node.js:</p>
64
<p># Берём за основу образ Node.js версии 18</p>
64
<p># Берём за основу образ Node.js версии 18</p>
65
<p>FROM node:18</p>
65
<p>FROM node:18</p>
66
<p># Устанавливаем /app как рабочую директорию</p>
66
<p># Устанавливаем /app как рабочую директорию</p>
67
<p>WORKDIR /app</p>
67
<p>WORKDIR /app</p>
68
<p># Копируем файлы package.json и package-lock.json из кода проекта</p>
68
<p># Копируем файлы package.json и package-lock.json из кода проекта</p>
69
<p>COPY package*.json ./</p>
69
<p>COPY package*.json ./</p>
70
<p># Устанавливаем зависимости</p>
70
<p># Устанавливаем зависимости</p>
71
<p>RUN npm install</p>
71
<p>RUN npm install</p>
72
<p># Копируем остальной код приложения</p>
72
<p># Копируем остальной код приложения</p>
73
<p>COPY . .</p>
73
<p>COPY . .</p>
74
<p># Открываем порт 3000 внутри контейнера</p>
74
<p># Открываем порт 3000 внутри контейнера</p>
75
<p>EXPOSE 3000</p>
75
<p>EXPOSE 3000</p>
76
<p># Запускаем приложение</p>
76
<p># Запускаем приложение</p>
77
<p>CMD [ "npm", "start" ]</p>
77
<p>CMD [ "npm", "start" ]</p>
78
<p>Когда Dockerfile подготовлен, из него мы можем создать образ контейнера с помощью следующей команды:</p>
78
<p>Когда Dockerfile подготовлен, из него мы можем создать образ контейнера с помощью следующей команды:</p>
79
<p>Теперь у нас есть образ контейнера под названием myapp. Это ещё не сам контейнер, а шаблон, из которого мы можем запустить какое угодно количество контейнеров.</p>
79
<p>Теперь у нас есть образ контейнера под названием myapp. Это ещё не сам контейнер, а шаблон, из которого мы можем запустить какое угодно количество контейнеров.</p>
80
<p>Запустим контейнер из только что созданного образа:</p>
80
<p>Запустим контейнер из только что созданного образа:</p>
81
<p>docker run -p 80:3000 myapp</p>
81
<p>docker run -p 80:3000 myapp</p>
82
<p>Ура, контейнер запущен! Обратите внимание на параметр -p 80:3000. Он позволяет перенаправить обращения с порта 80 хост-машины на порт 3000 внутри контейнера. Таким образом, приложение сможет отвечать на HTTP-запросы, которые приходят извне.</p>
82
<p>Ура, контейнер запущен! Обратите внимание на параметр -p 80:3000. Он позволяет перенаправить обращения с порта 80 хост-машины на порт 3000 внутри контейнера. Таким образом, приложение сможет отвечать на HTTP-запросы, которые приходят извне.</p>
83
<p>После запуска мы можем наблюдать за логами внутри контейнера (команда docker logs), а также заходить внутрь контейнера через терминал (команда docker attach).</p>
83
<p>После запуска мы можем наблюдать за логами внутри контейнера (команда docker logs), а также заходить внутрь контейнера через терминал (команда docker attach).</p>
84
<p>На одном компьютере или сервере может работать множество разных контейнеров.</p>
84
<p>На одном компьютере или сервере может работать множество разных контейнеров.</p>
85
<p>В них могут быть запущены разные приложения или разные версии одного и того же приложения (например, когда хочется безопасно откатиться к старой версии). По умолчанию контейнеры полностью изолированы как от внешней среды (<em>"хост-машины"</em>), так и друг от друга. При необходимости для них можно открывать определённые порты и настраивать взаимодействие друг между другом.</p>
85
<p>В них могут быть запущены разные приложения или разные версии одного и того же приложения (например, когда хочется безопасно откатиться к старой версии). По умолчанию контейнеры полностью изолированы как от внешней среды (<em>"хост-машины"</em>), так и друг от друга. При необходимости для них можно открывать определённые порты и настраивать взаимодействие друг между другом.</p>
86
-
<p>В больших проектах количество контейнеров легко может измеряться сотнями, а запуск и остановка происходят автоматически. Например, когда нагрузка растёт или в каких-то контейнерах возникают ошибки, система сама перезапускает их или добавляет новые. Этот процесс называется<strong>оркестрацией контейнеров</strong>. Наиболее популярный инструмент для оркестрации -<a>Kubernetes</a>.</p>
86
+
<p>В больших проектах количество конте��неров легко может измеряться сотнями, а запуск и остановка происходят автоматически. Например, когда нагрузка растёт или в каких-то контейнерах возникают ошибки, система сама перезапускает их или добавляет новые. Этот процесс называется<strong>оркестрацией контейнеров</strong>. Наиболее популярный инструмент для оркестрации -<a>Kubernetes</a>.</p>
87
<p>Для хранения и распространения образов контейнеров используют реестры контейнеров (container registry). Docker предоставляет открытое публичное хранилище под названием<a>Docker Hub</a>, которое чем-то напоминает GitHub: вы можете загрузить туда образ своего контейнера и сделать его доступным любому пользователю. Для рабочих проектов используют закрытые реестры - например, <a>Amazon Container Registry</a>.</p>
87
<p>Для хранения и распространения образов контейнеров используют реестры контейнеров (container registry). Docker предоставляет открытое публичное хранилище под названием<a>Docker Hub</a>, которое чем-то напоминает GitHub: вы можете загрузить туда образ своего контейнера и сделать его доступным любому пользователю. Для рабочих проектов используют закрытые реестры - например, <a>Amazon Container Registry</a>.</p>
88
<p>Итог: зачем разработчику контейнеры?</p>
88
<p>Итог: зачем разработчику контейнеры?</p>
89
<p>Итак, мы разобрались, что контейнеры помогают упаковать код приложения вместе с необходимыми зависимостями в изолированную среду и потом запустить в любом месте, где работает Docker. Это позволяет не задумываться о различиях в конфигурации между компьютерами и серверами и оставаться уверенными, что код будет работать без сюрпризов (или нет ?).</p>
89
<p>Итак, мы разобрались, что контейнеры помогают упаковать код приложения вместе с необходимыми зависимостями в изолированную среду и потом запустить в любом месте, где работает Docker. Это позволяет не задумываться о различиях в конфигурации между компьютерами и серверами и оставаться уверенными, что код будет работать без сюрпризов (или нет ?).</p>
90
<a><b>Попробуйте бесплатно 4 топовые профессии в дизайне</b>Пройдите бесплатный курс по дизайну. Добавьте 4 крутых кейса в портфолио и решите, в каком направлении развиваться дальше. Пройти курс→</a>
90
<a><b>Попробуйте бесплатно 4 топовые профессии в дизайне</b>Пройдите бесплатный курс по дизайну. Добавьте 4 крутых кейса в портфолио и решите, в каком направлении развиваться дальше. Пройти курс→</a>