Как запустить файл docker

Обновлено: 21.11.2024

Как мы видели в главе «Пошаговое руководство по Docker», общий рабочий процесс Docker выглядит следующим образом:

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

В пошаговом руководстве мы использовали очень простой подход: просто запустили контейнер в интерактивном режиме, выполнили нужные команды (например, "apt-get install" и "pip install"), а затем зафиксировали контейнер в новом образе.

В этой главе мы рассмотрим более надежный способ создания образа. Вместо того, чтобы просто запускать команды и добавлять файлы с помощью таких инструментов, как wget, мы поместим наши инструкции в специальный файл, который называется Dockerfile. Dockerfile по своей концепции аналогичен рецептам и манифестам, которые можно найти в инструментах автоматизации инфраструктуры (IA), таких как Chef или Puppet.

В целом, Dockerfile намного проще, чем инструменты IA, и состоит из одного файла с DSL с несколькими инструкциями. Формат выглядит следующим образом:

В следующей таблице приведены инструкции. многие из этих параметров сопоставляются непосредственно с параметром в команде «docker run»:

Команда Описание
ДОБАВИТЬ Копирует файл из хост-системы в контейнер
CMD Команда, которая запускается при запуске контейнера
ENTRYPOINT
ENV Устанавливает переменную среды в новом контейнере
EXPOSE Открывает порт для связанных контейнеров
FROM Базовый образ для использования в сборке. Это обязательно и должно быть первой командой в файле.
MAINTAINER Необязательное значение для сопровождающего скрипта
ONBUILD Команда, которая запускается, когда образ в Dcokerfile используется в качестве основы для другого образа
RUN Выполняет команду и сохраняет результат как новый слой
ПОЛЬЗОВАТЕЛЬ Устанавливает пользователя по умолчанию в контейнере
VOLUME Создает общий том, который может совместно использоваться контейнерами или хост-компьютером
WORKDIR< /td> Установить рабочий каталог по умолчанию для контейнера

После того как вы создали Dockerfile и добавили все свои инструкции, вы можете использовать его для создания образа с помощью команды docker build. Формат этой команды:

Команда build создает новый образ, который можно запустить с помощью docker run , как и любой другой образ. Каждая строка в Dockerfile будет соответствовать слою в истории коммитов образов.

Пример создания образа из Dockerfile

Возможно, лучший способ понять Dockerfile — это изучить пример. Давайте посмотрим на пример, который мы рассмотрели в нашей обзорной главе, и объединим его в Dockerfile:

Как видите, это довольно просто: мы начинаем с «ubuntu:latest», устанавливаем зависимости с помощью команды RUN, добавляем наш файл кода с помощью команды ADD, а затем устанавливаем каталог по умолчанию для запуска контейнера. Когда у нас есть сам Dockerfile, мы можем создать образ с помощью docker build , например:

Флаг "-t" добавляет тег к образу, чтобы он получил красивое имя репозитория и тег. Также не последний «.», который говорит Docker использовать Dockerfile в текущем каталоге. Как только вы начнете сборку, вы увидите, как она какое-то время устанавливает вещи, а когда она завершится, у вас будет совершенно новый образ. Запуск истории Docker покажет вам влияние каждой команды на общий размер файла:

Наконец, вы можете запустить сам контейнер с помощью следующей команды:

Обратите внимание, что в этом примере мы запускаем приложение Flask непосредственно при запуске контейнера, а не просто запускаем оболочку bash и запускаем ее, как в других примерах.

Dockerfiles и автоматизация инфраструктуры (IA)

Файлы Docker представляют собой относительно простой способ создания базового образа. И, поскольку вы можете использовать команду FROM для объединения файлов Docker во все более сложные образы, вы можете сделать довольно много, даже с минимальным (освежающим!) набором команд Docker. Но если у вас уже есть существующий инструмент IA (и вы должны!), такой как Chef, Puppet, Ansible, Salt, очень маловероятно, что вы можете или даже должны переписать все. Итак, если вы оказались в такой ситуации, что вы можете сделать?

В оставшейся части этого руководства мы будем работать с простым диспетчером списков задач, работающим на Node.js. Если вы не знакомы с Node.js, не волнуйтесь. Опыт работы с JavaScript не требуется.

