HTML Diff
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>