Какой уровень виртуализации использует docker когда создает контейнер
Перейти к содержимому

Какой уровень виртуализации использует docker когда создает контейнер

  • автор:

Обзор контейнеров Docker

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

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

Что такое Docker Container?

Прежде чем обсуждать, что такое Docker Container , нам нужно сделать шаг назад и рассказать о том, что такое Docker . Docker — это платформа с открытым исходным кодом для разработчиков. С помощью Docker приложение может быть упаковано, со всеми его зависимостями, в виде контейнеров. Благодаря этой системе каждое приложение может работать в изолированной среде: каждый контейнер независим и содержит приложение с его зависимостями и библиотеками. Таким образом, приложения не будут мешать друг другу, и разработчик может работать над каждым из них независимо. Docker Container также важны и полезны, когда речь идет о командной работе.

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

Архитектура Docker

Docker использует клиент-серверную архитектуру, которая работает со следующими «кирпичиками»:

  • Docker Daemon : он слушает запросы клиента Docker и управляет объектами, такими как контейнеры и образы, тома и сети.
  • Клиент Docker : с помощью него пользователь взаимодействует с платформой Docker .
  • Docker hub: это реестр (реестры хранят образы, см. ниже), который является публичным, то есть любой пользователь Docker может получить к нему доступ и искать в нем образы. По умолчанию Docker будет искать образы в Docker Hub, но вы также можете настроить и использовать частный реестр.
  • Docker образы: это шаблоны для создания контейнеров. Образы контейнеров могут быть основаны на других образах контейнеров с некоторой доработкой. Кроме использования образов, созданных другими пользователями и доступных в публичных реестрах, вы можете создавать свои образы и хранить их в своем частном реестре или делиться ими в публичном реестре.
  • Docker контейнеры: это запускаемые экземпляры образов контейнеров. Каждый запущенный контейнер хорошо изолирован от всех остальных, но вы также можете собрать их для создания своего приложения. Контейнеры можно рассматривать как изолированные запущенные программы или как строительные блоки одного и того же приложения.

Теперь, когда вы знаете, что все является и делает, вы можете лучше понять архитектуру Docker : у нас есть клиент Docker , который «разговаривает» с демоном Docker Daemon, который занимается созданием и запуском Docker Container s. Клиент Docker, в частности, взаимодействует с Docker Daemon , используя REST API через сетевой интерфейс или UNIX сокеты. Один Docker Client может взаимодействовать с несколькими Docker Daemon .

Зачем нам нужен контейнер Docker?

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

До контейнеризации

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

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

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

Контейнеризация

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

В отличие от виртуальных машин, контейнеры более эффективны, поскольку:

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

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

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

В то время как в случае с виртуальными машинами структура будет следующей:

  • ядро операционной системы хоста;
  • (отдельная) гостевая операционная система для каждого из приложений;
  • различные приложения с их библиотеками и зависимостями.

Как мы уже говорили, основное различие между этими двумя системами заключается в отсутствии гостевой операционной системы в модели Containerization, что делает всю разницу.

Преимущества Docker

Docker Container — это платформа, которая позволяет использовать контейнеризацию в том виде, в котором мы ее описали. Если бы нам пришлось собрать воедино все преимущества, которыми она обладает для разработчиков, они были бы следующими.

Изолированная среда и несколько контейнеров

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

Скорость развертывания

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

Гибкость и масштабируемость

Docker Container значительно упрощает процесс внесения изменений в ваши приложения. Это связано с тем, что когда вам нужно вмешаться в какое-либо приложение, вы можете просто обратиться к его контейнеру, и это никак не повлияет на все остальные. Командный инструмент Docker Compose (см. следующий параграф) повышает гибкость и масштабируемость так, как ни один другой подход к разработке приложений.

Переносимость

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

Безопасность

Контейнеры Docker повышают безопасность, потому что:

  • Одно приложение (и его возможные проблемы) не влияет на другие.
  • Разработчик имеет полный контроль над трафиком.
  • Каждому запущенному контейнеру выделяется отдельный набор ресурсов.
  • Приложение не может получить доступ к данным другого приложения без авторизации.