На данный момент ваша команда разработчиков совсем небольшая, и вы просто создаете приложение, чтобы подтвердить свой MVP (минимально жизнеспособный продукт).Вы хотите показать, как это работает и на что способно, не задумываясь о том, как это будет работать для большой команды, нескольких разработчиков и т. д.

Скачать приложение

Прежде чем мы сможем запустить приложение, нам нужно загрузить его исходный код на наш компьютер. Для реальных проектов вы обычно клонируете репозиторий. Но для этого руководства мы создали ZIP-файл, содержащий приложение.

Загрузить содержимое приложения. Вы можете либо извлечь весь проект, либо загрузить его в виде ZIP-файла и извлечь папку приложения, чтобы начать работу.

После извлечения откройте проект в своем любимом редакторе кода. Если вам нужен редактор, вы можете использовать Visual Studio Code. Вы должны увидеть package.json и два подкаталога ( src и spec ).

Создайте образ контейнера приложения

Чтобы собрать приложение, нам нужно использовать Dockerfile. Dockerfile — это просто текстовый сценарий инструкций, который используется для создания образа контейнера. Если вы уже создавали Dockerfiles раньше, вы можете заметить несколько недостатков в Dockerfile ниже. Но не волнуйтесь. Мы рассмотрим их.

Создайте файл Dockerfile в той же папке, что и файл package.json, со следующим содержимым.

Убедитесь, что файл Dockerfile не имеет расширения, например .txt . Некоторые редакторы могут добавлять это расширение файла автоматически, что приведет к ошибке на следующем шаге.

Если вы еще этого не сделали, откройте терминал и перейдите в каталог приложения с Dockerfile . Теперь создайте образ контейнера с помощью команды сборки docker.

Эта команда использовала Dockerfile для создания нового образа контейнера. Вы могли заметить, что было загружено много «слоев». Это потому, что мы указали сборщику, что хотим начать с образа node:12-alpine. Но поскольку на нашей машине этого не было, нужно было скачать этот образ.

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

Наконец, флаг -t помечает наше изображение. Думайте об этом просто как о понятном человеку имени для конечного изображения. Так как мы назвали образ «getting-start», мы можем ссылаться на него при запуске контейнера.

. в конце команды сборки docker сообщает, что Docker должен искать Dockerfile в текущем каталоге.

Запустите контейнер приложения

Теперь, когда у нас есть изображение, давайте запустим приложение. Для этого мы воспользуемся командой запуска docker (помните ее ранее?).

Запустите свой контейнер с помощью команды docker run и укажите имя только что созданного образа:

Помните флаги -d и -p? Мы запускаем новый контейнер в «отключенном» режиме (в фоновом режиме) и создаем сопоставление между портом 3000 хоста и портом 3000 контейнера. Без сопоставления портов мы не сможем получить доступ к приложению.

Добавьте один или два элемента и убедитесь, что они работают так, как вы ожидаете. Вы можете пометить элементы как выполненные и удалить элементы. Ваш интерфейс успешно сохраняет элементы в бэкенде. Довольно быстро и легко, да?

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

Если вы быстро взглянете на панель управления Docker, то увидите, что два ваших контейнера уже запущены (это руководство и только что запущенный контейнер приложения).

Подведение итогов

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

Далее мы собираемся внести изменения в наше приложение и узнать, как обновить наше работающее приложение новым изображением. Попутно мы изучим еще несколько полезных команд.

На этой странице вы создаете простое веб-приложение Python, работающее в Docker Compose. Приложение использует фреймворк Flask и поддерживает счетчик посещений в Redis. Хотя в примере используется Python, представленные здесь концепции должны быть понятны, даже если вы не знакомы с ним.

Предпосылки

Убедитесь, что вы уже установили Docker Engine и Docker Compose. Вам не нужно устанавливать Python или Redis, так как оба они предоставляются образами Docker.

Шаг 1. Настройка

Определить зависимости приложения.

Создайте каталог для проекта:

Создайте файл app.py в каталоге вашего проекта и вставьте его в:

