Введение
Docker стал стандартом де-факто для контейнеризации приложений. В этой статье мы рассмотрим основы Docker и как использовать его в веб-разработке.
Преимущества Docker
- Изоляция: Каждое приложение в своем контейнере
- Портативность: Работает везде одинаково
- Масштабируемость: Легкое масштабирование приложений
- Версионирование: Контроль версий контейнеров
Что такое Docker?
Основные концепции
Особенности Docker
- Контейнеризация приложений
- Изоляция окружения
- Легкость развертывания
- Масштабируемость
Преимущества использования
- Единообразие окружений
- Быстрое развертывание
- Эффективное использование ресурсов
- Упрощение CI/CD
Начало работы
1. Установка Docker
Установка на Windows
1
2
| # Скачайте Docker Desktop с официального сайта
# https://www.docker.com/products/docker-desktop
|
Установка на Linux
1
2
3
4
5
6
7
| # Ubuntu/Debian
sudo apt-get update
sudo apt-get install docker.io docker-compose
# CentOS/RHEL
sudo yum install docker
sudo systemctl start docker
|
2. Основные команды
Работа с контейнерами
1
2
3
4
5
6
7
8
9
10
11
| # Запуск контейнера
docker run -d -p 3000:3000 my-app
# Просмотр запущенных контейнеров
docker ps
# Остановка контейнера
docker stop container_id
# Удаление контейнера
docker rm container_id
|
Работа с образами
1
2
3
4
5
6
7
8
| # Сборка образа
docker build -t my-app .
# Просмотр образов
docker images
# Удаление образа
docker rmi image_id
|
Dockerfile
1. Основы Dockerfile
Создание базового Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # Базовый образ
FROM node:14
# Рабочая директория
WORKDIR /app
# Копирование файлов
COPY package*.json ./
RUN npm install
COPY . .
# Открытие порта
EXPOSE 3000
# Команда запуска
CMD ["npm", "start"]
|
2. Оптимизация Dockerfile
Многоэтапная сборка
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # Этап сборки
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Этап запуска
FROM node:14-slim
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm install --production
EXPOSE 3000
CMD ["npm", "start"]
|
Docker Compose
1. Основы Docker Compose
Создание docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| version: '3'
services:
app:
build: .
ports:
- "3000:3000"
depends_on:
- db
environment:
- NODE_ENV=development
- DB_HOST=db
db:
image: postgres:13
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=myapp
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
|
2. Управление сервисами
Команды Docker Compose
1
2
3
4
5
6
7
8
9
10
11
| # Запуск сервисов
docker-compose up -d
# Остановка сервисов
docker-compose down
# Просмотр логов
docker-compose logs -f
# Пересборка сервисов
docker-compose up -d --build
|
Работа с сетями
1. Создание сетей
Определение сетей в docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| version: '3'
services:
app:
networks:
- frontend
- backend
db:
networks:
- backend
networks:
frontend:
backend:
|
2. Подключение к сетям
Ручное создание сети
1
2
3
4
5
| # Создание сети
docker network create my-network
# Подключение контейнера к сети
docker network connect my-network container_id
|
Работа с томами
1. Управление томами
Определение томов в docker-compose.yml
1
2
3
4
5
6
7
8
9
| version: '3'
services:
app:
volumes:
- ./src:/app/src
- node_modules:/app/node_modules
volumes:
node_modules:
|
2. Ручное управление томами
Команды для работы с томами
1
2
3
4
5
6
7
8
| # Создание тома
docker volume create my-volume
# Просмотр томов
docker volume ls
# Удаление тома
docker volume rm my-volume
|
Оптимизация
1. Оптимизация образов
Лучшие практики
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # Использование .dockerignore
node_modules
npm-debug.log
.git
.gitignore
# Кэширование слоев
COPY package*.json ./
RUN npm install
COPY . .
# Использование multi-stage builds
FROM node:14 AS builder
# ... этап сборки
FROM node:14-slim
# ... этап запуска
|
2. Оптимизация производительности
Настройки контейнера
1
2
3
4
5
6
7
8
9
10
| services:
app:
deploy:
resources:
limits:
cpus: '1'
memory: 1G
reservations:
cpus: '0.5'
memory: 512M
|
CI/CD интеграция
1. GitHub Actions
Настройка CI/CD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| name: Docker CI/CD
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build and push Docker image
run: |
docker build -t my-app .
docker push my-app
|
2. GitLab CI
Настройка pipeline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| stages:
- build
- deploy
build:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker build -t my-app .
- docker push my-app
deploy:
stage: deploy
script:
- docker-compose up -d
|
Мониторинг
1. Docker Stats
Просмотр статистики
1
2
3
4
5
| # Просмотр статистики контейнера
docker stats container_id
# Просмотр статистики всех контейнеров
docker stats
|
2. Логирование
Работа с логами
1
2
3
4
5
| # Просмотр логов контейнера
docker logs container_id
# Слежение за логами
docker logs -f container_id
|
Заключение
Docker предоставляет мощные инструменты для контейнеризации и развертывания веб-приложений. Используйте его для создания изолированных окружений, упрощения развертывания и масштабирования приложений.
Полезные ресурсы