Что такое Docker Compose?

Docker Compose — это команда Docker, которая выводит «мощь» Docker и контейнеризации на другой уровень. С помощью этого инструмента процесс разработки приложений может стать намного быстрее и проще. Инструмент Docker Compose — это инструмент командной строки, и его работа заключается в том, что он берет несколько контейнеров и собирает их в приложение. Затем приложение может быть запущено на одном хосте.

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

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

Шаги к использованию контейнера Docker

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

  1. Как создавать и запускать контейнеры
  2. Как развертывать приложения
  3. Как запустить приложение с помощью Docker Compose

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

Запустите учебник

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

Docker run -d -p 80:80 docker/getting-started

Есть несколько вещей, которые можно узнать, только взглянув на эту команду:

  • «-» запускает контейнер в фоновом режиме;
  • -p 80:80 сопоставляет порт 80 на хосте с портом 80 на контейнере;
  • docker/getting-started указывает используемый образ.

Понять приборную панель

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

Контейнер Docker: требуются ли знания в области разработки приложений?

Использование Docker, его контейнера и инструмента Docker Compose требует определенных знаний языков программирования, фреймворков и архитектуры. Docker может облегчить этот процесс, но только для тех, кто уже знаком с программированием и развертыванием приложений. Однако для начинающих разработчиков или тех, кто ищет максимально простой способ развертывания приложений, существует достойная альтернатива: разработка программного обеспечения без кода и AppMaster .

AppMaster по сути, это ведущая мировая платформа no-code , которая позволяет создать веб-приложение, мобильное приложение и бэкенд без написания кода вручную. AppMaster предоставит строительные блоки для вашего проекта, а также визуальный интерфейс, где вы сможете собрать их с помощью системы drag-and-drop . Пока вы создаете свое программное обеспечение таким образом, AppMaster будет автоматически создавать для вас исходный код. Исходный код доступен в любой момент, и его также можно экспортировать.

AppMaster ‘Строительные блоки программного обеспечения могут чем-то напоминать образы Docker, но они дают вам то ценное преимущество, что их можно собрать вообще без написания исходного кода. AppMaster может быть более подходящей платформой для вас, если вы новичок.

Интересный факт AppMaster также использует контейнер docker. По умолчанию все клиентские приложения автоматически размещаются на AppMaster в изолированных Docker Container s. Обычно, когда клиент нажимает кнопку публикации, менее чем за 30 секунд AppMaster генерирует исходный код, компилирует, тестирует и упаковывает его в Docker Container . Платформа отправляет этот Docker Container в локальный AppMaster ‘s docker, хаб, который находится в платформе. AppMaster , используемый Harbor , является решением с открытым исходным кодом. После этого AppMaster отправляет команду на целевой сервер, чтобы тот подхватил этот контейнер и запустил его.

Заключение

Docker — важный инструмент в руках разработчиков. Как мы видели, он устраняет многие ограничения, которые были присущи более старому подходу с использованием виртуальных машин. Тем не менее, это все еще метод, подходящий для экспертов-разработчиков: в конце концов, хотя вы можете использовать шаблоны и образы, вам все равно нужно писать код, чтобы делать многие вещи в рамках платформы Docker. Если вы ищете более простую альтернативу, если вы хотите вообще избежать написания кода, AppMaster и подход no-code — идеальное решение для вас.

Понимая Docker

Докер — это открытая платформа для разработки, доставки и эксплуатации приложений. Docker разработан для более быстрого выкладывания ваших приложений. С помощью docker вы можете отделить ваше приложение от вашей инфраструктуры и обращаться с инфраструктурой как управляемым приложением. Docker помогает выкладывать ваш код быстрее, быстрее тестировать, быстрее выкладывать приложения и уменьшить время между написанием кода и запуска кода. Docker делает это с помощью легковесной платформы контейнерной виртуализации, используя процессы и утилиты, которые помогают управлять и выкладывать ваши приложения.

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

  • упаковывание вашего приложения (и так же используемых компонент) в docker контейнеры;
  • раздача и доставка этих контейнеров вашим командам для разработки и тестирования;
  • выкладывания этих контейнеров на ваши продакшены, как в дата центры так и в облака.

