Перейти к содержимому

Какие есть версии docker

  • автор:

10 лучших команд Docker, которые вы должны знать

Docker – это платформа с открытым исходным кодом, используемая для запуска приложений в изолированных средах, называемых контейнерами. Контейнеры имеют свою собственную структуру, с инкапсулированными сервисами, которые не могут вмешиваться в работу основного сервера. В этом руководстве мы будем использовать ОС Ubuntu 22.04, но вы можете выбрать любой дистрибутив Linux по вашему желанию.

Сначала мы установим docker, а затем покажем вам десять наиболее используемых команд docker. Давайте начнем!

Обновление системы

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

sudo apt-get update -y && sudo apt-get upgrade -y

Установка Docker

Сначала нужно установить некоторые зависимости Docker:

sudo apt-get install apt-transport-https curl gnupg-agent ca-certificates software-properties-common -y

Следующим шагом будет добавление ключа безопасности:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Добавляем репозиторий, потому что он не включен в Ubuntu 22.04:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

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

sudo apt-get install docker-ce docker-ce-cli containerd.io -y

После успешной установки запустите и включите службу docker:

sudo systemctl enable docker && sudo systemctl start docker

Для проверки состояния службы выполните следующую команду:

sudo systemctl status docker

Вы должны получить следующий результат:

● docker.service - Docker Application Container Engine Loaded: загружен (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: активен (работает) с Tue 2022-12-06 15:13:24 CST; 10min ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 120228 (dockerd) Tasks: 9 Memory: 21.1M CPU: 2.326s CGroup: /system.slice/docker.service └─120228 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

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

1. Проверка версии Docker

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

Docker version 20.10.21, build baeda1f

2. Поиск пакета

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

docker search wordpress

Вы получите список доступных пакетов WordPress:

NAME DESCRIPTION STARS OFFICIAL AUTOMATED wordpress The WordPress rich content management system. 5012 [OK] bitnami/wordpress Bitnami container image for WordPress 208 [OK] bitnami/wordpress-nginx Bitnami Docker Image for WordPress with NGINX 67 [OK]

3. docker pull

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

docker pull wordpress

После успешного извлечения вы должны получить следующий результат:

Using default tag: latest latest: Pulling from library/wordpress a603fa5e3b41: Pull complete c428f1a49423: Pull complete 156740b07ef8: Pull complete fb5a4c8af82f: Pull complete 25f85b498fd5: Pull complete 9b233e420ac7: Pull complete fe42347c4ecf: Pull complete 9a7bf1523229: Pull complete a0b541d575c5: Pull complete c0e75b0cc4dc: Pull complete a97a86207955: Pull complete f88820a52a78: Pull complete 81ebcb8aedf6: Pull complete 265e9160e272: Pull complete adbaf7c3bb9d: Pull complete 1b8e3ff1537e: Pull complete bc197583e391: Вытащить полностью f89eb7cb30b3: Вытащить полностью fa90bc2f4db7: Pull complete 1ca7d72233c9: Pull complete c68df4c97ee8: Pull complete Digest: sha256:fd08649a97d2cb6967fb0a5cd8a710e2b6075502eb18f6c3f841a4d986c0700b Status: Загружен более новый образ для wordpress:latest docker.io/library/wordpress:latest

4. docker run

Команда Docker run используется для создания контейнера из образа.

docker run hello-world

Вы должны получить сообщение, подобное этому:

Привет от Docker! Это сообщение показывает, что ваша установка работает правильно. Чтобы создать это сообщение, Docker выполнил следующие действия: 1. Клиент Docker связался с демоном Docker. 2. Демон Docker извлек образ "hello-world" из Docker Hub. (amd64) 3. Демон Docker создал новый контейнер из этого образа, который запустил исполняемый файл, выдающий результат, который вы сейчас читаете. 4. Демон Docker передал этот результат клиенту Docker, который отправил его на ваш терминал.

5. docker ps

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

docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d2a01e103a5d wordpress "docker-entrypoint.s. " 6 minutes ago Up 6 minutes 0.0.0.0.0:80->80/tcp, . 80->80/tcp wordpress 3ac6a4cf7b0c mariadb:latest "docker-entrypoint.s. " 8 минут назад Up 8 минут 3306/tcp wordpressdb

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

6. docker start

Docker start используется для запуска остановленных контейнеров. Давайте сначала составим список остановленных контейнеров:

docker ps -a

Вы получите результат, подобный этому:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d2a01e103a5d wordpress "docker-entrypoint.s. " 25 минут назад Вышел (0) Около минуты назад wordpress 3ac6a4cf7b0c mariadb:latest "docker-entrypoint.s. " 28 минут назад Вышел (0) Около минуты назад wordpressdb

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

docker start 3ac6a4cf7b0c docker start d2a01e103a5d

7. docker stop

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

docker stop d2a01e103a5d 3ac6a4cf7b0c

8. docker restart

Docker restart используется для перезапуска контейнеров:

docker restart 3ac6a4cf7b0c d2a01e103a5d 3ac6a4cf7b0c d2a01e103a5d

9. docker remove

Команда docker rm используется для удаления контейнеров Docker. Перед удалением необходимо остановить контейнеры.

docker rm 3ac6a4cf7b0c d2a01e103a5d 3ac6a4cf7b0c d2a01e103a5d

Теперь контейнеры удалены навсегда.

docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

10. Помощь Docker

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

Зарубин Иван Эксперт по Linux и Windows

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

Что такое Docker: для чего он нужен и где используется

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

Изображение записи

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

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

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

Что такое контейнеры

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

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

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

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

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

Преимущества использования контейнеров Docker

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

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

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

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

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

Изоляция и безопасность

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

Ускорение и автоматизация развертывания приложений и масштабируемость

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

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

Контейнеры приближают к микросервисной архитектуре

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

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

Docker compose — одновременно развернуть несколько контейнеров

Docker-compose позволяет разворачивать и настраивать несколько контейнеров одновременно. Например, для веб-приложения нужно развернуть стек LAMP: Linux + Apache, MySQL, PHP. Каждое из приложений — это отдельный контейнер для ОС Linux. Но в этой ситуации нам нужны именно все контейнеры вместе, а не отдельно взятое приложение. Docker-compose позволяет развернуть и настроить все приложения одной командой, а без него пришлось бы разворачивать и настраивать каждый контейнер отдельно.

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

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

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

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

Тома (Docker volumes)

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

Монтирование каталога (bind mount)

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

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

Архитектура (компоненты) Docker

Теперь расскажем подробнее про компоненты, из которых состоит Docker.

Docker daemon

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

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

Docker client (клиент)

Это интерфейс командной строки для управления Docker daemon. Мы пользуемся этим клиентом, когда создаем и разворачиваем контейнеры, а клиент отправляет эти запросы в Docker daemon.

Docker image (образ)

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

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

Docker container (контейнер)

Это уже развернутое из образа и работающее приложение.

Docker Registry

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

Dockerfile

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

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

FROM python:3 COPY main.py / CMD [ "python", "./main.py" ]

Первая строчка означает, что за основу мы берем образ с названием python версии 3 это называется базовый образ. Docker найдет его в docker registry, скачает и будет использовать за основу. Вторая строчка означает, что нужно скопировать файл main.py в корень файловой системы контейнера. Третья строчка означает, что нужно запустить python и передать ему в качестве параметра название файла main.py.

Далее рассмотрим примеры нескольких команд докер и что происходит, когда мы их выполняем.

Все эти команды выполняются в Docker client, который отправляет их в Docker daemon:

  • Команда docker build (зеленая стрелка) читает dockerfile и собирает образ.
  • Команда docker pull (красная стрелка) скачивает образ из docker registry. По умолчанию docker скачивает образы из публичного репозитория Docker Hub. Но можно создать свой репозиторий и настроить докер, чтобы он работал с ним.
  • Команда docker run (черная стрелка) берет образ и запускает из него контейнер.

Создаем виртуальную машину для работы с Docker

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

В панели управления заходим в раздел «Облачная платформа» — «Серверы», нажимаем кнопку «Создать сервер».

На следующем экране выбираем параметры сервера: имя, регион, ОС, параметры производительности и так далее. Сейчас для нас важны параметры «Источник» — выбираем ОС Ubuntu 20.04 и «Конфигурация» — выбираем 2 vCPU и 8 ГБ оперативной памяти.

Далее обратите внимание на разделы Сеть и Доступ. В разделе Сеть нужно выбрать подсеть с публичным адресом, чтобы к виртуальной машине можно было подключаться из интернета. В разделе Доступ будет указан пароль для root-пользователя, а также необходимо загрузить SSH-ключ, чтобы подключаться к виртуальной машине. Подробную инструкцию о подключении смотрите в базе знаний.

После этого внизу страницы нажимаем кнопку «Создать». Виртуальная машина создается за несколько минут, и после того, как она перейдет в статус ACTIVE, к ней можно подключаться по SSH.

Установка Docker

Мы рассмотрим установку докера на примере Ubuntu. Если у вас другой дистрибутив Linux или операционная система — ищите соответствующую инструкцию на официальном сайте.

Для начала синхронизируем пакетную базу apt и установим нужные зависимости:

sudo apt-get update
sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release

Далее импортируем GPG-ключ для репозитория docker:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Теперь добавим новый репозиторий в список apt:

echo \ "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Теперь можно устанавливать докер:

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

По умолчанию, доступ к docker daemon есть только у пользователя root. Чтобы с докером могли работать и другие пользователи, их нужно добавить в специальную группу — docker. Выполните эту команду из под обычного пользователя:

sudo usermod -aG docker $USER

После этого необходимо перелогиниться, чтобы изменение вступило в силу.

Запуск контейнера

Теперь попробуем запустить какое-нибудь готовое приложение. Выполните команду:

docker run ubuntu echo 'hello from ubuntu'

Команда docker run создает и запускает контейнер из образа. В этом примере мы создаем контейнер из образа ubuntu, затем выполняем в нем команду echo ‘hello from ubuntu’. Но так как у нас чистая установка докера и мы не скачали ни одного образа, докер сначала найдет этот образ в публичном репозитории Docker Hub, скачает, а потом создаст из него контейнер. В следующий раз, когда нам понадобится образ ubuntu, докер уже не будет его скачивать.

После выполнения команды в терминале появится строка hello from ubuntu, и контейнер сразу остановится. Теперь выполним другую команду:

docker run -it ubuntu

Эта команда запустит контейнер в интерактивном режиме, то есть контейнер запустится и будет ждать дальнейших команд. При этом мы окажемся внутри операционной системы контейнера: запустится оболочка (bash), и мы сможем выполнять какие-то команды внутри контейнера. Чтобы выйти из контейнера, введите команду exit.

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

Теперь создадим HelloWorld-приложение на Python, обернем его в образ и запустим.

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

mkdir first-docker-app
cd first-docker-app

Создадим файл main.py и запишем в него одну строчку кода:

echo 'print("Hello from python");' >> main.py

Проверим, что наша программа работает. Для этого выполним команду:

python main.py

В консоли должно выйти сообщение Hello from python. Это и есть наше простое приложение. Теперь нужно обернуть его в докер-образ. Для этого создадим файл Dockerfile и напишем в нем три строчки:

FROM python:3 COPY main.py / CMD [ "python", "./main.py" ]

В первой строке мы указываем образ, который берем за основу. Так как мы пишем приложение на Python, нужно чтобы в нашем образе он уже был установлен. Самый простой способ это сделать — использовать готовый официальный образ с Docker Hub. Цифра 3 — это тег. Он означает, что нужно использовать третью версию Python. Вместо этого можно было бы использовать тег latest, который означает самую последнюю версию, или можно было указать номер конкретной версии, например 3.8.8.

Во второй строчке мы копируем наш файл main.py в корневую директорию образа.

Третья строчка — запускаем python и передаем ему в качестве параметра имя нашего файла.

Теперь из этого докер-файла можно собирать образ. Выполним команду:

docker build -t first-docker-app .

Параметр -t обозначает имя нашего образа, мы назвали его first-docker-app.

Так как у нас еще нет скачанного образа python, то докер сам скачает его из Docker Hub и затем будет использовать его в качестве основы для создания нашего образа.

Проверим список установленных у нас образов:

docker images

Мы увидим, что у нас установлено три образа:

REPOSITORY TAG IMAGE ID CREATED SIZE first-docker-app latest 649cceb4dfd2 4 seconds ago 885MB python 3 b1aa63f57d3c 2 days ago 885MB ubuntu latest 8e428cff54c8 4 days ago 72.9MB

first-docker-app — это наш образ, который мы только что создали. python — это образ python, который докер автоматически скачал чтобы собрать наш образ. ubuntu — образ, который мы пробовали для запуска готового приложения.

Теперь создадим контейнер из нашего образа и запустим его:

docker run first-docker-app

В результате нам выведется результат: Hello from python.

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

Готовые кластеры Kubernetes с GPU

Создайте за несколько кликов.

Docker Compose

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

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

По сути, Docker Compose это тот же Docker, но позволяющий автоматизировать работу с более сложными приложениями. Кроме того, для сценариев с одним контейнером использование Docker Compose обеспечивает независимую от инструмента конфигурацию таким образом, чего не делает отдельный файл Dockerfile. Параметры конфигурации, такие как подключение тома для контейнера, сопоставления портов и переменные среды, могут быть объявлены в файлах docker-compose YML.

Работа с docker compose

Для работы с Docker Compose на текущий момент есть два приложения:

Это изначальное автономное приложение для оркестрации Docker. И второй вариант:

Отличие между этими двумя командами естественно не ограничивается только наличием пробела. Второй вариант это более новый проект, который позволяет использовать compose совместно с основным проектом docker. По сути это ветвь v2 репозитория docker/compose. Примечательно, что впервые данная ветвь была представлена пользователям Docker Desktop, поэтому пользователи docker в Linux не видели эту команду.

На данный момент оригинальный проект python, называемый docker-compose, akav1 из репозитория docker/compose, считается устаревшим, и разработка перенесена на версию v2.

Установка

Перейдем к установке. Как можно было понять из предыдущего описания, возможны несколько вариантов использования Docker Compose. Прежде всего, можно установить docker compose версии v2 в качестве плагина CLI в Linux. Например:

apt-get install docker-compose-plugin

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

Для начала выполним предварительные настройки: установим Gnome Terminal (предполагается, что у нас он не установлен).

sudo apt install gnome-terminal

Далее необходимо создать каталог для установки плагина Compose

mkdir -p ~/.docker/cli-plugins/

На следующем шаге выгружаем docker compose из репозитория с помощью curl:

curl -SL https://github.com/docker/compose/releases/download/версия/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose

После этого необходимо выставить нужные права на каталог в который мы разместили docker compose:

chmod +x ~/.docker/cli-plugins/docker-compose

docker compose version

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

Вот содержимое этого файла, а котором мы запускаем контейнер с Redis:

version: '3.9' services: redis: image: redis:6.2-alpine ports: - 6379:6379 command: redis-server --save 60 1 --requirepass MDNcVb924a --loglevel warni>

Запустим контейнер и посмотрим какие образы он использует.

docker compose up -d

docker compose ps

Мы установили и запустили docker compose, теперь самое время разобраться как с ним работать. Прежде всего необходимо подготовить файл docker-compose.yml. Файл Compose имеет структуру YAML, и определяет: версию, службы, сети, тома, конфигурации и секреты. Путь по умолчанию для файла Compose — в рабочем каталоге. Реализации Compose также должны поддерживать docker-compose.yaml и docker-compose.yml для обратной совместимости. Поскольку некоторые элементы файла Compose могут быть представлены как в виде отдельных строк, так и в виде сложных объектов, слияния применяются к развернутой форме.

Профили

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

Элемент верхнего уровня Services поддерживает атрибут profiles для определения списка именованных профилей. Службы без набора атрибутов profiles всегда должны быть включены.

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

Для лучшего понимания работы сервисов с профилями рассмотрим пример структуры файла:

services: foo: image: foo bar: image: bar profiles: - test baz: image: baz depends_on: - bar profiles: - test zot: image: zot depends_on: - bar profiles: - debug

В этом демо примере если нет включенного профиля, то будет использоваться только служба foo. Если включена проверка профиля test, модель содержит службы bar и baz, которые включены этим профилем, и service foo, который всегда включен. Если включена отладка профиля (debug), модель содержит как foo, так и zot-сервисы, но не bar и baz, и поэтому модель недействительна в отношении ограничения depends_on zot. И если включены профили debug и test, модель содержит все службы: foo, bar, baz и zot.

Пример реального файла

Здесь мы разворачиваем стек elasticsearch-logstash-kibana. В приведенном ниже листинге можно посмотреть, как в реальности построено взаимодействие между сервисами в yaml файлах.

services: elasticsearch: image: elasticsearch:7.16.1 container_name: es environment: discovery.type: single-node ES_JAVA_OPTS: "-Xms512m -Xmx512m" ports: - "9200:9200" - "9300:9300" healthcheck: test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"] interval: 10s timeout: 10s retries: 3 networks: - elastic logstash: image: logstash:7.16.1 container_name: log environment: discovery.seed_hosts: logstash LS_JAVA_OPTS: "-Xms512m -Xmx512m" volumes: - ./logstash/pipeline/logstash-nginx.config:/usr/share/logstash/pipeline/logstash-nginx.config - ./logstash/nginx.log:/home/nginx.log ports: - "5000:5000/tcp" - "5000:5000/udp" - "5044:5044" - "9600:9600" depends_on: - elasticsearch networks: - elastic command: logstash -f /usr/share/logstash/pipeline/logstash-nginx.config kibana: image: kibana:7.16.1 container_name: kib ports: - "5601:5601" depends_on: - elasticsearch networks: - elastic networks: elastic: driver: bridge

Давайте сохраним этот файл в новом каталоге и запустим на выполнение:

docker compose up -d

docker compose ps

Как видно, у нас успешно запустились три контейнера.

Заключение

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

А сейчас хочу пригласить вас на бесплатный вебинар, где рассмотрим основы инструмента Terraform и практику построения облачной инфраструктуры с применением подхода IaC

Как работает Docker: подробный гайд от техлида

Олег Накрайников раскрывает концепцию, устройство и принципы работы Docker и делится упражнениями, которые помогут освоить инструмент.

Фото: Bloomberg / Getty Images

Мария Даровская

Мария Даровская

Журналист, коммерческий автор и редактор. Пишет про IT, цифровой маркетинг и бизнес.
Сайт: darovska.com.

Олег Накрайников

Technical Lead. Любит GYM, путешествия и компьютерные игры. Пишет технические статьи и иногда технические треды в Twitter.

Ссылки

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

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

Что такое Docker

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

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

Docker разработали в 2008 году. Изначально это был внутренний проект компании dotCloud, которую впоследствии переименовали в Docker Inc. В 2013 году dotCloud открыла исходный код Docker для сообщества.

Ранние версии Docker представляли собой усовершенствованную обёртку LXC , а с 2015 года Docker уже использовал собственную библиотеку libcontainer, абстрагирующую виртуализационные возможности ядра Linux. Так он превратился в самостоятельную технологию. Платформа неслучайно переехала на libcontainer: гибкость и управляемость LXC-контейнеров оставляла желать лучшего.

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

Устройство и принцип работы Docker

Виртуализация в Docker реализуется на уровне ОС. Виртуальная среда запускается прямо из ядра основной операционной системы и использует её ресурсы.

В поставку Docker входят следующие компоненты:

  • Docker host — это операционная система, на которую устанавливают Docker и на которой он работает.
  • Docker daemon — служба, которая управляет Docker-объектами: сетями, хранилищами, образами и контейнерами.
  • Docker client — консольный клиент, при помощи которого пользователи взаимодействуют с Docker daemon и отправляют ему команды, создают контейнеры и управляют ими.
  • Docker image — это неизменяемый образ, из которого разворачивается контейнер.
  • Docker container — развёрнутое и запущенное приложение.
  • Docker Registry — репозиторий, в котором хранятся образы.
  • Dockerfile — файл-инструкция для сборки образа.
  • Docker Compose — инструмент для управления несколькими контейнерами. Он позволяет создавать контейнеры и задавать их конфигурацию.
  • Docker Desktop — GUI-клиент, который распространяется по GPL. Бесплатная версия работает на Windows, macOS, а с недавних пор и на Linux. Это очень удобный клиент, который отображает все сущности Docker и позволяет запустить однонодовый Kubernetes для компьютера.

Docker изначально создавался под Linux. Поэтому на Windows и macOS запускают виртуальную машину с Linux, а поверх неё — Docker. В macOS используют VirtualBox, а в Windows — Hyper-V.

Работа поверх виртуалок повышает потребление ресурсов. Поэтому Docker на macOS и Windows работает медленнее и с рядом ограничений. Для разработки это приемлемо, но «в бою» так делать никто не будет. На всех популярных платформах в проде используют Linux.

Чем виртуализация отличается от контейнеризации

Контейнеры и виртуальные машины — это разные способы виртуализации. Только виртуалка реализует её на уровне железа, а Docker — на уровне операционной системы.

Виртуальная машина функционирует как отдельный компьютер с собственным оборудованием и операционной системой. Распространённая практика — купить большой сервер и установить на него гипервизор, базу для виртуалок. Сервер «нарезается» на много виртуальных компьютеров, что избавляет нас от необходимости покупать их отдельно.

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

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

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

Оба способа изолируют приложение от основной операционной системы, но если на виртуалку можно поставить любую ОС, то Docker ориентирован на ядро Linux. Недавно добавили возможность поднимать Windows, но я ещё не пробовал это делать.

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

Обычно в крупных компаниях работают на виртуальных машинах, которые разворачиваются на железных машинах в ЦОДах . Инфраструктурные инженеры нарезают виртуальные компьютеры и выстраивают на них инфраструктуру. С помощью оркестраторов можно убрать эту лишнюю «прослойку».

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

Сущности Docker

Docker работает с несколькими сущностями.

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

Dockerfile. Если Docker image — это пирог, то Dockerfile — рецепт его приготовления. В этом файле описаны основные инструкции для сборки образа: какой базовый образ взять, откуда и куда положить файлы и так далее.

Контейнер — это runtime-сущность на основе образа, приложение, которое мы развернули с помощью Docker. Можно провести такую аналогию: образ — это инсталлятор программы, а контейнер — уже запущенная программа.

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

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

Как Docker помогает на практике

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

Разработка приложений с зависимостями

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

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

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

Автоматизация тестирования

Чтобы запустить автотесты, требуются определённые зависимости, например базы данных, брокеры сообщений и тому подобное. Их необходимо предварительно установить и сконфигурировать на сервере сборки. В этом месте иногда возникают проблемы: если при настройке упустить какую-то деталь, то можно испортить данные или что-то поломать. Гораздо безопаснее автоматически развернуть зависимости в виде контейнера прямо на сервере. Это позволяет быстро прогнать тесты, а после — бесследно удалить контейнеры.

Даже если тесты «сломают» какие-то данные, они удалятся вместе с контейнером. Кроме того, сам сервер с Docker, на котором запускаются автотесты, станет универсальным. Ведь благодаря контейнеризации на нём можно будет запускать что угодно. А значит, вы сэкономите на железе и настройке системы.

Публикация приложения

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

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

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

Минусы Docker

Как известно, за удовольствие приходится платить. И Docker — не исключение.

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

Для больших приложений нужен оркестратор. Docker подходит для запуска нескольких контейнеров. В стандартной поставке Docker Compose есть механизм, который позволяет управлять их запуском с помощью конфигурационного файла YAML. Но этот механизм простой, он не потянет приложение, включающее 50–100 сервисов. У Docker не хватит механизмов управления и распределения ресурсов, резервирования и отказоустойчивости, чтобы реализовывать разные схемы обновления контейнеров.

В больших приложениях с микросервисной архитектурой используют оркестраторы Kubernetes или OpenShift. Единицей управления в Kubernetes является контейнер Docker, но на голом Docker прод практически никто не держит. Когда-то в России были такие компании — они рассказывали о своём травмирующем опыте на конференциях 🙂

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

Проблемы с установкой на Windows и macOS. Как я сказал ранее, Docker создавался под Linux. На других операционках он не поддерживает некоторые типы сетей. В большинстве случаев никто этого не заметит, но об этом ограничении нужно помнить. Также на некоторых устройствах возникает конфликт с Virtual Box при установке Docker на Windows.

Как изучать Docker

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

Книги. Есть две хорошие книги — Using Docker и Docker in Action. Правда, они немного устарели (опубликованы в 2018–2019 годах), поэтому там может быть неактуальная информация. Надеюсь, скоро будет переиздание.

Сайт docker.com — основной сайт Docker. На нём есть справочники и референсы по Docker, Docker-файлам, образам и Docker Compose. Читаете книгу, проверяете на сайте актуальность команд и изучаете примеры.

Упражнения. Я провожу тренинги и внутреннее обучение в командах. Обычно рекомендую такие упражнения:

  • Установите Docker на рабочий компьютер. Возьмите готовый Docker image с Docker Hub с базой данных и запустите на его основе контейнер. Это можно сделать по инструкции, которую производитель image выкладывает на Docker Hub. Затем подключитесь к запущенной БД каким-нибудь клиентом и убедитесь, что всё работает.
  • Напишите простенький сервис REST API и Docker-файл для упаковки сервиса в образ, подглядывая в референсы или книгу. Ваша задача — разобраться в теории, получить Docker image и проставить теги.
  • Из полученного ранее образа создайте и запустите контейнер. Вам придётся разобраться с параметрами команды Docker run, настройками портов, передачей переменных окружению, монтированием и основными параметрами. Также стоит научиться подключаться к контейнеру, выполнять bash-команды и смотреть логи приложения.
  • Усложните тестовый сервис, научив его работать с базой данных. Затем разверните контейнеры с сервисом и базой данных и соедините их внутренней сетью. Простое и в то же время очень полезное упражнение, на котором очень часто возникают затруднения на собеседованиях.
  • Переходим к Docker Compose. Посмотрите, как написать YAML и создать группу контейнеров, как соединять их в сеть и работать с маунтами.
  • Опубликуйте свой Docker image в Docker Hub. На одном аккаунте можно бесплатно публиковать только один образ, но есть GitLab, где нет таких ограничений. Правда, он устроен немного сложнее, новичок может запутаться. Ещё в том же GitLab можно создать приватный registry-режим и публиковать проекты без ограничений.

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

  • Всё о Kubernetes: контейнеры, оркестрация, тулинг, виртуальные машины, конкуренты и экосистема
  • «У меня не было опыта, но было желание. Тестовое, испытательный — и я IT-аналитик в банке»
  • Практика Docker: знакомимся с docker-maven-plugin

LXC — система виртуализации на уровне ОС. Позволяет запускать несколько изолированных экземпляров Linux на одном узле в отдельных виртуальных окружениях с собственным пространством процессов и сетевым стеком.

Центры обработки данных.

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

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