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

В этой статье мы хотим поговорить о контейнерах в общем и о docker-контейнерах в частности. Как с ними жить обычному разработчику?

Раньше в IT люди занимались тем, что запускали софт на одной большой машине(сервере) и ловили разные проблемы: «у нас не работает», конфликты библиотек, проблемы обновления и сопровождения.

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

Далее на авансцену выходят VM (виртуальные машины), и это в каком-то виде решило проблему доставки кода, так как теперь софт работал изолированно от других версий софта, но не решило проблему обновления и сопровождения.

Наверное, вы часто оказывались по ту или другую сторону проблемы и слышали/говорили следующие слова: «А у нас работает!».

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

Затем, с течением времени, появились докер-контейнеры. Они стали средством удешевления развертывания софта, упрощения деплоя и обновления.

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

Итак, с историей мы разобрались, время поговорить более предметно!

Что под капотом у этой технологии?

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*) и следующей командой перейдем внутрь:

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

Тут создадим директорию nginx:

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

Затем открываем ваш любой любимый редактор (nano, vim, vscode, etc) и создаем файл со следующим названием: «Dockerfile»

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

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

Объясним обе строчки:

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

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

Далее мы создадим html-файл в директории рядом с nginx, для этого выйдем из текущей директории в предыдущий каталог:

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

И создадим файл index.html

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

Откроем файл, который мы создали предыдущей командой, с помощью вашего любимого текстового редактора или IDE и добавим следующие строчки:

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

Сейчас нам необходимо создать наш первый образ, для этого введем следующую команду:

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

Что делает каждая команда и ключ?

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

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

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

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

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

После запуска нашей команды, если вы ничего не забыли, вы увидите следующее:

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

Теперь, когда у нас есть наш небольшой docker-образ, самое время его запустить:

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

Что делает каждый ключ в нашей команде?

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

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

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

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

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

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

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

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

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

Примечания:

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

**Серебряной пулей считается супер-крутая технология, которая решит все проблемы разработки. Но пока, увы, такой не существует.

11
Начать дискуссию