Для чего я могу использовать docker?

Быстрое выкладывание ваших приложений

Docker прекрасно подходит для организации цикла разработки. Docker позволяет разработчикам использовать локальные контейнеры с приложениями и сервисами. Что в последствии позволяет интегрироваться с процессом постоянной интеграции и выкладывания (continuous integration and deployment workflow).

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

Более простое выкладывание и разворачивание

Основанная на контейнерах docker платформа позволят легко портировать вашу полезную нагрузку. Docker контейнеры могут работать на вашей локальной машине, как реальной так и на виртуальной машине в дата центре, так и в облаке.

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

Высокие нагрузки и больше полезных нагрузок

Docker легковесен и быстр. Он предоставляет устойчивую, рентабельную альтернативу виртуальным машинам на основе гипервизора. Он особенно полезен в условиях высоких нагрузок, например, при создания собственного облака или платформа-как-сервис (platform-as-service). Но он так же полезен для маленьких и средних приложений, когда вам хочется получать больше из имеющихся ресурсов.

Главные компоненты Docker

  • Docker: платформа виртуализации с открытым кодом;
  • Docker Hub: наша платформа-как-сервис для распространения и управления docker контейнерами.

Архитектура Docker

Docker использует архитектуру клиент-сервер. Docker клиент общается с демоном Docker, который берет на себя тяжесть создания, запуска, распределения ваших контейнеров. Оба, клиент и сервер могут работать на одной системе, вы можете подключить клиент к удаленному демону docker. Клиент и сервер общаются через сокет или через RESTful API.

Docker-демон

Как показано на диаграмме, демон за пускается на хост-машине. Пользователь не взаимодействует с сервером на прямую, а использует для этого клиент.

Docker-клиент

Docker-клиент, программа docker — главный интерфейс к Docker. Она получает команды от пользователя и взаимодействует с docker-демоном.

Внутри docker-а
  • образы (images)
  • реестр (registries)
  • контейнеры
Образы

Docker-образ — это read-only шаблон. Например, образ может содержать операционку Ubuntu c Apache и приложением на ней. Образы используются для создания контейнеров. Docker позволяет легко создавать новые образы, обновлять существующие, или вы можете скачать образы созданные другими людьми. Образы — это компонента сборки docker-а.

Реестр

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

Контейнеры

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

Так как же работает Docker?
  • можем создавать образы, в которых находятся наши приложения;
  • можем создавать контейнеры из образов, для запуска приложений;
  • можем распространять образы через Docker Hub или другой реестр образов.
Как работает образ?

Мы уже знаем, что образ — это read-only шаблон, из которого создается контейнер. Каждый образ состоит из набора уровней. Docker использует union file system для сочетания этих уровней в один образ. Union file system позволяет файлам и директориями из разных файловых систем (разным ветвям) прозрачно накладываться, создавая когерентную файловую систему.

Одна из причин, по которой docker легковесен — это использование таких уровней. Когда вы изменяете образ, например, обновляете приложение, создается новый уровень. Так, без замены всего образа или его пересборки, как вам возможно придётся сделать с виртуальной машиной, только уровень добавляется или обновляется. И вам не нужно раздавать весь новый образ, раздается только обновление, что позволяет распространять образы проще и быстрее.

В основе каждого образа находится базовый образ. Например, ubuntu, базовый образ Ubuntu, или fedora, базовый образ дистрибутива Fedora. Так же вы можете использовать образы как базу для создания новых образов. Например, если у вас есть образ apache, вы можете использовать его как базовый образ для ваших веб-приложений.

Примечание! Docker обычно берет образы из реестра Docker Hub.

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

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

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

Как работает docker реестр?

Реестр — это хранилище docker образов. После создания образа вы можете опубликовать его на публичном реестре Docker Hub или на вашем личном реестре.

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

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

Как работает контейнер?

Контейнер состоит из операционной системы, пользовательских файлов и метаданных. Как мы знаем, каждый контейнер создается из образа. Этот образ говорит docker-у, что находится в контейнере, какой процесс запустить, когда запускается контейнер и другие конфигурационные данные. Docker образ доступен только для чтения. Когда docker запускает контейнер, он создает уровень для чтения/записи сверху образа (используя union file system, как было указано раньше), в котором может быть запущено приложение.

