Основы работы с Docker в Linux Mint

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

1. Введение в контейнеризацию и архитектуру Docker

Введение в контейнеризацию и архитектуру Docker

Добро пожаловать в курс «Основы работы с Docker в Linux Mint». Если вы читаете эту статью, значит, вы, вероятно, уже слышали о Docker, но хотите разобраться, как именно он работает и почему он стал стандартом де-факто в современной разработке и системном администрировании.

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

Проблема, которую решает Docker

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

Почему это происходит? Причины могут быть разными:

  • На сервере установлена другая версия Python.
  • Отсутствует какая-то системная библиотека.
  • Конфликтуют версии зависимостей с другим приложением, уже работающим на этом сервере.
  • Эта классическая проблема называется «It works on my machine» («У меня на машине все работает»). До появления контейнеризации системные администраторы тратили часы и дни на настройку окружения, чтобы оно в точности соответствовало тому, в котором велась разработка.

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

    Что такое контейнеризация?

    Контейнеризация — это метод виртуализации на уровне операционной системы. Чтобы понять это определение, давайте сравним его с традиционными виртуальными машинами (VM).

    Виртуальные машины (VM) против Контейнеров

    Традиционная виртуализация (например, VirtualBox или VMware) работает следующим образом: у вас есть физический сервер (Host). На нем установлена операционная система. Поверх нее работает Гипервизор. Гипервизор создает виртуальные машины, каждая из которых имеет собственную полноценную гостевую операционную систему (Guest OS), свои драйверы, ядро и выделенные аппаратные ресурсы.

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

    Контейнеры работают иначе. Они не дублируют операционную систему. Вместо этого они используют ядро хостовой операционной системы (в нашем случае — Linux Mint), но изолируют процессы друг от друга.

    !Сравнение архитектуры: Виртуальные машины (слева) против Контейнеров (справа)

    Ключевые отличия:

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

    Как это работает в Linux?

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

  • Namespaces (Пространства имен): Обеспечивают изоляцию. Процесс в контейнере «думает», что он единственный в системе. У него свой список процессов, своя сеть, своя файловая система.
  • Cgroups (Control Groups): Ограничивают ресурсы. Вы можете сказать, что этому контейнеру нельзя потреблять больше 512 МБ памяти или 50% процессора.
  • Именно поэтому Linux Mint (и Linux в целом) является «родной» средой для Docker. Когда вы запускаете Docker на Windows или macOS, под капотом все равно создается скрытая виртуальная машина с Linux, в которой работают контейнеры. В Linux Mint контейнеры работают напрямую на вашем ядре, что дает максимальную эффективность.

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

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

    !Архитектура Docker: взаимодействие Клиента, Хоста и Реестра

    1. Docker Daemon (dockerd)

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

    2. Docker Client (docker)

    Это то, с чем вы будете взаимодействовать как пользователь. Это утилита командной строки (CLI). Когда вы вводите команду docker run, клиент отправляет этот запрос демону dockerd. Клиент и демон могут работать как на одной машине (как будет у нас в Linux Mint), так и на разных.

    3. Docker Registry (Реестр)

    Это хранилище образов. Самый известный публичный реестр — Docker Hub. Это как GitHub, но для Docker-образов. Когда вы просите Docker запустить программу, которой у вас нет локально, демон автоматически ищет её в реестре, скачивает и запускает.

    Основные объекты Docker

    Чтобы успешно работать с Docker, нужно четко понимать разницу между двумя главными понятиями: Образ (Image) и Контейнер (Container).

    Docker Image (Образ)

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

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

    Образы строятся слоями. Каждый слой представляет собой изменение файловой системы. Это делает Docker очень эффективным: если вы скачали образ Ubuntu, а затем хотите скачать образ с Python, основанный на Ubuntu, Docker скачает только слой с Python, так как слой Ubuntu у вас уже есть.

    Docker Container (Контейнер)

    Контейнер — это запущенный экземпляр образа. Это то, что получается, когда вы «оживляете» образ. Если образ — это класс, то контейнер — это объект (инстанс) этого класса.

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

    Аналогия с кулинарией

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

    * Dockerfile (файл с инструкциями): Это записанный на бумаге рецепт пирога. * Docker Image (Образ): Это готовая сухая смесь для выпечки, собранная строго по рецепту и упакованная в коробку. Она неизменна. * Docker Container (Контейнер): Это испеченный пирог, который стоит у вас на столе. Вы можете отрезать от него кусок (изменить состояние), но это не повлияет на сухую смесь в коробке. * Docker Registry: Это супермаркет, где на полках стоят коробки с разными смесями.

    Почему Linux Mint идеален для Docker?

    Linux Mint основан на Ubuntu LTS (Long Term Support), который, в свою очередь, основан на Debian. Это семейство дистрибутивов является «золотым стандартом» для серверной инфраструктуры.

  • Нативная поддержка: Как уже упоминалось, Docker использует ядро Linux напрямую. В Linux Mint вы получаете максимальную производительность без лишних прослоек.
  • Совместимость: Большинство инструкций и руководств в интернете написаны для Ubuntu/Debian, что на 100% применимо к Linux Mint.
  • Удобство: Mint предоставляет дружелюбный интерфейс для работы, но при этом дает мощный терминал для управления Docker.
  • Жизненный цикл контейнера

    Понимание того, как живет контейнер, важно для дальнейшей работы. Типичный цикл выглядит так:

  • Создание: Демон берет образ и создает поверх него записываемый слой.
  • Запуск: Демон выделяет процессу пространство имен (PID, Network и т.д.) и запускает главный процесс приложения.
  • Работа: Приложение выполняется, пишет логи, обрабатывает запросы.
  • Остановка: Главному процессу посылается сигнал завершения. Контейнер останавливается, но не удаляется. Его файловая система сохраняется.
  • Удаление: Контейнер и его записываемый слой удаляются. Все данные, которые не были сохранены во внешние тома, теряются навсегда.
  • Заключение

    Мы разобрали теоретический фундамент Docker. Теперь вы знаете, что контейнеры — это легкая и быстрая альтернатива виртуальным машинам, которая использует ядро вашего Linux Mint для изоляции процессов. Вы познакомились с архитектурой клиент-сервер и узнали разницу между образом (шаблоном) и контейнером (экземпляром).

    В следующей статье мы перейдем от теории к практике: установим Docker Engine в Linux Mint, настроим права доступа и запустим наш первый тестовый контейнер «Hello World».

    Полезные ссылки

    > «Docker is a tool designed to make it easier to create, deploy, and run applications by using containers.»Официальная документация Docker

    * Официальный сайт Docker * Docker Hub

    2. Установка Docker Engine и Docker Desktop в Linux Mint

    Установка Docker Engine и Docker Desktop в Linux Mint

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

    Linux Mint базируется на Ubuntu LTS (Long Term Support), что делает его идеальной платформой для работы с Docker. Однако, здесь есть свои нюансы, касающиеся подключения репозиториев, о которых часто забывают в стандартных инструкциях. Мы разберем два способа установки: классический Docker Engine (через терминал, рекомендуемый для большинства задач) и Docker Desktop (графическое приложение).

    Подготовка системы

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

    Также, если вы ранее пытались установить Docker с помощью неофициальных пакетов или старых версий (например, docker.io или docker-compose из стандартных репозиториев Mint), их необходимо удалить, чтобы избежать конфликтов:

    Не переживайте, если система скажет, что эти пакеты не найдены — это значит, что ваша система чиста.

    Способ 1: Установка Docker Engine (Рекомендуемый)

    Docker Engine — это базовая технология, работающая в командной строке. Это самый легкий, быстрый и надежный способ использования Docker в Linux. Он состоит из демона dockerd и клиента CLI.

    !Схематичное изображение процесса добавления репозитория и установки

    Шаг 1: Установка необходимых зависимостей

    Нам понадобятся утилиты для работы с репозиториями через HTTPS и добавления ключей шифрования:

    Шаг 2: Добавление GPG ключа Docker

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

    Шаг 3: Настройка репозитория (Важный момент для Mint!)

    Это самый критичный шаг, на котором ошибаются многие пользователи Linux Mint.

    Стандартная инструкция для Ubuntu предлагает использовать команду (dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ UBUNTU_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null bash sudo apt-get update bash sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin bash sudo groupadd docker bash sudo usermod -aG docker $USER bash newgrp docker bash docker run hello-world bash modprobe kvm ls -l /dev/kvm bash sudo apt-get update sudo apt-get install ./docker-desktop-*-amd64.deb bash docker images bash docker ps -a json { "dns": ["8.8.8.8", "8.8.4.4"] } bash sudo systemctl restart docker ``

    Заключение

    Поздравляю! Теперь у вас есть полностью настроенная среда для работы с контейнерами. Вы научились обходить специфичные для Linux Mint подводные камни при подключении репозиториев и настроили права доступа для удобной работы.

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

    3. Базовые команды: работа с образами и управление контейнерами

    Базовые команды: работа с образами и управление контейнерами

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

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

    Работа с образами (Images)

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

    Поиск образов

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

    Попробуем найти официальный образ Nginx:

    Вы увидите таблицу с результатами. Обратите внимание на колонку OFFICIAL. Если там стоит [OK], значит, этот образ поддерживается командой разработчиков самого продукта или Docker. Это гарантия качества и безопасности.

    Загрузка образов (Pull)

    Чтобы скачать образ на ваш компьютер (в локальный кэш), используется команда docker pull. Давайте скачаем образ hello-world, если его еще нет, и образ nginx.

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

    #### Понятие тегов (Tags)

    По умолчанию, если вы пишете docker pull nginx, Docker подразумевает docker pull nginx:latest. Тег — это версия образа. Это критически важное понятие.

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

    Просмотр локальных образов

    Чтобы увидеть, какие «коробки с софтом» уже лежат на вашем диске, выполните:

    Вы увидите таблицу: * REPOSITORY: Имя образа (например, nginx). * TAG: Версия (например, latest). * IMAGE ID: Уникальный идентификатор образа. * SIZE: Сколько места он занимает.

    Удаление образов

    Если образ вам больше не нужен и занимает место, его можно удалить командой docker rmi (remove image). Можно использовать имя или ID образа.

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

    Управление контейнерами

    Теперь, когда у нас есть образ nginx, давайте превратим его в работающий процесс — контейнер.

    !Визуализация превращения статического образа в динамический контейнер

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

    Самая главная команда в Docker — это docker run. В простейшем виде она выглядит так:

    Если вы выполните эту команду, произойдет следующее:

  • Docker запустит Nginx.
  • Терминал «повиснет», показывая логи веб-сервера.
  • Вы не сможете вводить новые команды в этом окне, пока не нажмете Ctrl+C (что убьет процесс).
  • Это называется запуском в интерактивном режиме (foreground). Для серверов это обычно неудобно. Нам нужно, чтобы контейнер работал в фоне.

    Запуск в фоновом режиме (Detached mode)

    Чтобы запустить контейнер и сразу вернуть управление терминалом, используйте флаг -d (detach):

    Docker вернет длинную строку (полный ID контейнера) и вернет вам приглашение командной строки. Nginx теперь работает где-то в фоне.

    Просмотр запущенных контейнеров

    Как найти этот фоновый процесс? Используйте команду docker ps (process status):

    Вы увидите: * CONTAINER ID: Короткий ID. * IMAGE: Из какого образа запущен. * STATUS: Сколько времени он работает (Up X seconds). * NAMES: Случайное смешное имя (например, vigorous_babbage), которое Docker дает автоматически, если вы не попросили иного.

    Чтобы увидеть все контейнеры, включая остановленные (те, что выключились или упали с ошибкой), добавьте флаг -a:

    Именование контейнеров

    Обращаться к контейнеру по имени vigorous_babbage или по ID a1b2c3d4 неудобно. Лучше давать свои имена при запуске с помощью флага --name:

    Теперь вы сможете управлять им, обращаясь к my-web-server.

    Проброс портов (Port Mapping)

    Мы запустили веб-сервер Nginx внутри контейнера. По умолчанию он слушает порт 80. Но этот порт 80 находится внутри изолированной сети контейнера. Ваш Linux Mint ничего о нем не знает. Если вы откроете браузер и введете localhost, вы ничего не увидите.

    Чтобы «пробить окно» из контейнера наружу, используется флаг -p (publish).

    Синтаксис: -p <порт_хоста>:<порт_контейнера>

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

    Разберем команду: * -d: Запустить в фоне. * --name site-test: Назвать контейнер site-test. * -p 8080:80: Все запросы, приходящие на порт 8080 вашего Linux Mint, перенаправлять на порт 80 внутри контейнера.

    Теперь откройте Firefox в Linux Mint и перейдите по адресу http://localhost:8080. Вы увидите приветственную страницу "Welcome to nginx!". Поздравляю, ваш первый сервис работает!

    Жизненный цикл контейнера

    Контейнерами можно управлять так же, как обычными сервисами в Linux.

    Остановка и запуск

    Чтобы остановить работающий контейнер (процесс завершится, но файловая система контейнера останется):

    Теперь docker ps его не покажет, но docker ps -a покажет его со статусом Exited.

    Чтобы запустить его снова:

    Перезагрузка

    Если вы изменили настройки или приложение зависло:

    Удаление контейнера

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

    Если контейнер работает, Docker не даст его удалить. Нужно либо сначала сделать stop, либо использовать флаг -f (force) для принудительного удаления:

    Интерактивный режим и вход внутрь

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

    1. Запуск с интерактивной оболочкой

    Если вы хотите запустить, например, Ubuntu и сразу попасть в её терминал:

    * -i (interactive): Держит стандартный ввод открытым. * -t (tty): Выделяет псевдо-терминал.

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

    2. Вход в уже работающий контейнер

    Если у вас уже крутится Nginx (site-test) в фоне, и вы хотите зайти внутрь:

    Команда exec выполняет новый процесс внутри существующего контейнера. Мы запускаем bash (оболочку) в интерактивном режиме.

    Просмотр логов

    Когда контейнер работает в фоне (-d), вы не видите, что он пишет в консоль. А там могут быть важные ошибки. Чтобы посмотреть вывод контейнера, используйте:

    Если хотите следить за логами в реальном времени (как tail -f в Linux), добавьте флаг -f:

    Практическое задание

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

  • Скачайте образ alpine (это очень легкий Linux-дистрибутив, весит около 5 МБ).
  • Запустите его в интерактивном режиме и внутри него выполните команду `echo
  • 4. Сетевое взаимодействие и постоянное хранение данных через Volumes

    Сетевое взаимодействие и постоянное хранение данных через Volumes

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

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

    В этой статье мы решим две фундаментальные задачи:

  • Настроим сетевое взаимодействие, чтобы контейнеры могли «видеть» друг друга и интернет.
  • Организуем постоянное хранение данных (Persistence), чтобы информация сохранялась даже после уничтожения контейнера.
  • Сетевая магия Docker

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

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

    !Визуализация трех основных типов сетей в Docker: Bridge, Host и None

    1. Bridge (Мост) — режим по умолчанию

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

    * Как это работает: Контейнеры получают свой собственный IP-адрес внутри виртуальной подсети (обычно 172.17.x.x). Они могут общаться друг с другом по IP-адресам. * Изоляция: Порты контейнера закрыты от внешнего мира, пока вы явно не пробросите их флагом -p (как мы делали с Nginx в прошлом уроке).

    2. Host (Хост)

    В этом режиме изоляция сети отключается. Контейнер использует сетевой стек вашего Linux Mint напрямую.

    * Особенность: Если приложение внутри контейнера слушает порт 80, оно займет порт 80 на вашем реальном компьютере. * Плюс: Максимальная скорость передачи данных. * Минус: Возможны конфликты портов (нельзя запустить два одинаковых контейнера на одном порту).

    Пример запуска:

    3. None (Отсутствует)

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

    Пользовательские сети (User-defined bridges)

    Это рекомендуемый способ работы. Главное преимущество создания своей сети — автоматический DNS.

    В стандартной сети bridge контейнеры могут общаться только по IP-адресам, которые могут меняться при перезагрузке. В пользовательской сети контейнеры могут обращаться друг к другу по именам.

    Давайте проверим это на практике в терминале Linux Mint.

    Шаг 1. Создадим свою сеть:

    Шаг 2. Запустим два контейнера в этой сети: Запустим контейнер с базой данных (имитация) и назовем его db:

    Запустим второй контейнер web и попробуем «пропинговать» базу данных по имени:

    Вы увидите успешный ответ от db. Docker сам сопоставил имя контейнера с его IP-адресом. Это критически важно для связки «Веб-сервер + База данных».

    Полезные команды для работы с сетью

    * docker network ls — список всех сетей. * docker network inspect <имя_сети> — детальная информация (какие контейнеры подключены, их IP). * docker network connect <сеть> <контейнер> — подключить работающий контейнер к сети на лету.

    Хранение данных: Volumes и Bind Mounts

    По умолчанию файловая система контейнера находится внутри него. Когда вы удаляете контейнер (docker rm), этот записываемый слой уничтожается.

    Чтобы сохранить данные, Docker предлагает два основных механизма: Volumes (Тома) и Bind Mounts (Монтирование папок).

    !Сравнение двух способов хранения данных: Bind Mounts (прямой доступ к папкам пользователя) и Volumes (управляемое хранилище Docker)

    1. Volumes (Тома)

    Это «родной» способ хранения данных в Docker. Тома хранятся в специальной директории Linux Mint, которой управляет сам Docker (обычно /var/lib/docker/volumes/).

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

    Создание и использование тома:

    Теперь, даже если вы удалите контейнер data-test, том my-data останется. Вы можете подключить его к новому контейнеру, и файлы будут на месте.

    2. Bind Mounts (Монтирование папок хоста)

    Этот способ позволяет пробросить любую папку с вашего компьютера внутрь контейнера.

    * Когда использовать: При разработке. Например, вы пишете код сайта в редакторе в Linux Mint, а Docker сразу подхватывает изменения. * Синтаксис: -v /путь/на/хосте:/путь/в/контейнере

    Пример: Создадим файл index.html в текущей папке:

    Запустим веб-сервер Nginx, подменив его стандартную папку на нашу текущую директорию: bash docker run -d --name my-redis -v redis-data:/data redis bash docker exec -it my-redis redis-cli text set mykey "Docker is awesome" save exit bash docker rm -f my-redis bash docker run -d --name my-redis-2 -v redis-data:/data redis bash docker exec -it my-redis-2 redis-cli get mykey `` Вывод должен быть: "Docker is awesome".

    Заключение

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

    * Мы узнали, что пользовательские сети позволяют контейнерам общаться по именам. * Мы разобрали Volumes для надежного хранения данных баз данных. * Мы научились использовать Bind Mounts для удобной разработки, связывая файлы Linux Mint с контейнером.

    В следующей статье мы перейдем к инструменту, который автоматизирует запуск сложных приложений из нескольких контейнеров — Docker Compose. Это избавит нас от необходимости писать длинные команды docker run` вручную.

    > «Data matures like wine, applications like fish.» — Джеймс Говернор. (Данные зреют как вино, приложения — как рыба). Эта цитата отлично иллюстрирует, почему нам так важно отделять хранение данных (Volumes) от самих приложений (Containers).

    Полезные ссылки

    * Официальная документация по сетям в Docker * Управление данными в Docker

    5. Оркестрация приложений с помощью Docker Compose и лучшие практики

    Оркестрация приложений с помощью Docker Compose и лучшие практики

    Мы прошли долгий путь. Мы начали с установки Docker в Linux Mint, научились запускать одиночные контейнеры, разобрались с тем, как они хранят данные и общаются по сети. Но давайте будем честны: запускать сложные приложения, вводя в терминал длинные команды с кучей флагов (-v, -p, --network, --name), — это утомительно и чревато ошибками.

    Представьте, что ваше приложение состоит из веб-сервера (Nginx), бэкенда (Python), базы данных (PostgreSQL) и кэша (Redis). Чтобы запустить это вручную, вам нужно выполнить четыре команды docker run в строгом порядке, не забыв подключить их к одной сети. А если нужно перезапустить всё это на другом сервере?

    Здесь на сцену выходит Docker Compose. Это инструмент, который превращает ручное управление контейнерами в элегантную оркестрацию.

    Что такое Docker Compose?

    Docker Compose — это инструмент для определения и запуска многоконтейнерных приложений Docker. Если Dockerfile — это рецепт для создания одного образа, то docker-compose.yml — это партитура для целого оркестра контейнеров.

    !Сравнение ручного управления контейнерами и оркестрации через Docker Compose

    Ключевые преимущества:

  • Декларативный подход: Вы описываете желаемое состояние системы в одном файле. Вам не нужно писать скрипты запуска.
  • Изоляция проектов: Compose создает изолированные среды для каждого проекта, что позволяет запускать несколько копии одного и того же окружения на одной машине.
  • Автоматическая сеть: Compose автоматически создает локальную сеть для вашего проекта, позволяя контейнерам видеть друг друга по именам сервисов.
  • Структура файла docker-compose.yml

    Конфигурация описывается в формате YAML. Это человекочитаемый формат данных, где структура задается отступами (пробелами).

    > Важно: В YAML запрещено использовать табуляцию. Используйте только пробелы (обычно 2 пробела на уровень отступа).

    Давайте разберем анатомию типичного файла docker-compose.yml:

    Практика: Разворачиваем WordPress + MySQL

    Лучший способ понять Compose — попробовать его в деле. Мы развернем классическую связку: CMS WordPress и базу данных MySQL. В Linux Mint это займет пару минут.

    Шаг 1: Подготовка директории

    Создайте папку для проекта в любом удобном месте:

    Шаг 2: Создание файла конфигурации

    Создайте файл docker-compose.yml. Вы можете использовать любой текстовый редактор, например nano или графический xed (стандартный в Mint).

    Вставьте туда следующий код:

    Разбор файла:

    * services: Мы определили два сервиса: db (база данных) и wordpress (сам сайт). * image: Указываем, какие образы скачать с Docker Hub. * volumes: Для базы данных мы создали именованный том db_data, чтобы данные не пропали при перезапуске. * environment: Переменные окружения для настройки контейнеров (пароли, имена баз). Обратите внимание: WordPress знает пароль от базы, потому что мы передали его здесь. depends_on: Указывает, что WordPress должен запускаться после* базы данных. * WORDPRESS_DB_HOST: db: Самая главная магия. WordPress подключается к хосту с именем db. Docker Compose автоматически настроил DNS так, чтобы это имя указывало на IP-адрес контейнера с базой.

    Шаг 3: Запуск оркестра

    Находясь в папке с файлом, выполните команду:

    * up: Создать и запустить контейнеры. * -d (detached): Запустить в фоновом режиме.

    Вы увидите, как Docker скачивает образы и запускает сервисы.

    > Примечание: Если вы устанавливали Docker по старым инструкциям, команда может выглядеть как docker-compose (через дефис). В современном Docker (который мы ставили во второй статье) это плагин, поэтому пишется через пробел: docker compose.

    Шаг 4: Проверка

    Откройте браузер в Linux Mint и перейдите по адресу http://localhost:8000. Вы должны увидеть экран установки WordPress. Поздравляю, вы развернули сложный стек одной командой!

    Управление жизненным циклом

    Теперь, когда приложение работает, как им управлять?

    Просмотр статуса

    Посмотреть список контейнеров, относящихся только к этому проекту:

    Просмотр логов

    Если что-то пошло не так, можно посмотреть логи всех сервисов сразу:

    Или конкретного сервиса:

    Остановка и удаление

    Чтобы просто остановить контейнеры (не удаляя их):

    Чтобы остановить и удалить контейнеры и сети (но оставить тома с данными):

    Если вы хотите удалить вообще всё, включая базу данных (тома):

    Лучшие практики работы с Docker Compose

    Чтобы ваш опыт работы был профессиональным, следуйте этим правилам.

    1. Используйте файл .env для секретов

    Хранить пароли прямо в docker-compose.yml — плохая идея, особенно если вы планируете выкладывать код на GitHub. Вместо этого используйте файл .env.

    Создайте файл .env в той же папке:

    А в docker-compose.yml используйте подстановку:

    Docker Compose автоматически подтянет значения из этого файла.

    2. Фиксируйте версии образов

    Избегайте тега latest в продакшене. Сегодня node:latest — это 20-я версия, а завтра — 21-я, и ваше приложение может сломаться. Всегда указывайте конкретную версию, например postgres:14.2.

    3. Структурируйте данные

    Используйте Bind Mounts (монтирование папок) для кода и конфигов, которые вы редактируете, и Volumes (тома) для баз данных.

    Пример для разработки на Python:

    4. Используйте .dockerignore

    Если вы собираете свои образы (build), создайте файл .dockerignore (работает как .gitignore). Добавьте туда .git, node_modules, .env и временные файлы, чтобы они не попадали внутрь образа и не увеличивали его размер.

    5. Ограничивайте ресурсы

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

    Заключение курса

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

    Мы завершаем наш вводный курс «Основы работы с Docker в Linux Mint». Давайте подведем итоги того, чему вы научились:

  • Поняли архитектуру контейнеризации и отличия от виртуальных машин.
  • Правильно установили Docker Engine в Linux Mint, настроив репозитории.
  • Освоили работу с образами и контейнерами через CLI.
  • Научились связывать контейнеры сетью и сохранять данные через Volumes.
  • Автоматизировали запуск приложений с помощью Docker Compose.
  • Теперь ваш Linux Mint — это не просто домашняя система, а мощная станция для разработки и тестирования серверного ПО. Дальнейшие шаги в вашем обучении могут включать создание собственных образов с помощью Dockerfile и изучение Kubernetes для оркестрации огромных кластеров.

    Удачи в мире контейнеров!

    Полезные ссылки

    * Официальная документация Docker Compose * Спецификация файла Compose