Создание образов Docker для ИТ-специалистов: начальные шаги

Опубликовано: 16 Апреля, 2023
Создание образов Docker для ИТ-специалистов: начальные шаги

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

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

Когда мы начнем работать с Docker более профессионально, впереди нас ждет еще больше сложностей. Например, мы можем использовать многоэтапные сборки, использовать тома вне контейнеров для сохранения данных, масштабировать приложение с помощью Swarm/Kubernetes, создавать стек приложений с помощью компоновки файла и многое другое.

Понимание сценария

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

  • Более быстрое время выпуска для тестирования и производства.
  • Избегайте повторяющихся задач.
  • Небольшие размеры и масштабируемость (нет места для виртуальных машин и хранения исправлений ОС).

Приложение простое. Это статическая HTML-страница, и идея состоит в том, чтобы проиллюстрировать, как использовать Docker и создавать изображения. Эту концепцию можно использовать, если вы планируете писать код на NodeJS, Java, Phyton и так далее.

Убедитесь, что все работает с ручными шагами

Если вы никогда не пекли торт, вам будет сложно придумать рецепт без проб и ошибок (предположим, что в мире нет Интернета!). В этом разделе мы будем делать пробы и ошибки на уровне контейнера, чтобы убедиться, что мы знаем все шаги/ингредиенты для нашего окончательного рецепта/dockerfile.

В командной строке PowerShell мы загрузим локальную копию Linux Alpine и запустим ее в подключенном режиме (интерактивном) с помощью этих двух команд:

docker pull alpine docker container run –name app6manual -it alpine /bin/sh

Следующий шаг будет внутри контейнера. Мы обновим контейнер с помощью команды apk. Наш следующий шаг — установить компонент веб-сервера (apache2) с помощью этих команд (мы можем видеть команды в действии на изображении ниже).

apk обновить apk обновить apk добавить – без кэша apache2

Теперь, когда у нас установлено все программное обеспечение (веб-сервер), мы можем проверить, запущена ли служба (команда ps ). Если нет, то запустите службу (команда httpd ). Выполняем эти шаги, и они также изображены на изображении ниже.

пс httpd пс

Мы в хорошем месте, у нас запущен контейнер и установлено все необходимое программное обеспечение. Однако этот контейнер не открывает порт 80 (HTTP) для внешнего мира. Решение состоит в том, чтобы создать новый контейнер и повторить шаги, которые мы уже проверили, но на этот раз мы предоставим 80-й порт в контейнере для 800-го порта на хосте.

docker container run --name app6manualv3 -p 800:80 -it alpine /bin/sh

После запуска контейнера, установки необходимого программного обеспечения, мы можем протестировать с нашей хост-машины доступ к порту 800, и результат должен быть похож на изображение ниже. Это доказательство того, что Apache2 (веб-сервер) работает и отображается начальная страница.

В рамках нашего нового приложения нам нужно понять расположение внутри контейнера, где мы будем размещать наш будущий код. В службе Apache файл, содержащий всю конфигурацию в /etc/apache2/httpd. conf, и мы можем получить эту информацию с помощью редактора vi или команды cat, и это лишь некоторые из них.

В нашем сценарии мы знаем, что весь HTML-контент по умолчанию находится в папке /var/www/localhost/htdocs.

Мне нравится философия «семь раз отмерь и один раз отрежь». Итак, мы идем к источнику HTML, делаем несколько изменений и тестируем на хост-компьютере, чтобы увидеть, попадаем ли мы в нужные файлы. Это важно, потому что мы хотим убедиться, что у нас есть правильная информация для использования в нашем следующем файле dockerfile.

Создание образов Docker: ручной процесс

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

Мы можем завершить текущий контейнер, введя команду exit в оболочке, и поскольку контейнер был запущен с помощью , это изменит состояние контейнера на остановленное.

Мы можем создать образ текущего остановленного контейнера, запустив приведенный ниже командлет. Образ мы создадим в локальном репозитории и назначим тег app6manual.

фиксация контейнера Docker <имя_контейнера> <репозиторий>:<тег>

Теперь, когда у нас есть образ, мы можем запустить контейнер на его основе. Сначала мы перечислим существующие образы, и мы увидим наш совершенно новый образ. Затем мы создадим контейнер и сопоставим порт 777 с портом 80 в контейнере.

Результатом нового контейнера будет шелл, мы проверим, запущен ли сервис , и запустим его вручную. Результатом будет страница, которую мы изменили перед остановкой контейнера на предыдущем шаге.

docker image ls docker container run –name <NewContainerName> -p 777:80 -it local:app6manual /bin/sh ps httpd ps

Вы могли заметить, что нам не пришлось ничего устанавливать или изменять HTML-контент. Причина проста — все изменения были сделаны в предыдущем контейнере, и мы создали наш образ на основе этого оригинального образа. Этот процесс полезен при устранении неполадок с контейнером, и нам нужен моментальный снимок для дальнейшего устранения неполадок.

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

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