Введение в Docker
Что это такое и как с ним работать?
Docker — это платформа для разработки, доставки и запуска приложений в контейнерах. Контейнеры позволяют упаковать приложение вместе с его зависимостями и окружением, обеспечивая единообразие выполнения на любом компьютере.
Что такое контейнеры?
Контейнеры — это легковесные, изолированные среды, которые можно запустить на любой машине, где установлен Docker. В отличие от виртуальных машин, контейнеры используют ядро операционной системы хост-машины, что делает их более эффективными с точки зрения ресурсов.
Основные компоненты Docker
- Docker Engine: Основной компонент Docker, который позволяет создавать, запускать и управлять контейнерами.
- Образы (Images): Шаблоны для создания контейнеров. Образ включает все необходимое для работы приложения — код, библиотеки, переменные окружения, файлы конфигурации и т.д.
- Контейнеры: Запущенные экземпляры образов. Каждый контейнер работает изолированно от других контейнеров и от хоста.
- 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, вы можете использовать следующие команды для работы с ним:
- docker pull [имя образа]: Загружает образ из Docker Hub на вашу машину.
docker pull nginx - 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— перезапускать контейнер всегда, за исключением случаев, когда он был остановлен вручную.- docker ps: Показывает список запущенных контейнеров.
docker ps - docker stop [ID контейнера]: Останавливает запущенный контейнер.
docker stop c3f279d17e0a - docker start [ID контейнера]: Запускает остановленный контейнер.
- docker restart [ID контейнера]: Перезапускает контейнер
- docker rm [ID контейнера]: Удаляет остановленный контейнер.
docker rm c3f279d17e0a - docker images: Показывает список всех загруженных образов.
docker images - docker rmi [ID образа]: Удаляет образ с вашей машины.
docker rmi 7d9495d03763 - docker logs [ID контейнера]: Выводит логи контейнера.
- docker logs -f [ID контейнера]: Включает «живой» просмотр логов контейнера в реальном времени.
docker logs -f c3f279d17e0a - docker logs --tail [число строк] [ID контейнера]: Выводит последние N строк логов контейнера.
docker logs --tail 100 c3f279d17e0a - docker exec -it [ID контейнера] [команда]: Позволяет выполнить команду внутри запущенного контейнера. Часто используется для доступа к командной строке контейнера.
docker exec -it c3f279d17e0a /bin/bash - docker build [опции] [путь к Dockerfile]: Создает Docker-образ на основе Dockerfile, находящегося в указанной директории.
docker build -t my-custom-image .
-t my-custom-imageзадает имя создаваемому образу..указывает на текущую директорию, где находится Dockerfile.
Управление контейнерами
Для управления контейнерами можно использовать команды Docker CLI или специальные оркестрационные инструменты, такие как Docker Compose или Kubernetes.
- 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 - Команды:
- Kubernetes: Система для автоматизации развертывания, масштабирования и управления контейнеризированными приложениями. Подходит для управления большими и сложными инфраструктурами.
Статусы контейнеров
Контейнеры в Docker могут находиться в различных состояниях, которые отражают их текущий статус:
- Created: Контейнер был создан, но еще не запущен.
- Running: Контейнер запущен и выполняется.
- Exited: Контейнер завершил свою работу. Если контейнер завершился с ошибкой, это также будет указано в статусе.
- Paused: Контейнер был приостановлен и временно не выполняет никаких операций.
- Restarting: Контейнер перезапускается после сбоя или по заданной политике перезапуска.
- 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?
- Создание .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
- docker ps -a: Показывает все контейнеры, включая остановленные.
- docker logs -f [ID контейнера]: «Живой» просмотр логов контейнера.
- docker logs --tail [число строк] [ID контейнера]: Вывод последних N строк логов.
- docker exec -it [ID контейнера] /bin/bash: Доступ к командной строке контейнера.
- docker inspect [ID контейнера]: Выводит детальную информацию о контейнере или образе в формате JSON.
- docker cp [ID контейнера]:/path/in/container /path/on/host: Копирует файлы из контейнера на хост.
docker cp c3f279d17e0a:/app/logs ./logs - docker run --restart [политика] [имя образа]: Устанавливает политику автоматического перезапуска контейнера.
Заключение
Docker — мощный инструмент для разработки и развертывания приложений. С его помощью вы можете изолировать свои приложения, создавать их переносимые образы и управлять инфраструктурой с меньшими затратами. Основные преимущества Docker — это скорость, гибкость и простота в использовании. Начав с простых команд, вы быстро освоите основные концепции и сможете перейти к более сложным задачам, таким как оркестрация и масштабирование контейнеров.
Наш телеграмм канал по нодам — https://t.me/g7monitor
Наш чат по нодам — https://t.me/g7team_chat