Docker && Docker Compose

Docker официальный ссылки

https://www.docker.com

Документация Docker: https://docs.docker.com

Docker Hub (хранилище образов): https://hub.docker.com

Репозиторий Docker на GitHub: https://github.com/docker

Docker Compose (документация): https://docs.docker.com/compose

Платформы на которых выполнялось тестирование:
Операционная система: Ubuntu 22.04

ОГЛАВЛЕНИЕ:

Что такое Docker и зачем он нужен?

Что такое Docker Compose и зачем он нужен?

Установка Docker && Docker Compose.

Добавление пользователя в рабочую группа docker .

Удаление неиспользуемых сетей Docker

Отказ от ответственности.


Гайды. Ноды. Тестнеты | Teletype "OdaNoder" | Mirror "OdaNoder" | Telegram группа


Что такое Docker и зачем он нужен?

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

Основные преимущества Docker:

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

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

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

  4. Упрощение развертывания. С помощью Docker можно быстро развернуть и обновить приложение, сводя к минимуму риски конфликтов с зависимостями.

Пример использования Docker:

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


Что такое Docker Compose и зачем он нужен?

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

Основные преимущества Docker Compose:

  1. Упрощение работы с многоконтейнерными приложениями. Если ваше приложение состоит из нескольких компонентов (например, веб-сервер, база данных, кэш-сервер), Compose позволяет запустить их все одним командным файлом.

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

  3. Гибкость и читаемость. Docker Compose использует YAML для описания конфигурации контейнеров, что делает его легким для понимания и настройки.

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

Пример использования Docker Compose:

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

version: '3'
services:
  web:
    image: my-web-app
    ports:
      - "8080:80"
    depends_on:
      - db
      - redis
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
  redis:
    image: "redis:alpine"

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

Итог

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


Установка Docker && Docker Compose

Варианты установки:

Автоматическая установка Docker && Docker Compose с использованием официального скрипта (если до этого докер не устанавливался)

Автоматическая установка Docker && Docker Compose с использованием официального скрипта (если до этого докер не устанавливался)

Официальный источник GitHub

Перед установкой стоит ознакомиться:

  • Для запуска скрипта требуются rootпривилегии .sudo

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

  • Скрипт пытается определить ваш дистрибутив Linux и его версию, а также настроить вашу систему управления пакетами.

  • Скрипт не позволяет настраивать большинство параметров установки.

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

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

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

Добавление пользователя в рабочую группа docker .

При необходимости добавляем локального пользователя в группу docker , что бы не вводить каждый раз sudo . USER можно оставить система автоматически подменить его на локального пользователя или укажите вручную имя нужного пользователя. Замените your_username на имя пользователя, которого вы хотите добавить

sudo usermod -aG docker $USER
sudo usermod -aG docker your_username

Выходим и заново авторизируемся на сервере.


Узнать версию билда контейнера и какой тег используется в вашем текущем Docker-контейнере

Проверить билд Docker контейнера

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

docker inspect <container_id>

В значении "Image" будет указан хэш образа, который был использован.

docker inspect <container_id> | grep "Image"

Проверка версии/тега образа

docker images

Команда docker

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

Общий синтаксис:

docker [COMMAND] [OPTIONS]

Где: [COMMAND] — подкоманда, которая выполняет конкретное действие (например, run, ps, logs, и т.д.). [OPTIONS] — опции для модификации поведения команды.

Основные команды, управляемые через docker:

  • docker run — запуск контейнеров.

  • docker ps — отображение списка контейнеров.

  • docker stop — остановка контейнеров.

  • docker rm — удаление контейнеров.

  • docker rmi — удаление образов.

  • docker exec — выполнение команд в контейнерах.

  • docker login — аутентификация в Docker Registry.

  • docker pull — загрузка образа из реестра.

  • docker push — отправка образа в реестр.

  • docker inspect — получение детальной информации о контейнере или образе.

  • docker stats

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

