Создание образов 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-контент. Причина проста — все изменения были сделаны в предыдущем контейнере, и мы создали наш образ на основе этого оригинального образа. Этот процесс полезен при устранении неполадок с контейнером, и нам нужен моментальный снимок для дальнейшего устранения неполадок.
Проблема этого метода в том, что он не гибкий, а поддержка ужасная. Представьте себе сценарий, в котором вводится новое изменение, которое может быть новой страницей или просто некоторыми изменениями текста. Для этого потребуется новый контейнер, установка всего, редактирование файлов, создание образа и развертывание образа.
Технически вы могли бы начать с существующего образа, но со временем отслеживать изменения будет все труднее и труднее. Вся концепция контейнеров заключается в использовании чистых, быстрых контейнеров и отказе от их повторного использования. И тут на помощь приходит вторая часть нашей серии.