Docker - Полное руководство для начинающих
Изучите Docker с нуля - от основ контейнеризации до создания собственных образов и развертывания приложений
Docker - Полное руководство для начинающих
Что такое Docker?
Docker - это платформа для разработки, доставки и запуска приложений с использованием контейнеризации. Контейнеры позволяют упаковать приложение со всеми его зависимостями в легковесную, переносимую единицу, которая может работать практически везде.
Основные преимущества Docker:
- Портативность - контейнеры работают одинаково на любой системе
- Изоляция - приложения не конфликтуют друг с другом
- Эффективность - контейнеры используют меньше ресурсов чем виртуальные машины
- Масштабируемость - легко создавать и управлять множеством экземпляров
Основные концепции
1. Контейнеры vs Виртуальные машины
Виртуальные машины:
- Эмулируют полную операционную систему
- Требуют много ресурсов (RAM, CPU, дисковое пространство)
- Медленный запуск
Контейнеры Docker:
- Используют ядро хостовой ОС
- Минимальное потребление ресурсов
- Быстрый запуск (секунды)
2. Ключевые компоненты
- Образ (Image) - шаблон для создания контейнеров
- Контейнер (Container) - запущенный экземпляр образа
- Dockerfile - инструкции для создания образа
- Docker Hub - облачный реестр образов
Установка Docker
Windows
- Скачайте Docker Desktop с официального сайта: https://www.docker.com/products/docker-desktop
- Запустите установщик и следуйте инструкциям
- Перезагрузите компьютер после установки
- Откройте Docker Desktop и дождитесь его запуска
macOS
- Скачайте Docker Desktop для Mac
- Перетащите Docker.app в папку Applications
- Запустите Docker из папки Applications
- Предоставьте необходимые разрешения
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 значительно упростит вашу работу с приложениями и их развертыванием.