Что происходит, когда запускается контейнер?

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

  • какой образ использовать для создания контейнера. В нашем случае ubuntu
  • команду которую вы хотите запустить когда контейнер будет запущен. В нашем случае /bin/bash

Что же происходит под капотом, когда мы запускаем эту команду?

  • скачивает образ ubuntu: docker проверяет наличие образа ubuntu на локальной машине, и если его нет — то скачивает его с Docker Hub. Если же образ есть, то использует его для создания контейнера;
  • создает контейнер: когда образ получен, docker использует его для создания контейнера;
  • инициализирует файловую систему и монтирует read-only уровень: контейнер создан в файловой системе и read-only уровень добавлен образ;
  • инициализирует сеть/мост: создает сетевой интерфейс, который позволяет docker-у общаться хост машиной;
  • Установка IP адреса: находит и задает адрес;
  • Запускает указанный процесс: запускает ваше приложение;
  • Обрабатывает и выдает вывод вашего приложения: подключается и логирует стандартный вход, вывод и поток ошибок вашего приложения, что бы вы могли отслеживать как работает ваше приложение.

Используемые технологии

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

Пространство имен(namespaces)

Docker использует технологию namespaces для организации изолированных рабочих пространств, которые мы называем контейнерами. Когда мы запускаем контейнер, docker создает набор пространств имен для данного контейнера.

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

  • pid: для изоляции процесса;
  • net: для управления сетевыми интерфейсами;
  • ipc: для управления IPC ресурсами. (ICP: InterProccess Communication);
  • mnt: для управления точками монтирования;
  • utc: для изолирования ядра и контроля генерации версий(UTC: Unix timesharing system).
Control groups (контрольные группы)

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

Union File System

Union File Sysem или UnionFS — это файловая система, которая работает создавая уровни, делая ее очень легковесной и быстрой. Docker использует UnionFS для создания блоков, из которых строится контейнер. Docker может использовать несколько вариантов UnionFS включая: AUFS, btrfs, vfs и DeviceMapper.

Почему вы должны обратить внимание на Docker?

Когда я гуглил информацию о фреймворках глубокого обучения (deep learning), я заметил, что почти каждый из этих фреймворков поддерживался Docker. В итоге у меня возник резонный вопрос: “А что это за Docker такой?”

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

Что такое «виртуальные машины» и «контейнеры»?

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

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

Основное различие между контейнерами и виртуальными машинами заключается в их архитектурном подходе.

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

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

Что такое Docker?

Docker отделяет код приложения от требований и потребностей вашей конкретной инфраструктуры, путем запуска каждого приложения в изолированной среде, называемой «контейнер».

Это означает, что разработчики могут сконцентрироваться на фактической работе с кодом, выполняемом в контейнере Docker, не беспокоясь о системе, на которой он в конечном итоге будет работать. А DevOps может сосредоточиться на том, чтобы убедиться, что в контейнере Docker установлены правильные программы, и уменьшить количество необходимых систем и сложность поддержания указанных систем после развертывания.

Так почему вы должны обратить внимание на Docker?

Каждый отдельный Docker-контейнер начинается с ванильного Linux, который “ничего не знает”.

Затем мы сообщаем контейнеру все зависимости, которые ему нужно загрузить и установить, чтобы запустить нужное приложение. Этот процесс выполняется с помощью Dockerfile .

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

Кроме того, Docker имеет следующие преимущества:

1. Простота в использовании: Docker значительно облегчает использование контейнеров кому бы то ни было (разработчикам, системным администраторам, архитекторам и другим) для быстрого создания и тестирования приложений. Это позволяет любому пользователю упаковать приложение на свой ноутбук, которое, в свою очередь, может работать без изменений в любом общедоступном облаке. Мантра гласит: «Построй один раз, запускай где угодно».

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

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

