zaLinux.ru

Для чего нужен Docker и когда его следует использовать?


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

Что такое Docker?

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

Docker Engine работает в Linux, Windows и macOS и поддерживает Linux и Windows для контейнеров Docker. Точная версия Linux на самом деле не имеет значения; большинство версий Linux работают на одном и том же ядре и отличаются только пользовательским программным обеспечением. Docker может установить это пользовательское программное обеспечение в контейнер, что позволит вам запустить контейнер CentOS в Ubuntu. Вы не могли бы, например, запустить FreeBSD на Ubuntu, так как ядра разные.

Образ контейнера Docker включает только то, что необходимо вашему приложению для запуска. Если ваше приложение использует nginx и Node.js, образ контейнера будет включать их, но вы не будете обременены всеми другими пользовательскими приложениями, которые вы обычно найдёте в Linux.

Почему Docker так полезен?

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

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

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

Docker также позволяет организовать код для развёртывания в новых службах. Допустим, у вас есть веб-сервер, который вы используете для своего приложения. Вероятно, на этом сервере у вас установлено много всего, у вас есть веб-сервер nginx для размещения статического контента, у вас, вероятно, есть база данных для хранения некоторых вещей на бэкэнде, может быть, у вас есть сервер API, работающий также на Express.js. В идеале вы должны разделить их на отдельные приложения для запуска на отдельных серверах чтобы не было беспорядка.

Docker помогает упорядочить это; вы можете упаковать свой веб-сервер и запустить его с контейнером nginx, вы можете упаковать свой сервер API и запустить его с контейнером Node.js, и вы можете упаковать свою базу данных и запустить её в своём собственном контейнере (хотя это, возможно, не лучшая идея, но это возможно). Вы можете взять эти три контейнера Docker и запустить их все на одном компьютере. Если вам нужно переключить серверы, это так же просто, как перенести эти контейнеры на новый сервер. Если вам необходимо масштабирование, вы можете переместить один из этих контейнеров на новый сервер или развернуть его в кластере серверов.

Docker также может сэкономить вам деньги, если вы хотите запускать несколько приложений на одном VPS. Если каждое приложение имеет разные зависимости, ваш сервер очень легко загромождается, как обеденная тарелка на Новый Год, когда всё смешивается вместе. С Docker вы можете запускать несколько отдельных контейнеров, например, с отдельными версиями PHP.

Как использовать Docker

В производственной среде существует множество сервисов для размещения контейнеров Docker, включая AWS ECS, Azure Container Instances, DigitalOcean Docker Droplets и многие другие. Если ваш провайдер не предлагает услуг по управлению контейнерами Docker, вы всегда можете установить его самостоятельно на свой VPS.


В процессе разработки контейнеры Docker просты в запуске и требуют всего несколько команд. Для начала вам необходимо установить движок Docker на хост-ОС. Для Windows и macOS вы можете использовать Docker Desktop, который вы можете скачать с официального сайта: https://www.docker.com/

Для Linux вы можете установить Docker несколькими способами. О том, как это сделать, смотрите в статье «Установка и использование Docker в Linux (Debian, Ubuntu, Arch Linux)».

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

sudo docker run hello-world

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

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

mkdir ~/dockertest && cd ~/dockertest

Любые изменения, внесённые в базовый образ nginx, будут выполняться с помощью Dockerfile. Файлы Docker похожи на make-файлы для контейнеров, они определяют, какие команды запускать, когда Docker создаёт новый образ с вашими изменениями. Dockerfile называется просто Dockerfile без расширения. Создайте этот файл с помощью

touch Dockerfile

и откройте его в текстовом редакторе. Вставьте в него:


FROM nginx
COPY html /usr/share/nginx/html

Первая строка — это команда Docker, которая сообщает Docker, что этот образ должен основываться на образе nginx из Hub. Вторая строка — это ещё одна команда, которая копирует каталог из этой локальной папки (~/dockertest/html) в образ Docker, в данном случае заменяя папку HTML для nginx.

Вы можете запускать множество команд в Dockerfiles. Например, если вашему приложению необходимо установить зависимости, вы можете сделать что-то вроде RUN cd src/ && npm install. Всё, что нужно вашему приложению для начальной загрузки, установки и запуска, определено в Dockerfile.

На самом деле мы ещё не создали каталог ./html, так что продолжайте и запустите:

mkdir html && touch html/index.html

Откройте index.html и вставьте какой-нибудь HTML код:

<!DOCTYPE html>
<html>
<body>
Hello From nginx, inside Docker! Inside, your computer?
</body>
</html>

Теперь мы готовы приготовить наш образ. Убедитесь, что вы находитесь в корне проекта (в ~/dockertest, а не в папке html) и запустите:

docker build -t dockertest .

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

docker run --name DockerTest -p 8080:80 -d dockertest

Это запустит новый контейнер с именем DockerTest, используя созданный нами образ «dockertest». Флаг -p привязывает локальный порт к порту внутри контейнера, в данном случае привязывая HTTP-порт nginx по умолчанию (порт 80) к порту 8080 на вашем локальном компьютере. Откройте localhost:8080 в своём веб-браузере, и вы должны увидеть работающий nginx.

Если вам нужна дополнительная конфигурация, вы можете отредактировать файлы конфигурации nginx, добавив строку COPY nginx.conf /etc/nginx/nginx.conf и написав свой собственный файл конфигурации. Это сложнее настроить, чем напрямую редактировать файл конфигурации, так как вам придётся пересобирать образ при каждом редактировании. Но с точки зрения дополнительной выгоды от возможности взять тот же контейнер, который вы используете при разработке, и развернуть его в рабочей среде, это довольно разумный компромисс.

Смотрите также:



Рекомендуемые статьи:

Оставить комментарий

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