Докер с нуля: создание образов
Контейнеры Docker растут как лучшая практика для развертывания и управления облачными распределенными системами. Контейнеры - это экземпляры образов Docker. Нужно много всего знать, чтобы понимать образы.
В этом учебном пособии из двух частей я подробно изучаю образы Docker. В первой части я обсудил основные принципы, соображения проектирования и осмотр внутренних образов. В этой части я расскажу о том, как создавать собственные образы, устранять неполадки и работать с репозиториями образов.
Когда вы выйдете с другой стороны, у вас будет четкое представление о том, что именно представляют из себя образы Docker и как их эффективно использовать в ваших собственных приложениях и системах.
Создание образов
Существует два способа создания образов. Вы можете изменить существующий контейнер, а затем зафиксировать его как новый образ, или вы можете написать свой Dockerfile и создать его для образа. Мы перейдем к обоим и объясним плюсы и минусы.
Ручные сборкиС помощью ручных сборок вы обрабатываете свой контейнер как обычный компьютер. Вы устанавливаете пакеты, вы пишете файлы, и когда все это будет сказано и сделано, вы фиксируете его и получаете новый образ, который вы используете в качестве шаблона, чтобы создать еще много идентичных контейнеров или даже основывать другие образы.
Начнем с alpine image, которое является очень маленьким и спартанским образов на основе Alpine Linux. Мы можем запустить его в интерактивном режиме, чтобы попасть в оболочку. Наша цель - добавить файл « yeah», содержащий текст «it works!». В корневой каталог, а затем создать новое изображение из него, называемое «да-альпийское».
Вот так. Приятно, мы уже в корневом каталоге. Посмотрим, что там.
Какой редактор доступен? Нет vim, нет nano?
Ну что ж. Мы просто хотим создать файл:
Я вышел из интерактивной оболочки, и я вижу контейнер с именем «vibrant_spenc» с docker ps -all . Флаг -all важен, потому что контейнер больше не работает.
Здесь я создаю новый образ из контейнера «vibrate_spence». Я добавил сообщение о фиксации «mine, mine, mine» в качестве отметки.
Давайте посмотрим. Да, есть новый образ, и в его истории вы можете увидеть новый слой с комментарием «mine, mine, mine».
Теперь для настоящего теста. Удалим контейнер и создадим новый контейнер из образа. Ожидаемый результат заключается в том, что файл «yeah» будет присутствовать в новом контейнере.
Что я могу сказать? Да, это работает!
Использование DockerfileСоздание образов из модифицированных контейнеров классно, но нет ответственности. Трудно отслеживать изменения и знать, каковы были конкретные изменения. Дисциплинированный способ создания образов состоит в их создании с помощью Dockerfile.
Dockerfile - текстовый файл, похожий на сценарий оболочки, но он поддерживает несколько команд. Каждая команда, которая модифицирует файловую систему, создает новый слой. В первой части мы обсудили важность правильного разделения образа на слои. Dockerfile - большая тема сама по себе.
Здесь я просто продемонстрирую пару команд для создания другого образа «oh-yeah-alpine» на основе Dockerfile. В дополнение к созданию печально известного файла «yeah», давайте также установим vim. В альпийском дистрибутиве Linux используется система управления пакетами под названием «apk». Вот наш Dockerfile:
Базовым образом является alpine. Он копирует файл «yeah» из одного и того же каталога хоста, где находится файл Dockerfile (путь контекста сборки). Затем он выполняет apk update и устанавливает vim. Наконец, он устанавливает команду, которая выполняется при запуске контейнера. В этом случае он выведет на экран содержимое файла « yeah».
ОК. Теперь, когда мы знаем, к чему мы стремимся, давайте построим наш орбраз. Параметр «-t» задает репозиторий. Я не указал тег, поэтому он будет по умолчанию «последним».
Выглядит неплохо. Давайте проверим, что образ был создан:
Обратите внимание, что установка vim и его зависимостей раздула размер контейнера с 4,8 Мбайт базового альпийского образа до массивных 30,5 МБ!
Все очень хорошо. Но работает ли это?
О да, это работает!
Если вы все еще подозрительны, давайте перейдем в контейнер и откроем файл «yeah» с помощью нашего недавно установленного vim.
Контекст сборки и файл .dockerignoreЯ не сказал вам, но изначально, когда я пытался построить oh-yeah-alpine образ, он просто висел в течение нескольких минут. Проблема в том, что я просто поместил Dockerfile в свой домашний каталог. Когда Docker создает образ, он сначала упаковывает весь каталог, в котором находится Dockerfile (включая подкаталоги), и делает его доступным для команд COPY в Dockerfile.
Docker не пытается быть умным и анализирует ваши команды COPY. Он просто собирает все это. Обратите внимание, что содержимое сборки не будет заканчиваться вашим образом, но это замедлит вашу команду сборки, если ваш контекст сборки излишне большой.
В этом случае я просто скопировал Dockerfile и «yeah» в подкаталог и выполнил команду сборки docker в этом подкаталоге. Но иногда у вас есть сложное дерево каталогов, из которого вы хотите скопировать определенные подкаталоги и файлы и игнорировать другие. Используйте файл .dockerignore.
Этот файл позволяет вам точно контролировать, что входит в контекст сборки. Мой любимый трюк заключается в том, чтобы сначала исключить все, а затем начать включать в себя части, которые мне нужны. Например, в этом случае я мог бы создать следующий файл .dockerignore и сохранить файл Docker и «yeah» в моем домашнем каталоге:
В контексте сборки нет необходимости включать сам файл Dockerfile или файл «.dockerignore».
Копирование против монтажаКопирование файлов в образ иногда требуется вам, но в других случаях вы можете захотеть, чтобы ваши контейнеры были более динамичными и работали с файлами на хосте. Именно здесь вступают в силу тома и монтаж файловой системы.
Монтаж хост-каталогов - это другая игра с мячом. Данные принадлежат хосту, а не контейнеру. Данные могут быть изменены, когда контейнер остановлен. Один и тот же контейнер можно запустить с установленными разными каталогами хоста.
Тегирование образовМаркировка образов очень важна, если вы разрабатываете систему на основе микросервисов и генерируете много образов, которые иногда должны быть связаны друг с другом. Вы можете добавить образу столько меток, сколько хотите.
Вы уже видели по умолчанию «latest» тег. Иногда имеет смысл добавлять другие теги, такие как «tested», «release-1.4» или git коммит, соответствующий этому образу.
Вы можете пометить образ во время сборки или позже. Вот как добавить тег к существующему образу. Обратите внимание, что, хотя он называется тегом, вы также можете назначить новый репозиторий.
Вы также можете отменить тег удаляя образ по имени своего тега. Это немного страшно, потому что если вы удаляете последний тег случайно, вы теряете образ. Но если вы создаете образы из Dockerfile, вы можете просто его пересобрать.
Если я попытаюсь удалить последний оставшийся помеченный образ, я получаю сообщение об ошибке, потому что он используется контейнером.
Но если я удалю контейнер .
Ага. Он исчез. Но не волнуйся. Мы можем его пересобрать:
Верно, он вернулся. Dockerfile помог!
Работа с реестрами образов
Образы очень похожи в некоторых отношениях на git-хранилища. Они также построены из упорядоченного набора коммитов. Вы можете думать о двух образах, которые используют те же базовые образы, как о ветках в git (хотя в Docker нет слияния или перезагрузки). Реестр образов является эквивалентом центрального сервиса git-хостинга, такого как GitHub. Угадайте, как называется официальный реестр образов Docker? Правильно, Docker Hub.
Вытягивание образовКогда вы запускаете образ, если он не существует, Docker попытается вытащить его из одного из ваших настроенных реестров образов. По умолчанию он переходит в Docker Hub, но вы можете управлять этим в файле «
/.docker/config.json». Если вы используете другой реестр, вы можете следовать их инструкциям, которые обычно включают вход с использованием их учетных данных.
Удалим образ «hello world» и снова вытащим его с помощью команды docker pull .
Он исчез. Теперь вытаскиваем.
Последний hello-world был заменен более новой версией.
Выгрузка образовВыгрузка образов немного более сложная. Сначала вам нужно создать учетную запись на Docker Hub (или другом реестре). Затем вы входите в систему. Затем вам нужно пометить образ, который вы хотите выложить, в соответствии с именем вашей учетной записи («g1g1» в моем случае).
Теперь я могу выложить образ помеченный, тегом g1g1/hello-world.
Вывод
Образы Docket - это шаблоны для ваших контейнеров. Они разработаны для того, чтобы быть эффективными и предлагать максимальное повторное использование, используя драйвер хранения файловой системы наложения.
Docker предоставляет множество инструментов для регистрации, проверки, создания и маркировки образов. Вы можете загружать и перемещать образы в реестры образов, такие как Docker Hub, для простого управления и обмена образами.