В этом примере redis — это имя хоста контейнера redis в сети приложения. Мы используем порт по умолчанию для Redis, 6379 .

Обработка временных ошибок

Обратите внимание на то, как написана функция get_hit_count. Этот базовый цикл повтора позволяет нам несколько раз выполнить запрос, если служба Redis недоступна. Это полезно при запуске, когда приложение подключается к сети, но также делает наше приложение более устойчивым, если службу Redis необходимо перезапустить в любое время в течение жизненного цикла приложения. В кластере это также помогает справляться с мгновенными разрывами соединения между узлами.

Создайте еще один файл с именем requirements.txt в каталоге вашего проекта и вставьте его в:

Шаг 2. Создайте Dockerfile

На этом шаге вы пишете Dockerfile, который создает образ Docker. Образ содержит все зависимости, необходимые приложению Python, включая сам Python.

В каталоге проекта создайте файл с именем Dockerfile и вставьте следующее:

Это указывает Docker:

  • Создайте образ, начиная с образа Python 3.7.
  • Установите рабочий каталог /code .
  • Установите переменные среды, используемые командой flask.
  • Установите gcc и другие зависимости
  • Скопируйте файл requirements.txt и установите зависимости Python.
  • Добавьте метаданные к изображению, чтобы описать, что контейнер прослушивает порт 5000.
  • Скопируйте текущий каталог. в проекте в рабочий каталог. на картинке.
  • Установите команду по умолчанию для запуска контейнера.

Дополнительную информацию о том, как создавать файлы Dockerfile, см. в руководстве пользователя Docker и справочнике по файлам Docker.

Шаг 3. Определите сервисы в файле Compose

Создайте файл с именем docker-compose.yml в каталоге вашего проекта и вставьте следующее:

Этот файл Compose определяет две службы: web и Redis .

Веб-сервис

Веб-служба использует образ, созданный из файла Dockerfile в текущем каталоге. Затем он привязывает контейнер и хост-компьютер к открытому порту 8000. В этом примере службы используется порт по умолчанию для веб-сервера Flask — 5000 .

Служба Redis

Служба Redis использует общедоступный образ Redis, извлеченный из реестра Docker Hub.

Шаг 4. Создайте и запустите приложение с помощью Compose

Из каталога проекта запустите приложение, запустив docker-compose up .

Compose извлекает образ Redis, создает образ для вашего кода и запускает определенные вами службы. В этом случае код статически копируется в образ во время сборки.

В браузере должно появиться сообщение:

Обновите страницу.

Число должно увеличиваться.

Переключитесь в другое окно терминала и введите docker image ls, чтобы вывести список локальных образов.

Список изображений на этом этапе должен возвращать redis и web .

Вы можете проверять изображения с помощью docker inspect .

Остановите приложение, либо запустив команду docker-compose из каталога проекта во втором терминале, либо нажав CTRL+C в исходном терминале, где вы запустили приложение.

Шаг 5. Отредактируйте файл Compose, чтобы добавить монтирование привязки

Отредактируйте файл docker-compose.yml в каталоге вашего проекта, чтобы добавить привязку монтирования для веб-службы:

Новый ключ томов монтирует каталог проекта (текущий каталог) на хосте в /code внутри контейнера, что позволяет изменять код на лету без необходимости перестраивать образ. Ключ среды устанавливает переменную среды FLASK_ENV, которая указывает запуску flask запускаться в режиме разработки и перезагружать код при изменении. Этот режим следует использовать только в процессе разработки.

Шаг 6. Повторно создайте и запустите приложение с помощью Compose

В каталоге проекта введите docker-compose up, чтобы создать приложение с обновленным файлом Compose, и запустите его.

