Пост

Docker для веб-разработчиков: контейнеризация приложений

Подробное руководство по Docker для веб-разработчиков. Изучите основы контейнеризации, создание Dockerfile, работу с Docker Compose и лучшие практики развертывания приложений.

Docker для веб-разработчиков: контейнеризация приложений

Введение

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 предоставляет мощные инструменты для контейнеризации и развертывания веб-приложений. Используйте его для создания изолированных окружений, упрощения развертывания и масштабирования приложений.

Полезные ресурсы

Авторский пост защищен лицензией CC BY 4.0 .