МАТЕРИАЛЫ КУРСА
СИИ • НАВИГАЦИЯ

Docker - Полное руководство для начинающих

Изучите Docker с нуля - от основ контейнеризации до создания собственных образов и развертывания приложений

~15 МИН ЧТЕНИЯ
ОБНОВЛЕНО НЕДАВНО

Docker - Полное руководство для начинающих

Что такое Docker?

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

Основные преимущества Docker:

  • Портативность - контейнеры работают одинаково на любой системе
  • Изоляция - приложения не конфликтуют друг с другом
  • Эффективность - контейнеры используют меньше ресурсов чем виртуальные машины
  • Масштабируемость - легко создавать и управлять множеством экземпляров

Основные концепции

1. Контейнеры vs Виртуальные машины

Виртуальные машины:

  • Эмулируют полную операционную систему
  • Требуют много ресурсов (RAM, CPU, дисковое пространство)
  • Медленный запуск

Контейнеры Docker:

  • Используют ядро хостовой ОС
  • Минимальное потребление ресурсов
  • Быстрый запуск (секунды)

2. Ключевые компоненты

  • Образ (Image) - шаблон для создания контейнеров
  • Контейнер (Container) - запущенный экземпляр образа
  • Dockerfile - инструкции для создания образа
  • Docker Hub - облачный реестр образов

Установка Docker

Windows

  1. Скачайте Docker Desktop с официального сайта: https://www.docker.com/products/docker-desktop
  2. Запустите установщик и следуйте инструкциям
  3. Перезагрузите компьютер после установки
  4. Откройте Docker Desktop и дождитесь его запуска

macOS

  1. Скачайте Docker Desktop для Mac
  2. Перетащите Docker.app в папку Applications
  3. Запустите Docker из папки Applications
  4. Предоставьте необходимые разрешения

Linux (Ubuntu/Debian)

# Обновление пакетов
sudo apt update

# Установка зависимостей
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release

# Добавление GPG ключа Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Добавление репозитория Docker
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Установка Docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

# Добавление пользователя в группу docker
sudo usermod -aG docker $USER

# Перелогиньтесь для применения изменений

Проверка установки

# Проверка версии Docker
docker --version

# Запуск тестового контейнера
docker run hello-world

Первые шаги с Docker

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

1. Работа с образами

# Поиск образов в Docker Hub
docker search nginx

# Загрузка образа
docker pull nginx

# Просмотр локальных образов
docker images

# Удаление образа
docker rmi nginx

2. Работа с контейнерами

# Запуск контейнера
docker run nginx

# Запуск в фоновом режиме
docker run -d nginx

# Запуск с именем
docker run --name my-nginx -d nginx

# Запуск с проброской портов
docker run -p 8080:80 -d nginx

# Просмотр запущенных контейнеров
docker ps

# Просмотр всех контейнеров (включая остановленные)
docker ps -a

# Остановка контейнера
docker stop my-nginx

# Запуск остановленного контейнера
docker start my-nginx

# Удаление контейнера
docker rm my-nginx

# Принудительное удаление запущенного контейнера
docker rm -f my-nginx

3. Интерактивная работа

# Запуск контейнера с интерактивным терминалом
docker run -it ubuntu bash

# Подключение к запущенному контейнеру
docker exec -it my-nginx bash

# Выход из контейнера без его остановки
# Нажмите Ctrl+P, затем Ctrl+Q

Создание собственных образов

Dockerfile

Dockerfile - это текстовый файл с инструкциями для создания образа.

Пример простого Dockerfile:

# Базовый образ
FROM node:18-alpine

# Установка рабочей директории
WORKDIR /app

# Копирование файлов зависимостей
COPY package*.json ./

# Установка зависимостей
RUN npm install

# Копирование исходного кода
COPY . .

# Открытие порта
EXPOSE 3000

# Команда запуска
CMD ["npm", "start"]

Основные инструкции Dockerfile:

  • FROM - базовый образ
  • WORKDIR - рабочая директория
  • COPY - копирование файлов в образ
  • RUN - выполнение команд при сборке
  • EXPOSE - указание портов
  • CMD - команда по умолчанию
  • ENTRYPOINT - точка входа в контейнер
  • ENV - переменные окружения
  • ARG - аргументы сборки

