+7 (3412) 56-18-05
hr@dexsys.ru
г. Ижевск, ул. Удмуртская, 304, торгово-офисный
центр «Аврора Парк»
«Dexsys», 2012-2022
21 июля

Мир docker-контейнеров и как в нем жить обычному разработчику

В этой статье мы хотим поговорить о контейнерах в общем и о docker-контейнерах в частности. Как с ними жить обычному разработчику?
Раньше в IT люди занимались тем, что запускали софт на одной большой машине(сервере) и ловили разные проблемы: «у нас не работает», конфликты библиотек, проблемы обновления и сопровождения.
Далее на авансцену выходят VM (виртуальные машины), и это в каком-то виде решило проблему доставки кода, так как теперь софт работал изолированно от других версий софта, но не решило проблему обновления и сопровождения.

Наверное, вы часто оказывались по ту или другую сторону проблемы и слышали/говорили следующие слова: «А у нас работает!».
Затем, с течением времени, появились докер-контейнеры. Они стали средством удешевления развертывания софта, упрощения деплоя и обновления.
Итак, с историей мы разобрались, время поговорить более предметно!
Что под капотом у этой технологии?
linux kernel-namespace — так как докер-контейнер не виртуализирует аппаратную составляющую, а только программную, для него создается свое пространство для pid-процессов, сети, файловой системы и процессов ядра.

Вторым китом контейнерной технологии будет cgroups — для того, чтобы управлять системными ресурсами для каждого контейнера, в них входит: оперативная память, процессорное время, доступ к дискам.

Третий кит контейнерной технологии, union file system, – позволяет управлять файловой системой, которая состоит из слоев, и ее фишки хорошо ложатся на контейнеры.
Теперь, после того, как вы прошли несколько стадий принятия новой технологии, неплохо бы научиться с ней работать и ей пользоваться :)
Если вы виндузятник или маковод, то вам нужен docker desktop, а с виндой возможно понадобится WSL - windows subsystem for linux.

Если вы красноглазый линуксоид, то apt-get update && apt-get install docker (на самом деле путь чуть-чуть сложнее, но для знакомства хватит этих двух команд).

После того, как вы установили docker на ПК, есть смысл ознакомиться со списком существующих команд. Для этого разработчики docker добавили полезный ключ в вызове CLI-программы: вводим в консоли docker -h (--help) и видим список всех существующих команд.
Я выделю самые полезные на старте:
docker pull - сможете скачать образ из любого docker registry, это хранилище докер-образов

docker push - а с помощью этой команды вы сможете загрузить образ в любое доступное для вас docker registry

docker run - эта команда создает и стартует новый контейнер из существующего образа

docker stop - эта команда останавливает работу контейнера

docker ps - а вывод данной команды покажет вам запущенные docker-контейнеры (еще можно написать вот так: docker ps -a и вы увидите все контейнеры - запущенные и остановленные)

docker images - ничего экстравагантного, просто вывод на экран всех образов

docker build - а с помощью этой команды вы сможете создавать свои docker-образы из dockerfile

Я перечислил самые популярные команды, но ранее вы видели, что их больше и у каждой команды есть свои различные опции.
Время попрактиковаться!
Теперь на примере образа nginx:1.22 (это популярный веб-сервер) рассмотрим как добавить в наш будущий образ файл index.html, создать на его основе контейнер и просмотреть через браузер.
(Я веб-разработчик, поэтому в качестве примера выбрал демонстрацию с html)

Создадим директорию docker-test (актуально для примеров на OSX и Linux*) и следующей командой перейдем внутрь:
Тут создадим директорию nginx:
Затем открываем ваш любой любимый редактор (nano, vim, vscode, etc) и создаем файл со следующим названием: «Dockerfile»

Откроем наш файл и напишем следующее:
Объясним обе строчки:

Первая строчка: указывает базовый образ версии нашего веб-сервера, в нашем случае это nginx версии 1.22 (крутые специалисты всегда указывают точные версии используемых программ)

Вторая строчка: копирует файл index.html внутрь докер-образа, по которому nginx будет искать html-файлы.

Далее мы создадим html-файл в директории рядом с nginx, для этого выйдем из текущей директории в предыдущий каталог:
И создадим файл index.html
Откроем файл, который мы создали предыдущей командой, с помощью вашего любимого текстового редактора или IDE и добавим следующие строчки:
Сейчас нам необходимо создать наш первый образ, для этого введем следующую команду:
Сейчас нам необходимо создать наш первый образ, для этого введем следующую команду:
Что делает каждая команда и ключ?

docker build - это команда для создания образа

ключ -f нужен для указания пути до Dockerfile

-t - тут мы называем наш образ my-nginx

точка в конце нужна для указания каталога, для контекста сборки, и чтобы наш сборщик понимал, где искать файлы. Если указать не точку, а какой-то иной каталог, но, при этом, в Dockerfile у вас будет указана инструкция по работе с файлами, то сборка сломается.
После запуска нашей команды, если вы ничего не забыли, вы увидите следующее:
Теперь, когда у нас есть наш небольшой docker-образ, самое время его запустить:
Что делает каждый ключ в нашей команде?

docker run — команда создания и запуска контейнера.

-d — чтобы наш контейнер работал в фоне и не перехватывал управление над консолью

-p 80:80 — открываем порт 80 у нашего контейнера

- - name — присваиваем имя нашему контейнеру

my-nginx — указываем используемый образ нашего контейнера

И после этого мы видим, что nginx отдал index.html при запросе на 127.0.0.1:80, так как мы запустили наш контейнер локально.
Что делает каждый ключ в нашей команде?

docker run — команда создания и запуска контейнера.

-d — чтобы наш контейнер работал в фоне и не перехватывал управление над консолью

-p 80:80 — открываем порт 80 у нашего контейнера

- - name — присваиваем имя нашему контейнеру

my-nginx — указываем используемый образ нашего контейнера

И после этого мы видим, что nginx отдал index.html при запросе на 127.0.0.1:80, так как мы запустили наш контейнер локально.
Вывод:)
Контейнерная технология решает много проблем во взаимодействии программистов и сопровождения, а также делает процесс разработки более удобным. Но не стоит забывать, что это не «серебряная пуля»** и, как в любом инструменте, нужно подходить с умом к ее использованию. Надеюсь наш комикс и небольшая практическая часть поможет вам пользоваться контейнерами правильно.

Автор: Валерий, .Net-разработчик

Примечания:

*Пример для WSL не рассматривается в рамках данной статьи, но мы обязательно разберем его в следующих выпусках 🙂

**Серебряной пулей считается супер-крутая технология, которая решит все проблемы разработки. Но пока, увы, такой не существует.
Контейнерная технология решает много проблем во взаимодействии программистов и сопровождения, а также делает процесс разработки более удобным. Но не стоит забывать, что это не «серебряная пуля»** и, как в любом инструменте, нужно подходить с умом к ее использованию. Надеюсь наш комикс и небольшая практическая часть поможет вам пользоваться контейнерами правильно.

Автор: Валерий, .Net-разработчик

Примечания:

*Пример для WSL не рассматривается в рамках данной статьи, но мы обязательно разберем его в следующих выпусках 🙂

**Серебряной пулей считается супер-крутая технология, которая решит все проблемы разработки. Но пока, увы, такой не существует.
«Dexsys», 2012-2021
г. Ижевск, ул. Удмуртская, 304,
торгово-офисный центр «Аврора Парк»
+7 (3412) 56-18-05
hr@dexsys.ru