4. Модульность и масштабируемость: Docker позволяет легко разбить функциональность вашего приложения на отдельные контейнеры. Например, база данных Postgres может работать в одном контейнере, а сервер Redis — во втором, в то время как приложение Node.js находится в третьем. С помощью Docker стало проще связывать эти контейнеры вместе, для создания приложения, что упрощает масштабирование или независимое обновление компонентов в будущем.

Начало работы с Docker

Перейдите на официальный веб-сайт Docker. Если вы используете Windows 10 Home Edition — вам нужен Docker Toolbox.

Как только вам удастся установить Docker, давайте попробуем запустить на нем образ Ubuntu — подробнее об этом позже.

Docker позволяет вам загружать и использовать необходимые образы с Docker Hub, либо изменять загруженные образы и использовать их для создания новых образов.

Прежде чем мы начнем работать с Dockerfile, давайте удостоверимся, что установка завершена.

На рабочем столе найдите Docker Quickstart Terminal и запустите его.

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

Чтобы посмотреть образ, введите следующую команду:

И наконец, момент, которого вы так ждали — Hello, world в Docker

Dockerfile — там, где все начинается

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

Docker-образ состоит из read-only (только для чтения) слоёв, каждый из которых описывает какую-то Dockerfile инструкцию. Слои уложены друг на друга и каждый слой описывает какое-то изменение, которое должно быть выполнено с данными на запущенном контейнере.

Когда контейнер Docker запускается, ему нужно сказать, что делать, потому что в нем ничего не установлено.

Первое, что нужно Dockerfile — это базовый образ. Базовый образ сообщает контейнеру, что установить в качестве его ОС — Ubuntu, RHEL, SuSE, Node, Java и т.д.

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

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

Запускаем Ubuntu на Docker

Ниже приведены несколько примеров Dockerfiles, вместе с комментариями, разъясняющими каждую строчку и то, что происходит слой за слоем.

Сохраните этот файл как Dockerfile.

Теперь запустите Docker Quickstart Terminal и убедитесь, что текущая директория и место, в котором хранится Dockerfile, совпадают.

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

Теперь эта сборка образа будет называться ubuntu1.

Вы можете увидеть, что размер образа составляет всего 111 МБ, по сравнению с минимум 10 ГБ, которые мы выделяем при использовании виртуальной машины.

Также обратите внимание на то, что когда у нас нет тега -t при сборке, имя репозитория и тег отсутствуют. Поэтому, когда мы пытаемся использовать этот образ, мы должны помнить его IMAGE ID.

-t пишется в основном в формате repository:tag

Если вы забыли поставить тег, Docker по умолчанию помечает его как latest.

— rm гарантирует, что после того, как будет запущен контейнер, он будет немедленно удален после него

— it потому что мы хотим взаимодействовать с помощью терминала

Вы можете вводить все команды, которые вы обычно вводите в вашей системе Ubuntu, в этом терминале Docker.

Заключение

Я надеюсь, что теперь вы оснащены всеми необходимыми знаниями по Docker и способны реализовать весь потенциал этого невероятного инструмента!

Name already in use

Контейнер (Container) — стандартная единица ПО, в которую упаковывается приложение со всеми необходимыми для его полноценной работы зависимостями (кодом, средой запуска, библиотеками и настройками).

Сравнение контейнера и виртуальной машины

Будем называть хост-машиной (host machine) компьютер (сервер), ресурсы которого выделяются под контейнер или виртуальную машину.

Контейнерпроцесс или сервис, который напрямую запущен на хост-машине.

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

Виртуальная машина (Virtual Machine) — изолированная операционная подсистема на хост-машине.

С помощью виртуальной машины можно внутри Windows ОС запустить Linux и наоборот. Существует множество инструментов, чтобы работать с виртуальными машинами (например, Virtual Box).

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

Docker использует клиент-серверную архитектуру.

С клиента, который называется Docker-клиент (Docker client), поступают CLI-команды.

Клиент при помощи REST API передаёт команды серверу, который называется Docker-демон (Docker daemon).

Docker-демон собирает, запускает и раздаёт (distribute) контейнеры.

Этапы докеризации приложения

Dockerfile содержит инструкции (instructions) — последовательность действий, которые нужно выполнить, чтобы построить образ.

Простой пример Dockerfile для NodeJS-приложения.

Конкретные инструкции Dockerfile разобраны здесь.

Образ (Image) — доступный только для чтения шаблон с инструкциями о том, как запустить какой-то Docker-контейнер, содержащий внутри себя всё необходимое для выполнения этих инструкций.

Один образ может расширять другой.

Базовый образ (Base Image) — образ, который не имеет родительского образа.

Для построения образа используется команда docker build , которая принимает контекст (context) — путь к папке, с которой будет происходить работа в Dockerfile.

Образ строится на основании Dockerfile, который по умолчанию берётся из корня контекста.

Каждая инструкция в Dockerfile создаёт новый слой (layer) в образе.

Если Dockerfile лежит не в корне контекста, то можно явно указать путь к файлу.

Можно задать явное название образа.

Найти созданный образ можно среди других образов при помощи команды docker images .

Образы хранятся в Docker-реестре (Docker registry).

Одним из публичных реестров является Docker Hub. Он используется по умолчанию.

Создание и запуск контейнера

Контейнер (Container) — запускаемый экземпляр образа.

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

Флаг -d используется для запуска контейнера в фоновом режиме (in background), таким текущая консоль не будет занята контейнером и можно будет вводить в неё другие команды.

Можно также задать явное имя контейнеру при создании.

Команда docker run объединяет в себе две команды: docker create и docker start .

Для просмотра списка всех запущенных контейнеров и информации о них используется команда docker ps .

Для просмотра всех контейнеров (в том числе и незапущенных) используется флаг -a .

Если есть необходимость посмотреть, что лежит внутри запущенного контейнера, можно зайти в него при помощи команды docker exec .

Пример работы в интерактивном режиме.

Флаг -i отвечает за переход в интерактивный режим, флаг -t позволяет эмулировать терминал.

Для остановки контейнера используется команда docker stop .

Композиция нескольких контейнеров

Для написания приложения чаще всего не достаточно одного контейнера.

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

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

Чтобы было проще запускать композицию контейнеров, её шаги описывается в отдельном файле при помощи Docker Compose.

Хранение данных в Volume

Volume — предпочитительный механизм для хранения данных (persisting data), используемых в Docker-контейнере.

Volume даёт контейнеру доступ к какой-то локальной папке на хост-машине, на которой этот контейнер запущен. Файлы из Volume нельзя использовать на этапе сборки (build-time), то есть в Dockerfile нельзя использовать файлы из Volume, они доступны лишь во время выполнения (run-time).

Почему следует использовать Volume

  • Volume хранится вне контейнера, поэтому он не увеличивает размер контейнера и не подвержен влиянию жизненного цикла контейнера.

Использование образов с помощью FROM

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

Валидный Dockerfile должен содержать как минимум одну инструкцию FROM и она должна быть первой инструкцией в файле.

Для создания базового образа используется инструкция FROM scratch .

Копирование файлов с помощью ADD И COPY

Инструкция COPY позволяет скопировать локальный файл или папку с хост-машины в образ. Она принимает два параметра: относительный путь на хост-машине, откуда копировать, и абсолютный путь, по которому данные будут доступны в контейнере.

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

Если нет явной необходимости в ADD, лучше использовать COPY.

Запуск команд с помощью RUN и CMD

Инструкция RUN позволяет запускать команды внутри образа (image). Эти команды запускаются один раз во время сборки (build) и записываются в образ как новый слой (layer).

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

Таким образом, несмотря на то, что CMD является инструкцией Dockerfile, он запускается не во время сборки, а уже в запущенном контейнере. Чаще всего командой в CMD выступает запуск сервера.

Рабочая директория WORKDIR

Инструкция WORKDIR устанавливает рабочую директорию для инструкций RUN , CMD , COPY , ADD . Все действия, связанные с перечисленными инструкциями, будут происходить в заданной при помощи WORKDIR директории.

По умолчанию используется WORKDIR / .

Инструкция WORKDIR может быть использована несколько раз.

Инструкция ARG определяет переменную, которую можно передать во время сборки (build-time) контейнера.

  • Объявление аргументов в Dockerfile.
  • Использование аргументов в Dockerfile.
  • Передача аргументов в команду сборки контейнера.

