Сервера
August 29

Введение в Docker


Что это такое и как с ним работать?

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

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

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

Основные компоненты Docker

  1. Docker Engine: Основной компонент Docker, который позволяет создавать, запускать и управлять контейнерами.
  2. Образы (Images): Шаблоны для создания контейнеров. Образ включает все необходимое для работы приложения — код, библиотеки, переменные окружения, файлы конфигурации и т.д.
  3. Контейнеры: Запущенные экземпляры образов. Каждый контейнер работает изолированно от других контейнеров и от хоста.
  4. Docker Hub: Облачное хранилище образов. Здесь можно найти и загрузить готовые образы для различных приложений.

Dockerfile: Что это такое и для чего нужно?

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

Для чего нужен Dockerfile?

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

Основные команды Dockerfile

  • FROM: Задает базовый образ, на основе которого будет создаваться новый образ.
    FROM ubuntu:20.04
  • COPY: Копирует файлы с хост-машины в контейнер.
    COPY . /app
  • RUN: Выполняет команды на этапе сборки образа (например, установка пакетов).
    RUN apt-get update && apt-get install -y nginx
  • CMD: Задает команду, которая будет выполнена при запуске контейнера.
    CMD ["nginx", "-g", "daemon off;"]
  • EXPOSE: Указывает, какие порты должны быть доступны из контейнера.
    EXPOSE 80

Вот небольшой пример Dockerfile, который создает образ для простого веб-сервера на базе Nginx:

# Указываем базовый образ
FROM nginx:alpine

# Копируем содержимое текущей директории на хосте в директорию /usr/share/nginx/html в контейнере
COPY . /usr/share/nginx/html

# Открываем порт 80 для доступа к веб-серверу
EXPOSE 80

# Устанавливаем команду для запуска Nginx при старте контейнера
CMD ["nginx", "-g", "daemon off;"]

Установка Docker

Docker поддерживается на большинстве популярных операционных систем: Windows, macOS и различных дистрибутивах Linux. Процесс установки отличается в зависимости от ОС, но в большинстве случаев достаточно следовать официальной документации на сайте Docker.

Основные команды Docker

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

  1. docker pull [имя образа]: Загружает образ из Docker Hub на вашу машину.
    docker pull nginx
  2. docker run [опции] [имя образа]: Создает и запускает контейнер из образа.
    docker run -d -p 8080:80 nginx
    • -d запускает контейнер в фоновом режиме.
    • -p 8080:80 перенаправляет порт 8080 на хосте на порт 80 в контейнере.
    • --restart [политика]: Опция, которая определяет, будет ли Docker автоматически перезапускать контейнер в случае его сбоя или остановки. Примеры политики:
      docker run -d --restart always nginx
      • no — (по умолчанию) не перезапускать контейнер.
      • on-failure — перезапускать контейнер, если он завершился с ошибкой (не с кодом 0).
      • always — всегда перезапускать контейнер, даже если он был остановлен вручную.
      • unless-stopped — перезапускать контейнер всегда, за исключением случаев, когда он был остановлен вручную.
  3. docker ps: Показывает список запущенных контейнеров.
    docker ps
    • docker ps -a: Показывает список всех контейнеров, включая остановленные и завершенные.
      docker ps -a
  4. docker stop [ID контейнера]: Останавливает запущенный контейнер.
    docker stop c3f279d17e0a
  5. docker start [ID контейнера]: Запускает остановленный контейнер.
  6. docker restart [ID контейнера]: Перезапускает контейнер
  7. docker rm [ID контейнера]: Удаляет остановленный контейнер.
    docker rm c3f279d17e0a
  8. docker images: Показывает список всех загруженных образов.
    docker images
  9. docker rmi [ID образа]: Удаляет образ с вашей машины.
    docker rmi 7d9495d03763
  10. docker logs [ID контейнера]: Выводит логи контейнера.
    • docker logs -f [ID контейнера]: Включает «живой» просмотр логов контейнера в реальном времени.
      docker logs -f c3f279d17e0a
    • docker logs --tail [число строк] [ID контейнера]: Выводит последние N строк логов контейнера.
      docker logs --tail 100 c3f279d17e0a
  11. docker exec -it [ID контейнера] [команда]: Позволяет выполнить команду внутри запущенного контейнера. Часто используется для доступа к командной строке контейнера.
    docker exec -it c3f279d17e0a /bin/bash
  12. docker build [опции] [путь к Dockerfile]: Создает Docker-образ на основе Dockerfile, находящегося в указанной директории.
    docker build -t my-custom-image .
  • -t my-custom-image задает имя создаваемому образу.
  • . указывает на текущую директорию, где находится Dockerfile.

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

Для управления контейнерами можно использовать команды Docker CLI или специальные оркестрационные инструменты, такие как Docker Compose или Kubernetes.

  1. Docker Compose: Инструмент для управления многоконтейнерными приложениями. Он позволяет описывать многоконтейнерное приложение с помощью YAML-файла.
    • Пример docker-compose.yml:
      version: '3' services: web: image: nginx ports: - "8080:80" restart: always db: image: mysql environment: MYSQL_ROOT_PASSWORD: example restart: on-failure
    • Команды:
      • docker-compose up -d — Запускает все сервисы, описанные в docker-compose.yml.
      • docker-compose down — Останавливает и удаляет все контейнеры, созданные docker-compose.
  2. Kubernetes: Система для автоматизации развертывания, масштабирования и управления контейнеризированными приложениями. Подходит для управления большими и сложными инфраструктурами.

Статусы контейнеров

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

  1. Created: Контейнер был создан, но еще не запущен.
  2. Running: Контейнер запущен и выполняется.
  3. Exited: Контейнер завершил свою работу. Если контейнер завершился с ошибкой, это также будет указано в статусе.
  4. Paused: Контейнер был приостановлен и временно не выполняет никаких операций.
  5. Restarting: Контейнер перезапускается после сбоя или по заданной политике перезапуска.
  6. Dead: Контейнер в состоянии "мертвый", что означает, что произошла ошибка при завершении контейнера или его удалении.

Для проверки статусов контейнеров используйте команду docker ps или docker ps -a для просмотра всех контейнеров.

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

Контейнеры Docker по своей природе эфемерны, то есть их состояние не сохраняется после остановки и удаления. Чтобы сохранить данные, используются тома (volumes) или bind mounts.

  • Тома (Volumes): Специальные директории, управляемые Docker, которые могут быть смонтированы в контейнер. Они остаются на хосте, даже если контейнер удален.
    docker run -v /data:/var/lib/mysql mysql
  • Bind mounts: Связывают директорию хоста с директорией контейнера.
    docker run -v /path/on/host:/path/in/container nginx

Работа с .env файлами и передача переменных окружения в Docker

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

Как использовать .env файл с Docker?

  1. Создание .env файла: В корневой директории вашего проекта создайте файл .env и укажите в нем переменные окружения в формате ключ=значение
MYSQL_ROOT_PASSWORD=supersecretpassword 
MYSQL_DATABASE=mydatabase 

2. Использование с Docker Compose: Docker Compose автоматически загружает переменные из .env файла и передает их в ваши сервисы

version: '3'
services: 
  db:
    image: mysql 
    environment: 
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} 
      MYSQL_DATABASE: ${MYSQL_DATABASE} 

3. Передача переменных окружения через аргумент -e в docker run: Переменные окружения также можно передавать напрямую при запуске контейнера с помощью опции -e.

docker run -d -e MYSQL_ROOT_PASSWORD=supersecretpassword -e MYSQL_DATABASE=mydatabase mysql 

В этом примере -e указывает Docker, что нужно задать переменные окружения MYSQL_ROOT_PASSWORD и MYSQL_DATABASE в контейнере.

4. Передача переменных в Dockerfile: Можно использовать переменные окружения из .env файла и в Dockerfile, если задать их через ARG и ENV.

ARG MYSQL_ROOT_PASSWORD 
ENV MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} 

Полезные команды и опции Docker

  1. docker ps -a: Показывает все контейнеры, включая остановленные.
  2. docker logs -f [ID контейнера]: «Живой» просмотр логов контейнера.
  3. docker logs --tail [число строк] [ID контейнера]: Вывод последних N строк логов.
  4. docker exec -it [ID контейнера] /bin/bash: Доступ к командной строке контейнера.
  5. docker inspect [ID контейнера]: Выводит детальную информацию о контейнере или образе в формате JSON.
  6. docker cp [ID контейнера]:/path/in/container /path/on/host: Копирует файлы из контейнера на хост.
    docker cp c3f279d17e0a:/app/logs ./logs
  7. docker run --restart [политика] [имя образа]: Устанавливает политику автоматического перезапуска контейнера.

Заключение

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

Наш телеграмм канал по нодам — https://t.me/g7monitor
Наш чат по нодам — https://t.me/g7team_chat