Общие опции команды docker:

  • --help — вывод справки по команде или подкоманде.

    docker --help
    

    Показывает список всех доступных подкоманд.

  • --version — показывает текущую версию Docker.

    docker --version
    
  • --config — указывает путь к пользовательскому конфигурационному файлу Docker.

    docker --config /path/to/config
    

Удаление неиспользуемых сетей Docker

Для удаления неиспользуемых сетевых интерфейсов после удаления контейнеров Docker, вы можете воспользоваться командой docker network prune, которая удалит все неиспользуемые сети. Также можно вручную удалить определённые интерфейсы, которые больше не используются.

Вот шаги, которые можно выполнить:

1. Удаление неиспользуемых сетей Docker

Команда docker network prune удалит все сети, которые не связаны с работающими контейнерами:

docker network prune

При выполнении команды вам будет предложено подтвердить удаление. Все неиспользуемые сети, такие как br-53137d23117b, будут удалены, если к ним не подключены контейнеры.

2. Проверка активных сетей

Чтобы увидеть список всех сетей, используйте:

docker network ls

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

3. Удаление отдельных сетевых интерфейсов

Если вы хотите удалить конкретный интерфейс, который не используется, и у вас есть идентификатор сети (например, br-53137d23117b), вы можете использовать следующую команду:

docker network rm br-53137d23117b

Эта команда удалит только указанную сеть.

4. Удаление ненужных интерфейсов вручную

Если вы видите сетевые интерфейсы, которые не относятся к Docker (например, br-53137d23117b, который находится в состоянии DOWN), и вы уверены, что они не используются, вы можете удалить их с помощью команды ip link delete:

sudo ip link delete br-53137d23117b

5. Удаление висячих интерфейсов

Если интерфейсы, такие как vetha77efc1, остались от контейнеров, которые вы уже удалили, они могут быть удалены автоматически при следующем запуске Docker или с помощью команды:

docker container prune

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

6. Итоговая проверка

После выполнения этих команд вы можете снова проверить сетевые интерфейсы с помощью:

ip a

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


ОШИБКИ

exited with code 0 - корректное завершение работы контейнера.


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

ШПАРГАЛКА.

Команда docker: опции, ключи и примеры использования docker

Команда docker-ps: опции, ключи и примеры использования docker ps

Команда docker-logs: опции, ключи и примеры использования docker logs

Команда docker-login: опции, ключи и примеры использования docker login

Команда docker-inspect: опции, ключи и примеры использования docker inspect

Команда docker-exec: опции, ключи и примеры использования docker exec

Команда docker-cp: опции, ключи и примеры использования docker cp

Команда docker-container: опции, ключи и примеры использования docker container

Команда docker-compose \ docker compose: опции, ключи и примеры использования docker-compose

Команда docker-commit: опции, ключи и примеры использования docker commit

Команда docker-build: опции, ключи и примеры использования docker build


Опция --restart

no — контейнер не будет перезапускаться (значение по умолчанию). Подходит для контейнеров, которые не требуют перезапуска после завершения работы.

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

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

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

Для docker

Контейнер запускается с нуля:

docker run --restart=always <другие параметры запуска> <имя_образа>

Обновление уже запущенного контейнера

docker update --restart=always <container_id>

Для docker компоус

restart: on-failure: контейнер будет перезапущен только в случае ошибки (например, если контейнер завершится с ненулевым кодом выхода).

restart: unless-stopped: контейнер будет перезапущен в случае сбоя или перезагрузки системы, но не перезапустится, если вы его вручную остановите.


Работа с docker конйтенерами

Загрузить нужную версию образа Grafana с Docker Hub. 11.2.3 - это tag (указывает на нужную версию). Без указания tag , автоматически должна загружаться latest

docker pull grafana/grafana:11.2.3

Переименовать образ с тегом grafana:11.2.3 на тег grafana:latest, при этом не отображался тег 11.2.3:

Шаг 1: Тегирование образа с тегом latest. Создать новый тег для образа grafana:11.2.3 как grafana:latest. Эта команда создаст новый тег для того же образа, но теперь он будет доступен как grafana:latest

docker tag grafana/grafana:11.2.3 grafana/grafana:latest

Шаг 2: Удалить старый тег grafana:11.2.3. После того как создан новый тег для образа, можно удалить старый тег 11.2.3. Эта команда удалит тег 1.21 из локального репозитория Docker, но сам образ останется, так как он теперь имеет тег latest:

docker rmi grafana/grafana:11.2.3

docker-compose.yml

version: '3.8'

services:
  elixir-validator:
    image: elixirprotocol/validator:latest
    container_name: elixir
    platform: linux/amd64
    env_file:
      - /absolute/path/to/validator.env
    restart: unless-stopped  # Автоматический перезапуск контейнера
    ports:
      - "17690:17690"  # Метрики и проверка состояния
    healthcheck:  # Проверка состояния контейнера
      test: ["CMD", "curl", "-f", "http://localhost:17690/health"]
      interval: 30s
      timeout: 10s
      retries: 5
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    volumes:
      - /path/to/host/logs:/var/lib/docker/containers
    networks:
      - elixir-network

networks:
  elixir-network:
    driver: bridge

pull_policy (Политика получения образов). Этот параметр указывает, как Docker должен управлять образами при запуске контейнеров. always : образ всегда будет перезапрашиваться с Docker Hub (или другого реестра), даже если он уже есть локально. never : использует только локально доступные образы. Если образ отсутствует, контейнер не запустится. if-not-present (по умолчанию): образ загружается только в случае отсутствия локальной копии.

pull_policy не является стандартным для Docker Compose версии 3.x (и ранее). Он поддерживается только в Docker Compose V2 для некоторых специфичных настроек.

platform: linux/amd64 — указывает Docker, что для этого контейнера нужно использовать архитектуру linux/amd64, то есть x86_64. Это может быть полезно, если вы работаете в среде с многоархитектурной поддержкой, например, на сервере с архитектурой ARM, но вам нужно запустить образ для x86_64.

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

/absolute/path/to/validator.env - абсолютный путь к файлу переменных окружения.

Опция --restart : no — контейнер не будет перезапускаться (значение по умолчанию). Подходит для контейнеров, которые не требуют перезапуска после завершения работы. on-failure — контейнер перезапустится только при ошибках (не нулевом статусе завершения). Когда нужно перезапускать контейнеры только в случае ошибок (не успешного завершения работы), чтобы предотвратить бесполезные перезапуски при нормальной остановке. always — контейнер всегда будет перезапускаться, независимо от причины его остановки. Когда контейнер должен всегда работать, независимо от того, был ли он остановлен. unless-stopped — контейнер будет перезапускаться, пока его явно не остановят. Когда контейнер должен автоматически перезапускаться после сбоя, но не перезапускаться после того, как он был остановлен вручную.

/path/to/host/logs:/var/lib/docker/containers - /path/to/host/logs — папка на хосте, где будут храниться логи. /var/lib/docker/containers — путь внутри контейнера, где Docker по умолчанию

networks в секции services - контейнер будет подключен к пользовательской сети с именем elixir-network. Если сеть с именем elixir-network уже создана (вручную или другим Docker Compose проектом), Docker не создаст новую сеть. Вместо этого контейнеры будут подключены к существующей сети elixir-network.

networks на верхнем уровне - здесь определяется сеть с именем elixir-network, которая будет использовать драйвер bridge (это тип сети, предоставляющий изолированную среду для контейнеров. Контейнеры внутри этой сети могут общаться между собой напрямую через IP-адреса или имена сервисов).


Спасибо за внимание к материалу! Надеюсь, информация оказалась полезной для вас! Поздравляю с новым достижением!


Если материал оказался полезным и вы хотите поддержать мою работу, буду рад вашему донату. Любая помощь вдохновляет на создание нового контента! Спасибо за вашу поддержку!


ПОЛЕЗНЫЕ ССЫЛКИ

В этом ОГЛАВЛЕНИИ собраны и структурированы все материалы.

About & Contact || Услуги || Donate || Отказ от ответственности | ©


Subscribe to OdaNoder
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.