Переменные окружения ENV

Инструкция ENV сохраняет переменную внутри контейнера. Таким образом переменная в контейнере доступна во время выполнения (run-time).

  • Объявление переменных окружения в Dockerfile.
  • Передача в команду запуска контейнера.

Если есть необходимость передать аргумент как переменную окружения, то можно сделать это следующим образом.

Порты и инструкция EXPOSE

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

Если внутри контейнера запущено приложение на каком-то порте (например, 3000 ), то оно будет доступно только внутри контейнера. Проверить, что оно действительно запущено в контейнере можно, сделав запрос на URL из консоли контейнера.

При этом у хост-машины нет доступа к приложению, запущенному в контейнере.

Инструкция EXPOSE используется в целях документации, позволяя явно указать, какие порты используются внутри контейнера.

Если порт контейнера выставляется наружу, то он называется выставленным (exposed).

Можно также вместо инструкции EXPOSE выставить порт при помощи флага —expose .

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

Чтобы предоставить доступ хост-машине, необходимо опубликовать (publish) порт. В таком случае порт называют опубликованным (published).

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

Для публикации порта используется флаг —publish , -p . Флаг принимает порт хост-машины и порт контейнера в формате hostPort:containerPort .

В примере выше приложение, которое запущено внутри контейнера на порте 3000 , также доступно и на хост-машине на порте 4000 ( http://localhost:4000 ).

Можно также опубликовать сразу все выставленные порты контейнера на случайные порты хост-машины при помощи флага —publish-all , -P .

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

Несколько портов лучше публиковать следующим образом.

Пример Dockerfile для NodeJS

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

Docker Compose — инструмент, позволяющий составлять композицию контейнеров (запускать приложения, состоящие из нескольких контейнеров).

Docker Compose использует файлы формала YAML ( .yml ).

Docker Compose файл состоит из сервисов (services). Сервис содержит в себе все данные, необходимые для запуска конкретного контейнера (с предварительным созданием образа для него при необходимости).

Есть два способа запустить сервис.

  • Можно указать готовый образ в поле image (можно скачать его с Docker Hub или создать самому).
  • Можно настроить этап построения в поле build , указав там путь к Dockerfile, по которому должен быть построен образ.

Порядок запуска сервисов

Docker Compose запускает и останавливает контейнеры в порядке их зависимостей.

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

Настроить зависимость можно при помощи поля depends_on .

В примере ниже запуск сервиса server произойдёт раньше, чем запуск client .

В случае остановки происходит обратная ситуация: client останавливается раньше, чем server .

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

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

Сервис foo будет доступен на порте 3000 внутри контейнера.

Сервис bar будет доступен на порте 4000 внутри контейнера и на порте 3001 на хост-машине.

Конфигурация сервиса baz эквивалетна конфигурации сервиса foo .

Пример композиции контейнеров трёхуровнего приложения

Трёхуровневое (3-tier) приложение состоит из клиента, сервера и базы данных. Для каждого уровня необходим отдельный контейнер, а поскольку они связаны друг с другом, создаётся их композиция.

Первым подключается база данных (сервис db ), поскольку её может использовать сервер. Вторым подключается сервер (сервис server ), поскольку его может использовать клиент. Последним подключается клиент (сервис client ).

В docker-compose может указываться уже собранный образ (builded image) вместе с командой, которая должна быть запущена в контейнере; или Dockerfile , по котому образ будет создаваться.

Переменные ENVIRONMENT и ARGS

Перееменные окружения ENVIRONMENT передаются в уже запущенные контейнеры.

Переменные ARGS доступны во время построения образа (build image).

Передача и использование аргументов в Docker Compose

  • Передача любых аргументов осуществляется при запуске Docker Compose в формате argument=value .
  • Переданные аргументы доступны для использования в YAML-файле в формате $ . Есть возможность задать значение по умолчанию: $ . Без некоторых значений по умолчанию (например, для портов) может возникать ошибка приведения типов.

Можно проверить правильность настройки, а также посмотреть все установленные переменные при помощи следующей команды.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *