Основы
March 7

Как пользоваться Docker (пособие новичка)

Введение

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

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

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

  • Образ (Image): это шаблон, содержащий всё, что нужно для работы приложения: операционную систему, зависимости, библиотеки, настройки. Образ можно представить как «чертёж», из которого запускаются контейнеры.
  • Контейнер (Container): это запущенный экземпляр образа. Он представляет собой изолированную среду, где работают приложения. Контейнеры легковесные и занимают меньше ресурсов, чем виртуальные машины.
  • Dockerfile: это текстовый файл, содержащий инструкции по созданию образа. С Dockerfile можно автоматизировать процесс настройки и сборки образов.
  • Volume: Это место для хранения данных, независимое от контейнера. Данные в Volume сохраняются, даже если контейнер перезапускается.

Установка Docker

Чтобы установить Docker, выполните следующие команды на системе с Ubuntu.

  • Обновите пакеты
sudo apt-get update
  • Установите Docker
sudo apt-get install -y docker.io
  • Проверьте успешность установки (это покажет установленную версию Docker)
docker --version

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

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

  • Загрузка образа из Docker Hub (в этом примере nginx — это название образа)
docker pull nginx
  • Запуск контейнера
docker run -d -p 8080:80 nginx
  • d запускает контейнер в фоновом режиме
  • p 8080:80 перенаправляет порт 8080 на хосте на порт 80 в контейнере
  • Политики перезапуска контейнера
docker run -d --restart always nginx

Политики перезапуска:

  • no: не перезапускать.
  • on-failure: перезапускать при ошибке.
  • always: всегда перезапускать.
  • unless-stopped: перезапускать, если не остановлено вручную.
  • Просмотр запущенных контейнеров
docker ps
  • Просмотр всех контейнеров, то есть даже остановленных
docker ps -a
  • Остановка контейнера
docker stop <ID контейнера>
  • Запуск контейнера
docker start <ID контейнера>
  • Перезапуск контейнера
docker restart <ID контейнера>
  • Удаление контейнера (перед удалением нужно остановить контейнер)
docker rm <ID контейнера>
  • Просмотр загруженных образов
docker images
  • Удаление образа
docker rmi <ID образа>
  • Просмотр логов контейнера
docker logs <ID контейнера>
  • "Живой" просмотр логов контейнера
docker logs -f <ID контейнера>
  • Последние строки логов контейнера (в данном случае покажет последние 100 строчек логов)
docker logs --tail 100 <ID контейнера>
  • Выполнение команды внутри контейнера
docker exec -it <ID контейнера> /bin/bash
  • Создание образа из Dockerfile
docker build -t my-custom-image .

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 для простого веб-сервера
# Указание базового образа
FROM nginx:alpine

# Копирование файлов в контейнер
COPY . /usr/share/nginx/html

# Открытие порта 80 для доступа
EXPOSE 80

# Запуск Nginx при старте контейнера
CMD ["nginx", "-g", "daemon off;"]

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

Для работы с контейнерами можно использовать как 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

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

  • docker-compose up -d: Запускает все сервисы из файла
  • docker-compose down: Останавливает и удаляет все контейнеры

Команды docker-compose работают только в той директории, где находится файл docker-compose.yml

Kubernetes: система для автоматизации развертывания и управления контейнерными приложениями в больших инфраструктурах.

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

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

  1. Created: контейнер создан, но не запущен
  2. Running: контейнер запущен и работает
  3. Exited: контейнер завершен (если завершился с ошибкой, это указывается)
  4. Paused: контейнер приостановлен
  5. Restarting: контейнер перезапускается после сбоя
  6. Dead: контейнер не завершился корректно
  • Просмотр статусов контейнеров
docker ps

Для просмотра всех контейнеров

docker ps -a

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

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

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

Работа с файлами .env

Файл .env хранит переменные окружения и позволяет передавать их в контейнеры, например, пароли, порты и конфигурации.

  • Пример .env файла
MYSQL_ROOT_PASSWORD=supersecretpassword
MYSQL_DATABASE=mydatabase
  • Использование с Docker Compose
version: '3'
services:
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
  • Передача переменных окружения через команду docker run
docker run -d -e MYSQL_ROOT_PASSWORD=supersecretpassword -e MYSQL_DATABASE=mydatabase mysql

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

Заключение

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