Docker для веб-разработчика
Что такое 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
Список запущенных контейнеров (добавьте -a для показа всех контейнеров)
Список доступных образов
Запуск контейнера nginx в фоновом режиме на порту 80
Остановка контейнера по его ID
Удаление остановленного контейнера
Удаление образа
Вход в запущенный контейнер (интерактивный режим)
Просмотр логов контейнера
Сборка 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
Располагайте команды в Dockerfile от редко меняющихся к часто меняющимся.
5. Используйте специфичные теги образов
Вместо node:latest используйте node:18-alpine для предсказуемости.
Docker — это мощный инструмент, который значительно упрощает жизнь веб-разработчика. С его помощью вы можете:
- Создавать изолированные среды для каждого проекта
- Избегать проблем с зависимостями и версиями ПО
- Быстро разворачивать сложные инфраструктуры
- Обеспечивать идентичность сред разработки и продакшена
С чего начать:
- Установите Docker на свой компьютер
- Попробуйте запустить простой контейнер:
docker run hello-world - Создайте Dockerfile для своего текущего проекта
- Настройте docker-compose.yml для локальной разработки
- Изучайте продвинутые темы: volumes, networks, Docker Swarm
8-(930)-381-66-59