Снова проверьте сообщение Hello World в веб-браузере и обновите страницу, чтобы увидеть увеличение счетчика.

  • Если ваш проект находится за пределами каталога Users ( cd ~ ), вам необходимо предоставить общий доступ к диску или расположению файла Dockerfile и тома, которые вы используете. Если вы получаете ошибки во время выполнения, указывающие на то, что файл приложения не найден, монтирование тома отклонено или служба не может запуститься, попробуйте включить общий доступ к файлам или дискам.Для подключения тома требуются общие диски для проектов, находящихся за пределами C:\Users (Windows) или /Users (Mac), а также для любого проекта в Docker Desktop для Windows, использующего контейнеры Linux. Дополнительные сведения см. в разделе Общий доступ к файлам в Docker для Mac и общие примеры управления данными в контейнерах.

  • Если вы используете Oracle VirtualBox в более старой ОС Windows, вы можете столкнуться с проблемой с общими папками, как описано в этой заявке VB. Более новые системы Windows соответствуют требованиям Docker Desktop для Windows и не нуждаются в VirtualBox.

Шаг 7. Обновите приложение

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

Измените приветствие в app.py и сохраните его. Например, измените Hello World! сообщение Привет от Докера! :

Обновите приложение в браузере. Приветствие должно быть обновлено, а счетчик по-прежнему должен увеличиваться.

Шаг 8. Поэкспериментируйте с некоторыми другими командами

Если вы хотите запускать свои службы в фоновом режиме, вы можете передать флаг -d (для «отключенного» режима) для docker-compose up и использовать docker-compose ps, чтобы увидеть, что в данный момент выполняется:

Команда запуска docker-compose позволяет запускать одноразовые команды для ваших служб. Например, чтобы узнать, какие переменные среды доступны для веб-службы:

См. docker-compose --help, чтобы увидеть другие доступные команды. Вы также можете установить автозавершение команд для оболочек bash и zsh, которое также покажет вам доступные команды.

Если вы запустили Compose с помощью docker-compose up -d , остановите свои службы, как только закончите с ними:

Вы можете отключить все, полностью удалив контейнеры, с помощью команды down. Передайте --volumes, чтобы также удалить том данных, используемый контейнером Redis:

Следующий пост является последним в серии руководств по использованию Docker и связанных инструментов контейнеров. Раз в две недели проверяйте наличие нового выпуска.

С помощью образа Docker можно не только развертывать один контейнер за другим, но и довольно просто. После извлечения образа из реестра (например, из Docker Hub) каждый контейнер можно развернуть с помощью одной команды docker. Но что происходит, когда вам приходится развертывать множество контейнеров (каждый для разных целей) из одного и того же образа? Внезапно управление этими контейнерами может стать немного громоздким.

Скажем, вы загружаете последний образ Ubuntu для разработки. Прежде чем приступить к разработке с помощью этого контейнера, необходимо внести ряд изменений в образ (например, обновить программное обеспечение и добавить необходимые пакеты разработки для текущей работы).

Для этого вы можете вручную отредактировать каждое изображение по мере необходимости (создав новое изображение для каждого необходимого варианта темы) или создать Dockerfile для каждого варианта. После того, как вы создали свой Dockerfile, вы можете быстро создавать один и тот же образ снова и снова, не тратя время на то, чтобы делать это вручную. Тщательно созданные файлы Dockerfile могут значительно сэкономить ваше время и усилия.

Я хочу показать вам процесс создания Dockerfile. Я продемонстрирую, используя последний образ Ubuntu, обновлю и обновлю этот образ, а затем установлю необходимый для сборки пакет. Это будет довольно простой файл Dockerfile, но вы сможете легко его использовать.

Основы Dockerfile

  • ADD копирует файлы из источника на хосте в собственную файловую систему контейнера в указанном месте назначения.
  • CMD можно использовать для выполнения определенной команды внутри контейнера.
  • ENTRYPOINT устанавливает приложение по умолчанию, которое будет использоваться каждый раз при создании контейнера с образом.
  • ENV устанавливает переменные среды.
  • EXPOSE связывает определенный порт, чтобы обеспечить сетевое взаимодействие между контейнером и внешним миром.
  • FROM определяет базовый образ, используемый для запуска процесса сборки.
  • MAINTAINER определяет полное имя и адрес электронной почты создателя образа.
  • RUN — это основная исполнительная директива для файлов Dockerfile.
  • USER задает UID (или имя пользователя), который должен запускать контейнер.
  • VOLUME используется для включения доступа из контейнера к каталогу на хост-компьютере.
  • WORKDIR устанавливает путь, по которому должна выполняться команда, определенная с помощью CMD.
  • LABEL позволяет добавить метку к образу Docker.