Сборка образа

# Сборка образа из Dockerfile
docker build -t my-app .

# Сборка с указанием Dockerfile
docker build -f Dockerfile.dev -t my-app-dev .

# Сборка без кэша
docker build --no-cache -t my-app .

Практические примеры

Пример 1: Веб-сервер Nginx

# Запуск Nginx с пробросом портов и статическими файлами
docker run -d \
  --name my-website \
  -p 8080:80 \
  -v /path/to/website:/usr/share/nginx/html \
  nginx

Пример 2: База данных PostgreSQL

# Запуск PostgreSQL с переменными окружения
docker run -d \
  --name my-postgres \
  -e POSTGRES_PASSWORD=mypassword \
  -e POSTGRES_DB=mydb \
  -p 5432:5432 \
  -v postgres_data:/var/lib/postgresql/data \
  postgres:15

Пример 3: Node.js приложение

Создайте файл package.json:

{
  "name": "docker-node-app",
  "version": "1.0.0",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "express": "^4.18.0"
  }
}

Создайте файл server.js:

const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;

app.get('/', (req, res) => {
  res.send('Hello Docker!');
});

app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

Создайте Dockerfile:

FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

Соберите и запустите:

# Сборка
docker build -t my-node-app .

# Запуск
docker run -p 3000:3000 my-node-app

Работа с томами (Volumes)

Тома позволяют сохранять данные между перезапусками контейнеров.

Типы монтирования:

1. Именованные тома (Named Volumes)

# Создание тома
docker volume create my-volume

# Использование тома
docker run -d -v my-volume:/data ubuntu

# Просмотр томов
docker volume ls

# Удаление тома
docker volume rm my-volume

2. Bind Mounts

# Монтирование локальной папки
docker run -d -v /host/path:/container/path ubuntu

# Пример с веб-сайтом
docker run -d -p 8080:80 -v $(pwd)/html:/usr/share/nginx/html nginx

Сетевое взаимодействие

Типы сетей Docker:

  • bridge - сеть по умолчанию
  • host - использует сеть хоста
  • none - без сетевого доступа
# Создание сети
docker network create my-network

# Запуск контейнеров в сети
docker run -d --network my-network --name app1 nginx
docker run -d --network my-network --name app2 nginx

# Просмотр сетей
docker network ls

# Подробная информация о сети
docker network inspect my-network

Полезные команды для отладки

# Просмотр логов контейнера
docker logs my-container

# Следить за логами в реальном времени
docker logs -f my-container

# Просмотр ресурсов
docker stats

# Информация о контейнере
docker inspect my-container

# Копирование файлов из/в контейнер
docker cp file.txt my-container:/path/
docker cp my-container:/path/file.txt ./

Лучшие практики

1. Оптимизация образов

# Используйте минимальные базовые образы
FROM node:18-alpine

# Группируйте команды RUN
RUN apt-get update && \
    apt-get install -y package1 package2 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Используйте .dockerignore
# Создайте файл .dockerignore:
# node_modules
# .git
# *.log

2. Безопасность

# Не запускайте процессы от root
RUN adduser -D -s /bin/sh myuser
USER myuser

# Используйте COPY вместо ADD
COPY package*.json ./

# Устанавливайте только необходимые пакеты

3. Многоэтапная сборка

# Этап сборки
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# Продакшн этап
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html

Очистка ресурсов

# Удаление всех остановленных контейнеров
docker container prune

# Удаление неиспользуемых образов
docker image prune

# Удаление неиспользуемых томов
docker volume prune

# Удаление всего неиспользуемого
docker system prune

# Полная очистка (включая используемые ресурсы)
docker system prune -a

Заключение

Docker - это мощный инструмент, который революционизировал способ разработки и развертывания приложений. Основные преимущества:

  • Консистентность - одинаковое поведение в разных средах
  • Изоляция - независимость приложений
  • Портативность - работа на любой платформе
  • Эффективность - оптимальное использование ресурсов

Начните с простых примеров и постепенно изучайте более сложные сценарии. Docker значительно упростит вашу работу с приложениями и их развертыванием.

ВСЕ МАТЕРИАЛЫ