Docker стал одним из самых популярных инструментов в мире DevOps и контейнеризации приложений. С его помощью вы можете упаковать ваше приложение и все его зависимости в контейнер, который работает на любой совместимой с Docker платформе. Docker Compose, в свою очередь, позволяет управлять множеством контейнеров как одну систему. В этой статье мы разберем основы Docker и Docker Compose, а также рассмотрим основные команды и флаги.
Что такое Docker?
Docker - это платформа для контейнеризации приложений, которая позволяет упаковать приложение и его зависимости в единый контейнер. Этот контейнер можно запустить на любой системе, поддерживающей Docker, и он будет работать идентично независимо от окружения. Вот несколько ключевых понятий, которые вам следует знать:
- Образ (Image): Образ - это статический файл, содержащий все необходимое для запуска приложения, включая код, библиотеки и зависимости.
- Контейнер (Container): Контейнер - это экземпляр образа, который можно запустить и остановить.
- Docker Hub: Docker Hub - это облачное хранилище образов Docker, которое позволяет делиться и загружать образы.
Установка Docker
Прежде чем начать работу с Docker, вам нужно установить его на свой компьютер. Для разных операционных систем существуют разные инструкции. Вот основные шаги для установки на Linux(Ubuntu), ссылка на официальную документацию по установке:
Установка зависимостей:
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
Добавление ключа GPG Docker:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Добавление репозитория Docker:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Установка Docker:
sudo apt-get update
sudo apt-get install docker-ce
Проверка установки:
sudo docker --version
Теперь Docker должен быть установлен и готов к использованию.
Основные команды Docker
docker pull
Команда docker pull используется для загрузки образа с Docker Hub.
Например:
docker pull ubuntu:20.04 - Эта команда загрузит образ Ubuntu версии 20.04.
docker run
Команда docker run используется для запуска контейнера из образа.
Например:
docker run -it ubuntu:20.04 /bin/bash
-it: Флаги -it обеспечивают интерактивный режим и привязку к терминалу контейнера.
docker ps
Команда docker ps выводит список запущенных контейнеров. Добавление флага -a покажет все контейнеры, включая остановленные.
docker stop
Команда docker stop используется для остановки контейнера.
Например:
docker stop container_id
docker rm
Команда docker rm удаляет контейнер. Например:
docker rm container_id
docker images
Команда docker images выводит список загруженных образов.
docker rmi
Команда docker rmi удаляет образ. Например:
docker rmi image_id
docker exec
Команда docker exec используется для выполнения команды в запущенном контейнере. Например:
docker exec -it container_id /bin/bash
docker logs
Команда docker logs выводит логи контейнера. Например:
docker logs container_id
docker stats
Команда docker stats выводит статистику использования ресурсов контейнера.
docker stats container_id
Основные флаги Docker команд
Загрузка образа и создание контейнера
-t: Устанавливает имя и (при желании) тег образа. Например, -t myapp:latest задает имя "myapp" с тегом "latest".
Запуск контейнера
-d: Запускает контейнер в фоновом режиме (демон).
-i: Включает интерактивный режим (stdin) для контейнера.
-t: Подключает tty (терминал) контейнера к вашему терминалу.
Порты и сеть
-p: Пробрасывает порты между хостом и контейнером. Например, -p 8080:80 позволяет доступ к порту 80 контейнера через порт 8080 на хосте.
--network: Определяет сеть, к которой присоединен контейнер. Например, --network=my_network подключает контейнер к сети с именем "my_network".
Управление контейнерами
docker start: Запускает остановленный контейнер.
docker stop: Останавливает работающий контейнер.
docker restart: Перезапускает контейнер.
docker pause: Приостанавливает выполнение контейнера.
docker unpause: Возобновляет выполнение приостановленного контейнера.
docker kill: Прерывает выполнение контейнера насильно.
docker rm: Удаляет контейнер.
docker rmi: Удаляет образ.
Удаление контейнеров и образов
-f, --force: Принудительное удаление контейнера, даже если он запущен. Используется вместе с командой docker rm.
-v, --volumes: Удаление контейнера вместе с его привязанными Docker-томами (volumes). Используется вместе с командой docker rm.
-l, --link: Удаление контейнера и всех его связей с другими контейнерами. Используется вместе с командой docker rm.
-f, --force: Принудительное удаление образа, даже если он используется контейнерами. Используется вместе с командой docker rmi.
-q, --quiet: Вывод только идентификаторов образов без дополнительной информации. Используется вместе с командой docker rmi.
Флаги при запуске контейнера
-d: Запускает контейнер в фоновом режиме (демон).
-i: Включает интерактивный режим (stdin) для контейнера.
-t: Подключает tty (терминал) контейнера к вашему терминалу.
Эти флаги при запуске контейнера позволяют настраивать его режим работы для конкретных задач.
Что такое Docker Compose?
Docker Compose - это инструмент, который упрощает управление многоконтейнерными приложениями с использованием Docker. Он позволяет вам определить и настроить все контейнеры, сети и объемы для вашего приложения в одном файле конфигурации в формате YAML, а затем запустить их одной командой.
Установка Docker Compose
Прежде чем начать использовать Docker Compose, вам нужно убедиться, что он установлен на вашем компьютере. Если у вас еще нет Docker Compose, вы можете установить его следующим образом:
- Следуйте инструкциям для вашей операционной системы (Linux, macOS, Windows) и установите Docker Compose.
Создание файла docker-compose.yml
Для определения структуры вашего многоконтейнерного приложения с помощью Docker Compose, вам нужно создать файл docker-compose.yml. В этом файле вы описываете все контейнеры, сети, объемы и другие параметры вашего приложения.
Пример простого файла docker-compose.yml:
В этом примере мы определяем два сервиса: web и app. web использует образ Nginx и пробрасывает порт 80 контейнера на порт 80 хоста. app использует образ с именем myapp:latest и пробрасывает порт 5000 контейнера на порт 5000 хоста.
Основные команды Docker Compose
После создания файла docker-compose.yml, вы можете использовать следующие основные команды Docker Compose для управления вашим приложением:
- docker-compose up: Запускает приложение на основе файла docker-compose.yml. Если контейнеры не существуют, они будут созданы, и приложение будет запущено в фоновом режиме.
- docker-compose down: Останавливает и удаляет все контейнеры, сети и объемы, связанные с приложением, определенным в файле docker-compose.yml.
- docker-compose ps: Показывает статус всех сервисов, определенных в файле docker-compose.yml.
- docker-compose logs: Отображает логи всех сервисов в реальном времени.
- docker-compose exec <service-name> <command>: Запускает команду внутри контейнера сервиса. Например, docker-compose exec app bash запустит интерактивный shell в контейнере app.
Написание Dockerfile: Создание собственных образов Docker
Dockerfile - это текстовый файл, который содержит инструкции для создания Docker-образа. Образ Docker - это пакет, который включает в себя все необходимое для запуска контейнера, включая код, зависимости, переменные окружения и многое другое.
Структура Dockerfile
Dockerfile имеет следующую структуру:
# Комментарии начинаются с символа "#"
# Базовый образ
FROM base_image:tag
# Установка дополнительных пакетов
RUN apt-get update && apt-get install -y package_name
# Копирование файлов в образ
COPY source_path destination_path
# Установка переменных окружения
ENV variable_name=value
# Указание рабочей директории
WORKDIR /app
# Открытие порта
EXPOSE port_number
# Запуск команды при запуске контейнера
CMD ["command", "arg1", "arg2"]
Основные команды Dockerfile
FROM
Инструкция FROM указывает базовый образ, на основе которого будет создаваться ваш образ. Этот образ может быть официальным образом из репозитория Docker Hub или собранным другими пользователями. Пример:
FROM ubuntu:20.04
RUN
Инструкция RUN выполняет команду внутри контейнера во время создания образа. Это может использоваться для установки пакетов, обновления системы и выполнения других операций. Пример:
RUN apt-get update && apt-get install -y package_name
COPY
Инструкция COPY копирует файлы из исходной директории на вашем компьютере внутрь контейнера. Пример:
COPY source_path destination_path
ENV
Инструкция ENV устанавливает переменные окружения в контейнере. Это может быть использовано для настройки конфигурации приложения. Пример:
ENV MY_ENV_VARIABLE=my_value
WORKDIR
Инструкция WORKDIR устанавливает рабочую директорию для всех последующих инструкций в Dockerfile. Пример:
WORKDIR /app
EXPOSE
Инструкция EXPOSE указывает порт, который контейнер будет слушать при запуске. Однако это не пробрасывает порт на хост машину, это просто информационная метка. Пример:
EXPOSE 80
CMD
Инструкция CMD задает команду, которая будет выполнена при запуске контейнера. Это может быть команда запуска вашего приложения. Пример:
CMD ["command", "arg1", "arg2"]
Пример полного Dockerfile
Вот пример полного Dockerfile для простого веб-приложения на Node.js:
# Используем официальный образ Node.js
FROM node:14
# Создаем рабочую директорию внутри контейнера
WORKDIR /app
# Копируем файлы package.json и package-lock.json
COPY package*.json ./
Подписывайтесь, впереди еще много интересных статей!