Для работы Dockerfile требуются не все ключевые слова.Например, в нашем примере будут использоваться только команды FROM, MAINTAINER и RUN.

Создание Dockerfile

Прежде чем мы создадим Dockerfile, нам нужно создать новый каталог для работы. Мы создадим каталог dockerbuild с помощью команды:

Это рекомендуемый рабочий процесс для создания собственного образа Docker для вашего приложения:

  • Создайте Dockerfile для своего приложения.
  • Создайте образ с помощью команды docker build.
  • Разместите образ Docker в реестре.
  • Извлеките и запустите образ на целевой машине.

Записать Dockerfile

Docker автоматически создает образы, считывая инструкции из Dockerfile. Это текстовый файл, содержащий все команды, необходимые для создания данного изображения. В этом примере мы создадим и запустим учебное приложение Hello ZED в контейнере.

Сначала подготовим хост с кодом:

Мы предоставляем CMake дополнительные аргументы, чтобы гарантировать, что CMake и GCC смогут найти все необходимые библиотеки CUDA. Мы также указываем компилятору разрешить компоновку, даже если есть неопределенные символы из таких библиотек, как nvcuvid, которые еще недоступны. Они будут доступны во время выполнения с помощью набора инструментов NVIDIA для контейнеров.

Дополнительную информацию о написании файлов dockerfile см. в справочной документации по Dockerfile.

Создайте образ Docker

Теперь, когда вы создали Dockerfile, пришло время собрать образ с помощью команды docker build.

Советы. На NVIDIA Jetson мы рекомендуем создавать контейнер Jetson Docker Container на хосте x86 и запускать его на целевом Jetson, чтобы избежать длительного времени компиляции на таких платах, как Jetson Nano.

Проверьте свое изображение

Давайте запустим контейнер на основе нового образа, который мы создали с помощью команды docker run.

В Jetson или более ранних версиях Docker используйте следующие аргументы:

Теперь вы должны увидеть вывод терминала.

Оптимизируйте размер изображения

Образы Docker могут стать очень большими и стать проблемой при загрузке по сети или на устройствах с ограниченным объемом памяти (таких как Jetson Nano). Вот несколько советов, как уменьшить размер изображения:

Сведите к минимуму количество команд RUN. Каждая команда добавляет слой в образ, поэтому объединение количества RUN может уменьшить количество слоев в конечном образе. Обратите внимание, что слои предназначены для многократного использования и не будут перемещены или извлечены, если они не изменились.

Используйте --no-install-recommends при установке пакетов с помощью apt-get install, чтобы отключить установку дополнительных пакетов и сэкономить место на диске.

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

Аналогично очистите списки пакетов, загруженных с помощью обновления apt-get, удалив /var/lib/apt/lists/* на том же шаге RUN.

Создавайте отдельные образы для разработки и производства. Рабочие образы не должны включать все библиотеки и зависимости, полученные при сборке.

Используйте многоэтапные сборки (см. документацию по Docker) и отправляйте только свой рабочий образ.

Разместите образ Docker

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

Использовать реестр Docker Hub

По умолчанию Docker предоставляет официальный бесплатный реестр DockerHub, куда вы можете отправлять и получать свои образы. Например, в Stereolabs образы ZED SDK Docker создаются автоматически с помощью общедоступного задания Gitlab CI и помещаются в репозиторий Stereolabs DockerHub.

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

Использовать локальный сервер реестра

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

Дополнительную информацию о развертывании собственного сервера реестра см. в документации по Docker.

Сохранение и загрузка изображений как файлов

Наконец, также можно экспортировать и загружать образ Docker в виде файла.

Чтобы экспортировать образ Docker, просто используйте:

На целевом компьютере просто загрузите образ Docker, используя:

Дальнейшие шаги

К этому моменту вы успешно создали образ Docker для приложения «Hello ZED» и узнали, как разместить его и поделиться им.

Давайте узнаем, как запускать и собирать контейнеры Jetson Docker на платформе x86, чтобы ускорить разработку и развертывание на встроенных платах, таких как Jetson Nano, без необходимости кросс-компиляции.

Читайте также: