Что такое Docker и зачем он нужен веб-разработчику?

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

Преимущества Docker для веб-разработки:

  • Единая среда разработки: Одинаковая среда на всех машинах (локально, на staging, на production)
  • Изоляция зависимостей: Каждый проект в своем контейнере со своими версиями PHP, Node.js и т.д.
  • Быстрый старт: Новый разработчик может запустить проект одной командой
  • Масштабируемость: Легко масштабировать приложение, добавляя новые контейнеры
  • Упрощение деплоя: Один контейнер работает везде одинаково

Важно: Docker — не виртуальная машина! Контейнеры разделяют ядро ОС хоста, что делает их в разы легче и быстрее.

Установка Docker на разные ОС

Установка на Windows:

Скачайте Docker Desktop с официального сайта docker.com, установите и перезагрузите компьютер.

Установка на macOS:

# Установка через Homebrew
brew install --cask docker

# Или скачайте с официального сайта

Установка на Linux (Ubuntu/Debian):

# Обновляем пакеты
sudo apt update

# Устанавливаем необходимые пакеты
sudo apt install apt-transport-https ca-certificates curl software-properties-common

# Добавляем GPG ключ Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# Добавляем репозиторий Docker
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# Устанавливаем Docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

# Проверяем установку
docker --version

Внимание для Linux: После установки нужно добавить пользователя в группу docker:

sudo usermod -aG docker $USER
# Выйдите и зайдите в систему заново

Основные команды Docker для веб-разработчика

docker —version

Проверка версии Docker

docker ps

Список запущенных контейнеров (добавьте -a для показа всех контейнеров)

docker images

Список доступных образов

docker run -d -p 80:80 nginx

Запуск контейнера nginx в фоновом режиме на порту 80

docker stop container_id

Остановка контейнера по его ID

docker rm container_id

Удаление остановленного контейнера

docker rmi image_id

Удаление образа

docker exec -it container_id bash

Вход в запущенный контейнер (интерактивный режим)

docker logs container_id

Просмотр логов контейнера

docker build -t myapp .

Сборка Docker образа из Dockerfile

Практический пример: Запуск тестового веб-сервера

# Запускаем контейнер с nginx на порту 8080
docker run -d -p 8080:80 --name my-nginx nginx

# Проверяем в браузере: http://localhost:8080

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

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

Создание Dockerfile для веб-приложения

Dockerfile — это инструкция для сборки Docker-образа. Рассмотрим пример для PHP-приложения:

# Dockerfile для PHP 8.2 + Apache
FROM php:8.2-apache

# Устанавливаем системные зависимости
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip \
    && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd

# Включаем модуль Apache rewrite
RUN a2enmod rewrite

# Копируем исходный код
COPY . /var/www/html/

# Устанавливаем рабочую директорию
WORKDIR /var/www/html

# Устанавливаем Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Устанавливаем зависимости PHP
RUN composer install --no-dev --optimize-autoloader

# Меняем владельца файлов
RUN chown -R www-data:www-data /var/www/html

# Открываем порт 80
EXPOSE 80

# Команда запуска
CMD ["apache2-foreground"]

Сборка и запуск образа:

# Собираем образ с тегом my-php-app
docker build -t my-php-app .

# Запускаем контейнер из образа
docker run -d -p 8000:80 --name php-app my-php-app

Docker Compose для веб-проектов

Docker Compose позволяет описывать многоконтейнерные приложения в YAML-файле. Идеально для веб-разработки с базой данных, кэшем и другими сервисами.

# docker-compose.yml для веб-проекта
version: '3.8'

services:
  # Веб-сервер
  web:
    build: .
    ports:
      - "8080:80"
    volumes:
      - .:/var/www/html
    depends_on:
      - db
      - redis
    environment:
      DB_HOST: db
      REDIS_HOST: redis

  # База данных MySQL
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: myapp
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    volumes:
      - mysql_data:/var/lib/mysql

  # Redis для кэширования
  redis:
    image: redis:alpine

volumes:
  mysql_data:

Основные команды Docker Compose:

  • docker-compose up -d — Запуск всех сервисов в фоновом режиме
  • docker-compose down — Остановка и удаление всех сервисов
  • docker-compose logs -f — Просмотр логов в реальном времени
  • docker-compose ps — Показать статус всех сервисов
  • docker-compose exec service_name bash — Войти в контейнер сервиса

Практический пример: PHP + MySQL проект

Создайте структуру проекта:

my-php-project/
├── docker-compose.yml
├── Dockerfile
├── src/
│   └── index.php
└── nginx/
    └── default.conf

docker-compose.yml:

version: '3.8'

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./src:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php

  php:
    build: .
    volumes:
      - ./src:/var/www/html

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: app_db
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

Dockerfile для PHP-FPM:

FROM php:8.2-fpm
RUN docker-php-ext-install pdo pdo_mysql
WORKDIR /var/www/html

Запуск проекта:

# Запускаем все сервисы
docker-compose up -d

# Проект будет доступен по http://localhost

Пример: Docker для Node.js приложения

Dockerfile для Node.js:

# Используем официальный образ Node.js
FROM node:18-alpine

# Создаем рабочую директорию
WORKDIR /app

# Копируем package.json и package-lock.json
COPY package*.json ./

# Устанавливаем зависимости
RUN npm ci --only=production

# Копируем исходный код
COPY . .

# Открываем порт приложения
EXPOSE 3000

# Команда запуска
CMD ["node", "server.js"]

.dockerignore файл (обязательно создайте):

node_modules
npm-debug.log
Dockerfile
.dockerignore
.git
.gitignore
.env
README.md

Лучшие практики использования Docker

1. Используйте .dockerignore

Исключайте ненужные файлы из образа для уменьшения его размера.

2. Многоступенчатая сборка для продакшена

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

# Этап продакшн
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80

3. Не запускайте контейнеры от root

FROM node:18-alpine
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nodejs -u 1001
USER nodejs  # Переключаемся на непривилегированного пользователя
WORKDIR /app
4. Оптимизируйте слои кэширования

Располагайте команды в Dockerfile от редко меняющихся к часто меняющимся.

5. Используйте специфичные теги образов

Вместо node:latest используйте node:18-alpine для предсказуемости.

Docker — это мощный инструмент, который значительно упрощает жизнь веб-разработчика. С его помощью вы можете:

  • Создавать изолированные среды для каждого проекта
  • Избегать проблем с зависимостями и версиями ПО
  • Быстро разворачивать сложные инфраструктуры
  • Обеспечивать идентичность сред разработки и продакшена

С чего начать:

  1. Установите Docker на свой компьютер
  2. Попробуйте запустить простой контейнер: docker run hello-world
  3. Создайте Dockerfile для своего текущего проекта
  4. Настройте docker-compose.yml для локальной разработки
  5. Изучайте продвинутые темы: volumes, networks, Docker Swarm