1. Знакомство с Docker
Docker — это открытая платформа для разработки, доставки и запуска приложений. Она позволяет отделить приложения от инфраструктуры, чтобы обеспечить более быструю доставку и эффективное масштабирование. Docker упаковывает программное обеспечение в контейнеры — стандартизированные исполняемые компоненты, которые объединяют исходный код приложения с библиотеками операционной системы и зависимостями, необходимыми для запуска этого кода в любой среде.
2. Архитектура Docker
2.1 Демон Docker
- Демон Docker (dockerd) работает на хост-компьютере и управляет объектами Docker, такими как образы, контейнеры, сети и тома.
- Демон прослушивает запросы Docker API и управляет объектами Docker.
2.2 Клиент Docker
- Клиент Docker (docker) — это то, как большинство пользователей взаимодействуют с Docker. Он отправляет команды демону Docker через интерфейс командной строки или API Docker.
- Один клиент может взаимодействовать с несколькими демонами.
2.3 Образы Docker
- Образ Docker — это шаблон только для чтения с инструкциями по созданию контейнера Docker. Он содержит код приложения, системные библиотеки и зависимости.
- Слои: каждая команда в Dockerfile создает новый слой в образе, который хранится в формате, пригодном для повторного использования.
2.4 Контейнеры Docker
- Docker-контейнер — это исполняемый экземпляр образа Docker. Он работает как отдельный процесс на вашем хост-компьютере.
- Контейнеры легковесны и портативны, они инкапсулируют код и его зависимости.
2.5 Реестр Docker
- Реестр Docker — это хранилище, в котором содержатся образы Docker. Docker Hub — это общедоступный реестр по умолчанию.
- Вы можете создавать частные реестры для внутреннего использования.
3. Docker Compose
3.1 Что такое Docker Compose?
Docker Compose — это инструмент для определения и запуска многоконтейнерных приложений Docker. С помощью Docker Compose вы можете настроить все службы вашего приложения (базы данных, кэши, бэкенд, фронтенд) в одном файле YAML (docker-compose.yml).
3.2 Архитектура Docker Compose
- Сервисы: каждый сервис в docker-compose.yml определяет контейнер.
- Сети: используются для определения способов взаимодействия различных сервисов (контейнеров) друг с другом.
- Тома: обеспечивают сохранение данных путем подключения хранилища к контейнерам.
3.3 Команды Docker Compose
- Запуск служб: docker-compose up
- Остановка служб: docker-compose down
- Создание служб: docker-compose build
- Просмотр запущенных служб: docker-compose ps
- Масштабирование служб: docker-compose scale <service>=<number_of_instances>
# Example docker-compose.yml file
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
4. Ежедневные команды Docker
4.1 Управление образами
- Список всех образов: docker images
- Получить образ из реестра: docker pull <image_name>
- Удалить образ: docker rmi <image_name>
4.2 Управление контейнерами
- Список всех контейнеров: docker ps или docker ps -a (для всех, включая остановленные)
- Запустить контейнер: docker start <container_id>
- Остановить контейнер: docker stop <container_id>
- Запустить новый контейнер: docker run -d -p <host_port>:<container_port> <image_name>
- Просмотреть логи контейнера: docker logs <container_id>
- Удалить контейнер: docker rm <container_id>
4.3 Управление объёмами
- Список томов: docker volume ls
- Создать том: docker volume create <volume_name>
- Удалить том: docker volume rm <volume_name>
4.4 Управление сетями
- Список сетей: docker network ls
- Создать сеть: docker network create <network_name>
- Удалить сеть: docker network rm <network_name>
5. Разбор Dockerfile
Dockerfile — это скрипт, содержащий ряд инструкций по созданию образа Docker.
# Example Dockerfile
# 1. Specify a base image
FROM python:3.9-slim
# 2. Set environment variables (optional)
ENV PYTHONUNBUFFERED=1
# 3. Copy the application code into the container
COPY . /app
# 4. Set the working directory
WORKDIR /app
# 5. Install dependencies
RUN pip install -r requirements.txt
# 6. Expose a port (optional)
EXPOSE 5000
# 7. Define the command to run the application
CMD ["python", "app.py"]
Ключевые команды и параметры Dockerfile:
- FROM: определяет базовый образ для последующих инструкций. Каждый Dockerfile должен начинаться с инструкции FROM .
FROM ubuntu:latest
- RUN: выполняет команду в контейнере во время сборки образа (например, установку пакетов).
RUN apt-get update && apt-get install -y nginx
- COPY: копирует файлы из файловой системы хоста в контейнер.
COPY ./src /app/src
- WORKDIR: устанавливает рабочий каталог внутри контейнера для последующих инструкций.
WORKDIR /app
- EXPOSE: сообщает Docker, что контейнер будет прослушивать указанный сетевой порт во время выполнения.
EXPOSE 8080
- CMD: указывает команду по умолчанию для запуска в контейнере. Если пользователь запускает контейнер без указания команды, она будет выполнена.
CMD ["python", "app.py"]
- ENTRYPOINT: аналогично CMD, но определяет команду, которая всегда выполняется, даже если в контейнер передаются аргументы.
ENTRYPOINT ["python"]
CMD ["app.py"]
- ENV: устанавливает переменные среды внутри контейнера.
ENV MYSQL_ROOT_PASSWORD=secret
6. Заключение
Docker предоставляет оптимизированную среду для согласованного и масштабируемого управления приложениями и их развертывания. Понимание архитектуры Docker, освоение повседневных команд Docker, использование Docker Compose для приложений с несколькими контейнерами и создание эффективных Docker-файлов помогут вам оптимизировать разработку, упростить развертывание и обеспечить бесперебойную работу приложений в различных средах.