Что такое Docker?
Docker – это программная платформа для быстрой разработки, тестирования и развертывания приложений. Docker упаковывает ПО в стандартизованные блоки, которые называются контейнерами. Каждый контейнер включает все необходимое для работы приложения: библиотеки, системные инструменты, код и среду исполнения. Благодаря Docker можно быстро развертывать и масштабировать приложения в любой среде и сохранять уверенность в том, что код будет работать.
Использование Docker на AWS предоставляет разработчикам и системным администраторам надежный и экономичный способ сборки, доставки и запуска распределенных приложений любого масштаба.
Новые объявления: Docker сотрудничает с AWS, чтобы помочь разработчикам ускорить доставку современных приложений в облаке. Благодаря такому взаимодействию разработчики могут с помощью Docker Compose и Docker Desktop оптимизировать локальный рабочий процесс, применяемый на данный момент, для беспрепятственного развертывания приложений на Amazon ECS и AWS Fargate. Подробнее в блоге.
Как работает Docker
В основе работы Docker лежит стандартизированный способ исполнения кода. Docker – это операционная система для контейнеров. Подобно тому как виртуальная машина создает виртуальное представление аппаратного обеспечения сервера (то есть устраняет необходимость непосредственно управлять таковым), контейнеры создают виртуальное представление серверной операционной системы. После установки на каждый сервер Docker предоставляет доступ к простым командам, необходимым для сборки, запуска или остановки контейнеров.
Такие сервисы AWS, как AWS Fargate, Amazon ECS, Amazon EKS и AWS Batch, упрощают работу с контейнерами Docker, а также управление ими в любом масштабе.
Почему следует использовать Docker
Использование Docker позволяет быстрее и эффективнее доставлять или перемещать код, стандартизирует выполняемые приложениями операции и в целом экономит средства, оптимизируя использование ресурсов. Благодаря Docker пользователи получают объект, который с высокой надежностью можно запускать на любой платформе. Простой и понятный синтаксис Docker обеспечивает полный контроль над выполняемыми операциями. Повсеместное внедрение контейнеров подразумевает доступ к разнообразным инструментам и готовым приложениям, которые можно использовать с Docker.
Быстрая доставка программного обеспечения
Пользователи Docker осуществляют доставку приложений в среднем в семь раз чаще, чем те, кто не использует Docker. Docker позволяет доставлять изолированные сервисы с необходимой периодичностью.
Стандартизация операций
Доставка приложений в небольших контейнерах упрощает процесс развертывания, обнаружения проблем и отката для их устранения к прошлым версиям.
Эффективное перемещение
Приложения на основе контейнеров Docker можно эффективно переносить с локальных машин, на которых ведется разработка, в AWS для рабочего развертывания.
Экономия
Контейнеры Docker позволяют исполнять больше кода на каждом сервере, повышая эффективность использования ресурсов и сокращая расходы.
Когда рекомендуется использовать Docker
Контейнеры Docker можно использовать в качестве основных компонентов для создания современных платформ и приложений. Docker упрощает сборку и запуск распределенных микросервисных архитектур, развертывание кода с помощью стандартизированных конвейеров непрерывной интеграции и доставки, создание высокомасштабируемых систем обработки данных и полностью управляемых платформ для разработчиков. Сотрудничество AWS и Docker позволит упростить операцию развертывания артефактов Docker Compose в Amazon ECS и AWS Fargate.
Микросервисы
Воспользуйтесь преимуществами стандартизированного развертывания кода с помощью контейнеров Docker для создания и масштабирования распределенных архитектур приложений.
Непрерывная интеграция и доставка
Ускорьте доставку приложений за счет стандартизации рабочих сред и устранения расхождений между стеками и версиями языков программирования.
Обработка данных
Обработки больших данных как сервис. Объедините пакеты данных и аналитики в портативные контейнеры, запуск которых не требует специальных технических навыков.
Контейнер как сервис
Создавайте и доставляйте распределенные приложения, содержание и инфраструктура которых программно управляема и защищена.
Вопросы и ответы по Docker
Вопрос: Как можно использовать Docker?
Благодаря Docker можно быстро развертывать и масштабировать приложения в любой среде и сохранять уверенность в том, что код будет работать. Это становится возможным благодаря тому, что Docker упаковывает ПО в стандартизованные блоки, называемые контейнерами. Каждый контейнер включает все необходимое для работы приложения: библиотеки, системные инструменты, код и среду исполнения.
Вопрос: Что такое образ Docker?
Образ Docker – это доступный только для чтения шаблон, который задает настройки контейнера. Образ содержит исполняемый код вместе с определениями любых библиотек и зависимостей, которые могут понадобиться для его работы. Контейнер Docker представляет собой запущенный (работающий) образ Docker. AWS предоставляет реестр образов Amazon Elastic Container Registry (ECR) для хранения и быстрого извлечения образов Docker.
Вопрос: В чем разница между Docker и виртуальной машиной?
Виртуальные машины (VM) создают виртуальное представление аппаратного обеспечения сервера (то есть устраняют необходимость непосредственно управлять таковым), а контейнеры создают виртуальное представление серверной операционной системы. Docker является операционной системой (или исполняемой средой) для контейнеров. Программное ядро Docker устанавливается на каждый сервер, на котором предполагается запускать контейнеры, и предоставляет набор простых команд, которые можно использовать для сборки, запуска и остановки контейнеров.
Запуск Docker на AWS
В AWS обеспечена поддержка решений Docker с открытым исходным кодом и коммерческого уровня. Существует несколько способов запуска контейнеров на AWS, в том числе с помощью Amazon Elastic Container Service (ECS) – высокомасштабируемого и высокопроизводительного сервиса управления контейнерами. Клиенты могут легко развернуть свои контейнерные приложения с локальной среды Docker непосредственно в Amazon ECS. AWS Fargate – это технология для Amazon ECS, которая позволяет запускать контейнеры в рабочей среде без необходимости развертывания соответствующей инфраструктуры или управления ею. Amazon Elastic Container Service for Kubernetes (EKS) упрощает запуск Kubernetes на AWS. AWS Fargate – это технология для Amazon ECS, которая позволяет запускать контейнеры без необходимости выделения серверов или управления ими. Amazon Elastic Container Registry (ECR) – это высокодоступный и защищенный частный репозиторий контейнеров, который упрощает хранение образов контейнеров Docker, а также управление ими. Сервис шифрует и сжимает образы при хранении, обеспечивая их защиту и быстрое извлечение. AWS Batch позволяет запускать рабочие нагрузки пакетной обработки на основе контейнеров Docker с широкими возможностями масштабирования.
Amazon ECS
Amazon ECS – это высокопроизводительный сервис оркестрации для запуска контейнеров Docker в облаке AWS с широкими возможностями масштабирования.
Гайд по Docker: что это такое, зачем его использовать и как с ним работать
Давайте представим себе разработчика, который приходит на работу в новую компанию. На онбординге тимлид дает ему первое шуточное задание: изучить сайт организации и найти на нем страницу с фотографиями котиков.
Разработчик узнаёт, что сайт компании работает с помощью веб-сервера Nginx, менеджера процессов PHP-FPM и системы управления базами данных Postgres. Теперь программист ищет нужную страницу. Поиск выглядит так:
- Разработчик вводит в браузере адрес сайта
- Браузер запрашивает HTML-страницу с котиками по указанному адресу
- HTTP-сервер Nginx принимает запрос и делегирует создание страницы PHP-FPM
- PHP-FPM запрашивает данные о котиках из базы Postgres, строит HTML-страницу и отдает обратно его серверу Nginx, а тот — клиенту-браузеру
- Разработчик видит страницу с котиками.
Свое первое задание разработчик выполняет на компьютере тимлида, где уже установлен Nginx, PHP-FPM и Postgres. На следующий день ему выдают новый компьютер, на котором этих программ нет.
Чтобы начать работать над сайтом вместе с коллегами, разработчик разворачивает проект, то есть устанавливает и настраивает все необходимое для работы. Он делает это последовательно:
- Устанавливает Nginx
- Устанавливает PHP-FPM и все нужные расширения
- Настраивает совместную работу Nginx и PHP-FPM
- Устанавливает Postgres, создает пользователей, нужные базы и схемы.
Установка идет долго: приходится ждать, пока сначала установится одна программа, потом другая. Сложности добавляет и то, что вся его команда работает над проектом на разных операционных системах: одни на macOS, а другие на Ubuntu или Windows.
Чтобы не терять время, устанавливая программу за программой, разработчик мог бы автоматизировать свои действия с помощью программы Docker. Она разворачивает проект программиста за считанные минуты.
Бесплатные курсы по программированию в Хекслете
- Освойте азы современных языков программирования
- Изучите работу с Git и командной строкой
- Выберите себе профессию или улучшите навыки
Что такое Docker
Docker — это популярная программа, в основе которой лежит технология контейнеризации. Docker позволяет запускать Docker-контейнеры с приложениями из заранее заготовленных шаблонов — Docker-образов (или по-другому Docker images).
Контейнеризация — это технология, которая помогает запускать приложения изолированно от операционной системы. Приложение как бы упаковывается в специальную оболочку — контейнер, внутри которого находится среда, необходимая для работы.
Простыми словами контейнер — это некая изолированная песочница для запуска ваших приложений.
На картинке видно, что приложение 1 и приложение 2 изолированы как друг от друга, так и от операционной системы.
Что еще может делать Docker:
- Управлять изолированными приложениями
- Ускорять и автоматизировать развертывание приложений
- Доставлять приложения до серверов
- Масштабировать приложения
- Запускать на одном компьютере разные версии одной программы.
Как работает Docker
Концепцию программы легче понять на практике. Сначала установим на компьютер Docker и запустим HTTP-сервер Nginx. Для этого введем следующую команду:
docker run -p 8080:80 nginx:latest
Далее откроем браузер и забьем в адресную строку: 127.0.0.1:8080 . Откроется страница приветствия Nginx.
Теперь разберемся подробнее, что происходит, когда мы вводим команду docker run -p 8080:80 nginx:latest . Она выполняет следующее:
- Скачивает docker-образ — шаблон для создания Docker-контейнера — nginx:latest из публичного репозитория Docker Hub (если его не скачивали ранее). Docker-образ содержит все необходимое для запуска приложения: код, среду выполнения, библиотеки, переменные окружения и файлы конфигурации. На странице Nginx в Docker Hub можно найти Docker-образ nginx:latest , где latest — это тег (метка, снимок), который ссылается на самый свежий docker-образ и описывает его.
- Запускает Docker-контейнер с помощью Docker-образа
- Пробрасывает порт. Ранее мы объясняли, что процессы в Docker-контейнерах запускаются в изоляции от ОС, то есть все порты между ОС и Docker-контейнером закрыты. Для того, чтобы мы смогли обратиться к Nginx, нужно пробросить порт, что и делает опция -p 8080:80 , где 80 — это порт Nginx внутри контейнера, а 8080 — порт в локальной сети ОС.
Как создать свой Docker-образ
Теперь попробуем создать свой Docker-образ, взяв за основу nginx:latest . Docker умеет создавать Docker-образ, читая текстовые команды, которые записаны в файл Dockerfile.
Вот пример простейшего Dockerfile:
FROM nginx:latest RUN echo 'Hi, we are building a custom docker image from nginx:latest!' COPY nginx-custom-welcome-page.html /usr/share/nginx/html/index.html
Команда FROM задает базовый (родительский) Docker-образ и всегда вызывается в первую очередь. Команда COPY копирует файлы в Docker-контейнер.
С помощью COPY можно заменить стандартную велком-страницу Nginx на такую страницу:
Welcome to custom Nginx page!
Узнать подробнее об этих и других командах Docker можно в официальной документации .
Теперь, когда мы разобрались, за что отвечают команды, создадим Docker-образ из Dockerfile:
$ docker build -t nginx_custom:latest -f /opt/src/docker-for-kids/dockerFiles/Nginx-custom/Dockerfile /opt/src/docker-for-kids Sending build context to Docker daemon 139.3kB Step 1/3 : FROM nginx:latest latest: Pulling from library/nginx 31b3f1ad4ce1: Pull complete fd42b079d0f8: Pull complete 30585fbbebc6: Pull complete 18f4ffdd25f4: Pull complete 9dc932c8fba2: Pull complete 600c24b8ba39: Pull complete Digest: sha256:0b970013351304af46f322da1263516b188318682b2ab1091862497591189ff1 Status: Downloaded newer image **for** nginx:latest ---**>** 2d389e545974 Step 2/3 : RUN echo 'Hi, we are building a custom docker image from nginx:latest!' ---**>** Running **in** 05ffd060061f Hi, we are building a custom docker image from nginx:latest! Removing intermediate container 05ffd060061f ---**>** 9ac62be4252a Step 3/3 : COPY nginx-custom-welcome-page.html /usr/share/nginx/html/index.html ---**>** 704121601a45 Successfully built 704121601a45 Successfully tagged nginx_custom:latest
Поясним, какие команды мы использовали в этом коде:
- -t nginx_custom:latest — это имя будущего Docker-образа, latest — это тег
- -f /opt/src/docker-for-kids/dockerFiles/Nginx-custom/Dockerfile — путь до Dockerfile
- /opt/src/docker-for-kids — директория, в контексте которой будет создан Docker-образ. Контекст — это все то, что доступно для команд из Dockerfile при сборке (билде) образа. Процесс создания Docker-образа может ссылаться на любой из файлов в контексте.
Теперь запускаем команду:
$ docker run -p 8080:80 Nginx_custom:latest
Что такое Docker Compose и как он работает
С ростом количества Docker-контейнеров их становится труднее поддерживать. Конфигурация каждого контейнера описывается в своем Dockerfile, и их нужно запускать отдельной командой. Это же касается сборки или пересборки контейнеров.
Работу облегчает Docker Compose — это инструмент для описания многоконтейнерных приложений. С его помощью можно собрать один файл, в котором наглядно описываются все контейнеры. Еще Docker Compose позволяет собирать, останавливать и запускать файлы одной командой.
Для описания приложений используется YAML-файл.
version: '3' services: nginx: container_name: nginx-test # имя Docker-контейнера build: # создать Docker-образ из DockerFile context: . # путь, в контексте которого будет создан Docker-образ dockerfile: ./dockerFiles/nginx/Dockerfile # путь до Dockerfile, из которого будет собран Docker-образ ports: # проброс портов - "80:80" networks: # имя сети, к которой будет подключен Docker-контейнер - test-network depends_on: # эта программа будет запущена только после того, как запустится сервис под именем php-fpm - php-fpm volumes: # монтирование директорий, директория-на-хост-машине: директория-в-докере - ./:/var/www/hello.dev/ php-fpm: container_name: php-fpm-test build: context: . dockerfile: ./dockerFiles/php-fpm/Dockerfile networks: - test-network volumes: - ./:/var/www/hello.dev/ postgres: container_name: postgres-test image: postgres:14.1-alpine # тег Docker-образа из https://hub.docker.com/ environment: postgres_PASSWORD: mysecretpass # переменные окружения, которые использует Docker-контейнер networks: - test-network networks: # явно объявленные сети test-network: driver: bridge
Если изображать этот код схематично, то описание приложения выглядит так:
Каждый сервис находится внутри Docker-контейнера. Точкой входа в приложение, как и в случае с тем разработчиком и веб-сайтом компании, является Nginx. Пользователи веб-сайта делают запросы к Nginx, у которого проброшен порт 80.
Разберем еще несколько команд, которые реализует Docker:
- network . Как мы объяснили ранее, каждое приложение в Docker-контейнере находится в изоляции. networks объединяет все Docker-контейнеры в одну сеть с именем test-network, и это позволяет обращаться к нужному контейнеру по его имени.
- volumes — это механизм для хранения данных вне Docker-контейнера, то есть в файловой системе нашей ОС. volumes решает проблему совместного использования файлов.
Все примеры, а также исходники Dockerfile можно взять из репозитория на GitHub.
Как создать простое веб-приложение с помощью Docker
Создадим простое веб-приложение, которое покажет нам сообщение об успешном подключении к базе данных. Вместо адреса базы данных используем host=postgres , такое же имя cервиса, как и в YAML-файле. Напомню, что эта возможность появилась благодаря общей сети test-network.
try $pdo = new \PDO("pgsql:host=postgres;dbname=postgres", 'postgres', 'mysecretpass'); echo "Подключение к базе данных установлено!
"; return; > catch (PDOException $exception) echo "Ошибка при подключении к базе данных
$exception->getMessage()>
"; >
PDO — это интерфейс для доступа к базам данных в PHP. Подробнее об этом можно узнать в официальной документации .
Теперь, чтобы создать все Docker-образы и запустить Docker-контейнеры нужно выполнить:
Выполняем index.php и видим успешное соединение с базой данных.
Веб-приложение для самостоятельного запуска можно найти в репозитории на GitHub.
Итог
Освоив Docker, разработчики могут разворачивать все необходимые им сервисы на каком угодно компьютере. Также эта программа — отличный инструмент для быстрой доставки до серверов, тестирования. Изучить Docker не так тяжело, как может показаться новичкам, но зато это умение значительно сэкономит их время на ручной установке софта. Почитать про Docker подробнее можно на официальном сайте .
Бесплатные курсы по программированию в Хекслете
- Освойте азы современных языков программирования
- Изучите работу с Git и командной строкой
- Выберите себе профессию или улучшите навыки
Docker
Docker — это программная платформа для разработки, доставки и запуска контейнерных приложений. Он позволяет создавать контейнеры, автоматизировать их запуск и развертывание, управляет жизненным циклом. С помощью Docker можно запускать множество контейнеров на одной хост-машине.
«IT-специалист с нуля» наш лучший курс для старта в IT
Платформа Docker представлена в двух вариантах: бесплатная Community Edition под лицензией Apache и платная Enterprise Edition. Платная версия предназначена для коммерческого использования и распространяется по проприетарной лицензии. Изначально системой можно было пользоваться в Linux и UNIX-системах, но начиная с 2015 года в ПО добавили поддержку Windows.
Профессия / 8 месяцев
IT-специалист с нуля
Попробуйте 9 профессий за 2 месяца и выберите подходящую вам
Что такое контейнеры
Контейнеризация — это способ упаковки приложения и всех его зависимостей в один образ, который запускается в изолированной среде, не влияющей на основную операционную систему. С помощью контейнера можно отделить приложение от инфраструктуры: не важно, в каком окружении оно будет работать, есть ли там нужные зависимости и настройки, — разработчикам достаточно создать программу и упаковать все зависимости и настройки в единый образ. Затем ее можно разворачивать и запускать на других системах. Это ускоряет процесс разработки, сокращает промежуток между написанием кода и его выкладкой.
Контейнеризация напоминает виртуализацию, но технологии отличаются друг от друга. Виртуализация работает как отдельный компьютер со своей операционной системой и виртуальным оборудованием. Внутри одной операционной системы можно запустить другую. При контейнеризации виртуальная среда может запускаться прямо из ядра основной ОС и не виртуализирует оборудование. Поэтому контейнер может работать только в той же операционной системе, что и основная. Так как контейнеры не виртуализируют оборудование, они потребляют меньше ресурсов.
Как устроен Docker
На изображении представлена примерная структура платформы. Docker — клиент-серверное приложение. Это означает, что оно состоит из двух частей: сервера и клиента.
Сервер еще называют Docker-движком или демоном (daemon). Это фоновый процесс, который непосредственно управляет контейнерами. Именно демон создает, разворачивает и запускает контейнеры. Его можно сравнить с двигателем машины.
Клиент — это программа-интерфейс для командной строки, с которой взаимодействует пользователь. Он отдает команды через терминал. Клиент сообщает нужные сведения демону и отдает ему указания. Если продолжать аналогию с машиной, клиент — это руль и педали.
Клиент и сервер могут находиться на одном устройстве, а могут — на разных. Во втором случае клиент подключают к удаленному серверу через сокеты или API.
Курс для новичков «IT-специалист
с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить
Компоненты для контейнеризации
Docker работает со следующими компонентами.
Dockerfile. Это файл для предварительной работы, набор инструкций, который нужен для записи образа. В нем описывается, что должно находиться в образе, какие команды, зависимости и процессы он будет содержать.
Для сборки образа из Dockerfile используют команду:
docker build
Docker Image. Это образ — неизменяемый файл, из которого разворачивается контейнер. Для этого нужно запустить образ в клиенте с помощью специальной команды:
docker run
Docker Registry. Это реестр, или репозиторий — открытая или закрытая база образов. К ней можно подключиться через клиент Docker и загрузить нужный с помощью команды:
docker pull
При запуске команды docker run программа сначала проверяет, есть ли нужный образ в локальном хранилище. Если его нет, она сама находит файл в репозитории и скачивает на компьютер.
Docker Container. Это уже готовый и развернутый контейнер, который находится на каком-либо устройстве.
Так пользователь запускает нужный образ через клиент Docker и ждет, пока платформа развернет его в полноценную среду или приложение-контейнер.
DevOps-инженер — связующее звено между всеми этапами создания продукта. Станьте незаменимым специалистом
за 6 месяцев.
Docker контейнер
Docker контейнер — это стандартизированный, изолированный и портативный пакет программного обеспечения, который включает в себя все необходимое для запуска приложения, включая код, среду выполнения, системные инструменты, библиотеки и настройки. Контейнеры позволяют упаковать приложение и все его зависимости в единый объект, который может быть запущен на любой системе, поддерживающей Docker, без изменения среды выполнения.
Преимущества использования Docker контейнеров:
- Изоляция: Контейнеры изолируют приложения друг от друга и от хост-системы, что уменьшает возможные конфликты между зависимостями и обеспечивает более надежную среду выполнения.
- Портативность: Контейнеры могут быть созданы и запущены на различных системах без изменений, что делает развертывание приложений более простым и надежным.
- Эффективность использования ресурсов: Контейнеры используют общие ресурсы операционной системы и разделяют ядро, что делает их более эффективными по сравнению с виртуальными машинами.
- Масштабируемость: Контейнеры легко масштабируются горизонтально, позволяя быстро добавлять экземпляры приложения в ответ на увеличение нагрузки.
- Управление версиями: Контейнеры позволяют управлять версиями приложений и их зависимостей, что упрощает процесс развертывания и обновления.
Чем контейнеризация отличается от виртуализации
Контейнеры и виртуальные машины (ВМ) — это методы изоляции приложений и окружений. Docker использует виртуализацию на уровне операционной системы, позволяя запускать приложения в изолированных контейнерах, которые делят ядро ОС с хост-системой. ВМ, напротив, создают полные виртуальные компьютеры с отдельными ОС и ресурсами.
Это означает, что Docker-контейнеры более легкие, потому что они не требуют дублирования всей ОС, как ВМ. Контейнеры также быстрее запускаются и имеют меньший объем, что делает их более эффективными в ресурсоемких средах. Однако ВМ предоставляют большую изоляцию, так как каждая ВМ имеет свою собственную ОС и не зависит от хост-системы.
Таким образом, Docker контейнеры предоставляют легковесное и быстрое решение для изоляции приложений, в то время как виртуальные машины обеспечивают более глубокую изоляцию за счет полной виртуализации.
Характеристика | Docker контейнеры | Виртуальные машины |
---|---|---|
Уровень изоляции | Операционная система | Аппаратное обеспечение |
Ресурсоемкость | Меньше | Больше |
Запуск и остановка | Быстрее | Медленнее |
Размер | Меньше | Больше |
Изоляция | Менее глубокая | Глубокая |
Нагрузка на хост-систему | Меньше | Больше |
Совместимость | Ограниченная | Высокая |
Виртуализация ОС | Да | Да |
Гипервизор | Не требуется | Требуется |
Эта таблица демонстрирует основные различия между Docker контейнерами и виртуальными машинами.
Docker и виртуальные машины не всегда хорошо сочетаются вместе. Иногда в практике используется подход, при котором сервер разделяется на виртуальные машины, на которых запускаются контейнеры. Однако такая двойная виртуализация приводит к лишнему расходу ресурсов. Если в организации установилась такая практика, то вместо гипервизора можно использовать Kubernetes, который будет устанавливать приложения непосредственно на физическое оборудование.
Обычно крупные компании работают с виртуальными машинами, развернутыми на физическом оборудовании в центрах обработки данных. Инженеры инфраструктуры создают виртуальные компьютеры и настраивают на них инфраструктуру. Используя оркестраторы, можно избавиться от этого дополнительного уровня.
Если у вас есть избыток ресурсов, то можно установить Docker на виртуальную машину, чтобы обеспечить изоляцию между приложениями.
Что такое Docker Hub
Образ можно создать самостоятельно с помощью Dockerfile или уже готового контейнера, в котором произошли какие-либо изменения, а также скачать из открытого репозитория Docker Hub.
Разработчики со всего мира могут выкладывать Docker-образы. Другие пользователи имеют возможность скачать их, развернуть в контейнеры и использовать на своих машинах.
Сейчас в Docker Hub более 100 тысяч образов. Некоторые из них загрузили в базу официальные разработчики. Это, например, Docker Images для mySQL или GitLab.
Поддержка репозитория уже включена в Docker. Это значит, что достаточно написать команду для установки какой-либо программы, и система сама начнет искать ее в базе данных. По умолчанию это Docker Hub, но платформу можно настроить и под другие репозитории. Например, под внутренние корпоративные базы.
Docker Compose: множественные образы
Считается, что один контейнер должен выполнять одну функцию. Поэтому для настройки сложной среды понадобится несколько образов.
Можно скачать их вручную и настроить либо воспользоваться Docker Compose — инструментом для работы с множественными образами и многоконтейнерными приложениями.
ПО позволяет управлять несколькими образами и контейнерами как одним. С помощью Docker Compose можно создать файл YAML для определения служб и с одной командой запускать и останавливать все что нужно. Инструмент способен ускорить разработку: в многоконтейнерных приложениях количество контейнеров может доходить до нескольких десятков.
DevOps-инженер
Помогайте компаниям быстрее выпускать качественный продукт
Как хранятся данные в Docker
При остановке и перезапуске контейнера можно потерять часть рабочей информации, которая в нем записана. Чтобы этого избежать, программисты стремятся разрабатывать приложения с минимальным использованием хранилищ внутри контейнеров. Но обойтись без хранения данных получается не всегда, а от основной системы контейнер изолирован. Существует несколько способов решить проблему.
Docker Volumes. Это тома — способ хранения информации, который рекомендуют использовать разработчики платформы. Внутри лежат файлы и другие данные. Тома можно подключать к разным контейнерам, выбирать специальные драйверы и хранить информацию не на хосте, а в облаке или на удаленном сервере.
В Linux тома по умолчанию находятся в /var/lib/docker/volumes/. Другие программы могут получить к ним доступ только через контейнер, а не напрямую. Для создания и управления томами используются средства Docker: команда docker volume create, указание тома при создании контейнера в Dockerfile или docker-compose.yml.
Bind Mount. Более простой способ реализовать удаленное хранение памяти — папки, которые монтируются в контейнер прямо с хоста. Этот вариант используют для передачи конфигурационных файлов или в процессе разработки. Программист может писать код в среде хоста, а потом передавать его в контейнер.
Tmpfs и Named Pipes. Так называется особое файловое хранилище, которое есть только в системах Linux. Как правило, оно используется не для хранения файлов, а для обеспечения безопасности. Tmpfs — временное хранилище. Стоит остановить контейнер — данные будут потеряны. Доступ к Tmpfs очень быстрый, поэтому хранилище используют, чтобы оптимизировать работу контейнера.
Named Pipes — это именованные каналы. Через них с Docker могут работать только пользователи Windows.
Задачи, которые решает Docker
Развертывание среды или приложения
Docker позволяет перенести приложение со всеми зависимостями на другую систему с помощью пары команд в терминале. Настройка зависимостей вручную занимает больше времени. Также с помощью Docker можно быстро развернуть рабочую среду с определенными настройками. Существуют «системные контейнеры», которые содержат дистрибутивы ОС.
Изолированный запуск
Docker позволяет запустить приложение отдельно от всей системы без конфликтов с другими программами. Программа становится практически автономной и не вызывает ошибок зависимости.
Контроль ресурсов
Еще одна возможность Docker — распределение ресурсов между разными приложениями. Неизолированные процессы могут конкурировать за память и вычислительные мощности процессора. Изолированные друг от друга программы не делают этого. Docker позволяет эффективнее использовать ресурсы и не допускать конфликтов.
Повышение безопасности
Если код контейнерного приложения окажется небезопасным, это не навредит серверу-хосту. При правильной настройке контейнера деятельность кода не затронет основную систему. Даже фатальная ошибка не повлияет на работоспособность остальных служб и программ.
Работа с микросервисами
Микросервисная архитектура — такой тип организации ПО, при котором функции большого приложения разделяются на маленькие независимые программные модули. Они общаются друг с другом с помощью протоколов, но в целом работают автономно друг от друга. Docker подходит для реализации архитектуры этого типа: каждый микросервис упаковывается в отдельный контейнер, который можно настроить и протестировать, запустить или остановить отдельно от других.
Читайте также Возможна ли цифровая трансформация в нынешних условиях?
Ускорение цикла разработки
Технологии контейнеризации помогают программировать быстрее. На настройку среды, разворачивание приложений под разными платформами тратится меньше времени. В результате повышается производительность всей команды.
Управление сложными системами
Для автоматизации большинства процессов со сложными контейнерными приложениями используются платформы оркестрации. Многие возможности специального ПО завязаны на контейнеризации и функциях Docker.
Например, платформы автоматизируют разворачивание контейнеров, их настройку и масштабирование. Это нужно, так как программная архитектура становится более сложной. Приложения могут состоять из сотен отдельных контейнеров, каждый из которых нужно развернуть и настроить. Поддержка таких приложений вручную занимает много времени.
Масштабирование
Это еще одна задача для платформ оркестрации. Во многих из них поддерживается автоматическое масштабирование систем под разные площадки и условия. Пример такой платформы — Kubernetes, которая часто используется в связке с Docker.
Автомасштабирование помогает быстро оптимизировать сектор под повышенную нагрузку. Если сайт неожиданно получит больше трафика, чем обычно, система перераспределит ресурсы и сервисы адаптируются.
Как начать работу с Docker
Docker доступен для Linux, Windows, Mac. Чтобы скачать установочный файл, нужно перейти по ссылке и выбрать подходящую версию. Подробную инструкцию по установке можно найти в официальной документации.
Расскажем про работу с «первым контейнером». Это практически аналог “Hello, World” для Docker: скачивание и разворачивание популярного образа из репозитория. Обычно используется какой-либо дистрибутив Linux:
docker run ubuntu echo “Hi, I'm Ubuntu”
Запись означает «Разверни образ Ubuntu в контейнер и выполни в нем команду echo “Hi, I’m Ubuntu” ». Эта команда написана на bash — языке сценариев Linux.
- Docker-клиент получит эту запись и отправит инструкции демону.
- Тот проверит, есть ли образ Ubuntu на компьютере. Если его не найдется, программа скачает его из Docker Hub и сохранит.
- Затем движок развернет образ в контейнер — внутри изолированно от основной системы запустится Ubuntu.
- И уже внутри Ubuntu выполнится команда echo “Hi, I’m Ubuntu” . Она выведет в консоль надпись “Hi, I’m Ubuntu” .
Это наиболее простой пример — возможностей у Docker намного больше.
Недостатки Docker
Высокая потребность в ресурсах
Docker добавляет дополнительный слой абстракции и требует дополнительных вычислительных ресурсов. Это означает, что нужно балансировать между удобством и оптимальным использованием ресурсов.
Оркестрация для крупных приложений
Docker хорош для управления небольшим числом контейнеров. Однако при наличии 50–100 сервисов может потребоваться оркестратор, так как Docker не обладает достаточными инструментами для эффективного управления ресурсами и обеспечения надежности в случае разных сценариев обновления контейнеров.
Большие приложения с микросервисной архитектурой часто используют оркестраторы, такие как Kubernetes или OpenShift, чтобы обеспечить более высокий уровень управления и надежности. Docker в таких случаях часто оказывается недостаточным.
Сложности на Windows и macOS
Docker, изначально разработанный для Linux, может столкнуться с проблемами совместимости на других ОС. Кроме того, установка Docker на Windows иногда может конфликтовать с VirtualBox, что может вызвать трудности при настройке.
IT-специалист с нуля
Наш лучший курс для старта в IT. За 2 месяца вы пробуете себя в девяти разных профессиях: мобильной и веб-разработке, тестировании, аналитике и даже Data Science — выберите подходящую и сразу освойте ее.
Статьи по теме:
Docker. Зачем и как
Есть множество прекрасных публикаций для тех, кто уже пользуется docker-ом. Есть хорошие статьи для тех, кто хочет этому научиться. Я пишу для тех, кто не только не знает, что такое docker, но и не уверен стоит ли ему это знать.
Я сознательно опускаю некоторые технические подробности, а кое где допускаю упрощения. Если вы увидите, что docker – то, что вам нужно, вы легко найдете более полную и точную информацию в других статьях.
Начну я с описания нескольких типичных проблем.
Проблемы
Первая проблема — как передать продукт клиенту.
Предположим у вас есть серверный проект, который вы закончили и теперь его необходимо передать пользователю. Вы готовите много разных файликов, скриптов и пишите инструкцию по установке. А потом тратите уйму времени на решения проблем клиента вроде: «у меня ничего не работает», «ваш скрипт упал на середине — что теперь делать», «я перепутал порядок шагов в инструкции и теперь не могу идти дальше» и т. п.
Всё усугубляется если продукт тиражируемый и вместо одного клиента у вас сотни или тысячи покупателей. И становится еще сложнее, если вспомнить о необходимости установки новых версий продукта.
Вторая проблема — тиражируемость. Пусть вам нужно поднять 5 (или 50) почти одинаковых серверов. Делать это вручную долго, дорого и подвержено ошибкам.
Наконец, третья проблема — переиспользуемость. Предположим у вас есть отдел, который делает браузерные игры. Предположим, что их у вас уже несколько. И все они используют один и тот же технологический стэк (например — java-tomcat-nginx-postgre). Но при этом, чтобы поставить новую игру вы вынуждены заново подготавливать на новом сервере почти одинаковую конфигурацию. Вы не можете просто так взять и сказать — «хочу сервер, как в игре странники но только с другим веб архивом»
Обычные решения
Как обычно решаются эти проблемы.
Установочный скрипт
Первый подход я уже упомянул — вы можете написать скрипт, который установит всё, что вам нужно и запускать его на всех нужных серверах. ( Скрипт может быть как простым sh файлом, так и чем-то сложным, созданным с использованием специальных инструментов).
Недостатки этого подхода — хрупкость и неустойчивость к ошибкам. Как бы хорошо не был написан скрипт, рано или поздно на какой-то машине он упадёт. И после этого падения машина фактически окажется «испорченной» — просто так «откатить» те действия, которые скрипт успел выполнить, у вашего клиента не получится.
Облачные сервисы
Второй подход — использование облачных сервисов. Вы вручную устанавливаете на виртуальный сервер всё, что вам нужно. Затем делаете его image. И далее клонируете его столько раз, сколько вам надо.
Недостатка здесь два. Во-первых, vendor-lock-in. Вы не можете запускать свое решение вне выбранного облака, что не всегда удобно и может привести к потерям несогласных с этим выбором клиентов. Во-вторых, облака медленны. Виртуальные (и даже «bare-metal») сервера предоставляемые облаками на сегодняшний день сильно уступают по производительности dedicated серверам.
Виртуальные машины
Третий подход — использование виртуальных машин. Здесь тоже есть недостатки:
Размер — не всегда удобно качать образ виртуальной машины, который может быть довольно большим. При этом, любое изменение внутри образа виртуальной машины требует скачать весь образ заново.
Сложное управление совместным использованием серверных ресурсов — не все виртуальные машины вообще поддерживают совместное использование памяти или CPU. Те что поддерживают, требуют тонкой настройки.
Подход докера — контейнеризация
И вот тут появляется docker, в котором
- есть контролируемая среда (как в виртуальных машинах)
- есть эффективное управление серверными ресурсами
- и нет vendor lock-in
Как работает docker
Создание образа
Сначала создается docker image (или образ). Он создается при помощи скрипта, который вы для этого пишете.
Образы наследуются и, обычно, для создания своего первого образа мы берём готовый образ и наследуемся от него.
Чаще всего мы берем образ в котором содержится та или иная версия linux. Скрипт тогда начинается как-то так:
FROM ubuntu:16.04
Далее при помощи директивы RUN мы можем исполнять любые команды, которые поддерживает этот линукс.
Например RUN apt-get install -y mc установит в наш образ midnight commander.
Кроме этого, мы можем копировать в наш образ любые локальные файлы при помощи директивы COPY.
COPY mzoo.war /opt/tomcat/webapps/ROOT.war
Докер поддерживает гораздо больше различных директив. Например, директива USER roman говорит докеру что все следующие директивы нужно выполнять из под пользователя roman. А директива ENTRYPOINT [“/opt/tomcat/catalina.sh”] задает исполняемый файл, который будет запускаться при старте.
Я не буду перечислять все остальные директивы — в этом нет смысла. Здесь главное — принцип: вы создаёте вот такой скрипт, называете его Dockerfile и запускаете команду docker build, docker выполняет скрипт и создает image.
Если в процессе возникают какие-то ошибки, докер о них сообщает и вы их исправляете. То есть исправление скрипта происходит на этапе создания image. На этапе установки скрипт уже не используется.
Создание контейнера
Когда у вас уже есть docker image вы можете создать из него контейнер на любом физическом сервере, где установлен докер. Если image – это тиражируемый образ некоторой «машины», то container это уже сама «машина», которую можно запускать и останавливать.
Важный момент — при создании контейнера из image, его можно параметризовать. Вы можете передавать докеру переменные окружения, которые он использует при создании контейнера из image. Так вы сможете создавать немного разные машины из одного образа. Например, передать образу web-сервера его доменное имя.
Хорошей практикой в докере считается «упаковка» в один контейнер ровно одного постоянно работающего серверного процесса. Как я уже упоминал, этот процесс работает на уровне физического сервера и честно регулируется установленной там операционной системой. Поэтому, в отличие от виртуальных машин, контейнеры докера не требуют специального управления памятью и процессорами. Использование ресурсов становится простым и эффективным.
Union filesystem
Ок — память и процессор используется эффективно. А как насчёт файловой системы? Ведь если у каждого контейнера докера своя собственная копия операционной системы, то мы получим ту же проблему, что и с виртуальными машинами — тяжеловесные образы, которые содержат одно и тоже.
На самом деле в докере это не так. Если вы используете 100500 контейнеров, основанных на одном и том же образе операционной системы, то файлы этой системы будут скачаны докером ровно один раз. Это достигается за счёт использования докером union file system.
Union file system состоит из слоёв (layers). Слои как бы наложены друг на друга. Некоторые слои защищены от записи. Например, все наши контейнеры используют общие защищенные от записи слои, в которых находятся неизменяемые файлы операционной системы.
Для изменяемых файлов каждый из контейнеров будет иметь собственный слой. Естественно, докер использует такой подход не только для операционной системы, но и для любых общих частей контейнеров, которые были созданы на основе общих «предков» их образов.
Container registry
Получается, что docker image состоит из слоёв. И хорошо было бы уметь скачивать на наш сервер только те слои, которых на нём пока нет. Иначе для установки 100 контейнеров, основанных на Ubuntu мы скачаем Ubuntu внутри их образов 100 раз. Зачем?
Хорошая новость в том, что докер решает эту проблему. Докер предоставляет специальный сервис, называемый docker registry. Docker registry предназначен для хранения и дистрибуции готовых образов. Собрав новый образ (или новую версию образа) вы можете закачать его в docker registry. Соответственно, потом его можно скачать оттуда на любой сервер. Главная фишка здесь в том, что физически качаться будут только те слои, которые нужны.
Например, если вы создали новую версию образа, в котором поменяли несколько файлов, то в registry будут отправлены только слои, содержащие эти файлы.
Аналогично, если сервер качает из registry какой-то образ, скачаны будут только слои, отсутствующие на сервере.
Docker registry существует и как общедоступный сервис и как open source проект, доступный для скачивания и установки на собственной инфрастуктуре.
Использование контейнеров
Созданные контейнеры можно запускать, останавливать, проверять их статус и т д. При создании контейнера можно дополнительно передать докеру некоторые параметры. Например, попросить докер автоматически рестартовать контейнер, если тот упадёт.
Взаимодействие между контейнерами
Если контейнеров на сервере несколько, управлять ими вручную становится проблематично. Для этого есть технология docker compose. Она существует поверх докера и просто позволяет управлять контейнерами на основе единого конфигурационного файла, в котором описаны контейнеры, их параметры и их взаимосвязи (например контейнер A имеет право соединяться с портом 5432 контейнера B)
Выводы
Таким образом докер очень хорошо подходит для решения перечисленных выше задач:
- удобная передача серверного проекта клиенту
- обеспечение тиражируемости серверов
- обеспечение переиспользуемости ранее созданных серверных конфигураций