Практические примеры написания Dockerfile
Dockerfile — это текстовый файл, содержащий набор инструкций для сборки Docker-образов. Dockerfile позволяет автоматизировать процесс создания контейнеров и упростить развертывание приложений. В этой статье мы рассмотрим несколько практических примеров написания Dockerfile для различных типов приложений.
Основные инструкции Dockerfile
Перед тем как перейти к примерам, кратко вспомним основные инструкции Dockerfile:
- FROM — определяет базовый образ, на основе которого будет создан новый.
- RUN — выполняет команды внутри контейнера при сборке образа.
- COPY — копирует файлы с локальной машины в контейнер.
- WORKDIR — задаёт рабочую директорию для последующих команд.
- CMD и ENTRYPOINT — определяют команды, которые выполняются при запуске контейнера.
- EXPOSE — указывает порты, которые контейнер будет использовать для взаимодействия.
Теперь рассмотрим примеры Dockerfile для различных приложений.
Пример 1: Dockerfile для простого веб-сервера на Nginx
Этот пример создаст Docker-образ для веб-сервера на базе Nginx. В контейнере будет развернут статический сайт.
Dockerfile
# Используем официальный образ Nginx
FROM nginx:latest
# Копируем содержимое директории с сайта в директорию сервера
COPY ./html /usr/share/nginx/html
# Открываем порт 80 для доступа к веб-сайту
EXPOSE 80
Описание
- Мы используем официальный образ Nginx в качестве базового.
- Копируем файлы с веб-сайтом из директории ./html на локальной машине в директорию /usr/share/nginx/html внутри контейнера.
- Указываем, что контейнер будет слушать на порту 80.
Сборка и запуск
Для создания образа выполните команду:
docker build -t my-nginx .
Запустите контейнер:
docker run -d -p 8080:80 my-nginx
Теперь сайт будет доступен по адресу http://localhost:8080.
Пример 2: Dockerfile для Node.js-приложения
В этом примере создадим Dockerfile для Node.js-приложения с установкой зависимостей и запуском приложения.
Dockerfile
# Базовый образ Node.js
FROM node:14
# Создаем рабочую директорию для приложения
WORKDIR /usr/src/app
# Копируем package.json и устанавливаем зависимости
COPY package*.json ./
RUN npm install
# Копируем исходный код приложения
COPY . .
# Открываем порт 3000
EXPOSE 3000
# Запускаем приложение
CMD ["npm", "start"]
Описание
- Используем образ Node.js версии 14 в качестве базового.
- Устанавливаем рабочую директорию /usr/src/app.
- Копируем файл package.json и устанавливаем зависимости с помощью npm install.
- Копируем весь исходный код в контейнер.
- Указываем, что приложение будет работать на порту 3000.
- Указываем команду для запуска приложения: npm start.
Сборка и запуск
Для создания образа выполните:
docker build -t my-node-app .
Запуск контейнера:
docker run -d -p 3000:3000 my-node-app
Теперь Node.js-приложение будет доступно по адресу http://localhost:3000.
Пример 3: Dockerfile для Python-приложения на Flask
Создадим Dockerfile для Python-приложения на Flask с установкой зависимостей через pip.
Dockerfile
# Используем образ Python 3.8
FROM python:3.8-slim
# Устанавливаем рабочую директорию
WORKDIR /app
# Копируем файл с зависимостями
COPY requirements.txt .
# Устанавливаем зависимости
RUN pip install --no-cache-dir -r requirements.txt
# Копируем все файлы проекта
COPY . .
# Открываем порт 5000
EXPOSE 5000
# Указываем команду для запуска приложения
CMD ["python", "app.py"]
Описание
- Базовым образом является Python 3.8.
- Рабочая директория задаётся как /app.
- Устанавливаем зависимости из файла requirements.txt с помощью pip.
- Копируем исходный код приложения в контейнер.
- Открываем порт 5000 для Flask-приложения.
- Запускаем приложение командой python app.py.
Сборка и запуск
Для создания образа выполните:
docker build -t my-flask-app .
Запуск контейнера:
docker run -d -p 5000:5000 my-flask-app
Теперь Flask-приложение будет доступно по адресу http://localhost:5000.
Пример 4: Dockerfile для приложения на PHP с Apache
Этот пример демонстрирует создание Dockerfile для PHP-приложения, работающего с Apache.
Dockerfile
# Используем образ PHP с Apache
FROM php:7.4-apache
# Копируем файлы приложения в директорию для Apache
COPY ./src /var/www/html/
# Открываем порт 80
EXPOSE 80
Описание
- Используем базовый образ PHP 7.4 с предустановленным Apache.
- Копируем файлы PHP-приложения в папку /var/www/html/ для работы Apache.
- Открываем порт 80 для веб-доступа.
Сборка и запуск
Для создания образа выполните:
docker build -t my-php-app .
Запуск контейнера:
docker run -d -p 8080:80 my-php-app
Теперь ваше PHP-приложение будет доступно по адресу http://localhost:8080.
Пример 5: Dockerfile с использованием multistage-сборки
Multistage-сборка позволяет создавать небольшие и оптимизированные образы, разделяя процесс сборки и развертывания на несколько этапов.
Dockerfile
# Первый этап: сборка приложения
FROM node:14 AS build
# Рабочая директория
WORKDIR /app
# Установка зависимостей
COPY package*.json ./
RUN npm install
# Сборка приложения
COPY . .
RUN npm run build
# Второй этап: подготовка к развертыванию
FROM nginx:alpine
# Копируем собранное приложение в nginx
COPY --from=build /app/build /usr/share/nginx/html
# Открываем порт 80
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Описание
- В первом этапе используется образ Node.js для сборки приложения.
- После сборки приложение копируется во второй этап, где используется Nginx для раздачи статических файлов.
- В результате получается компактный образ, в котором содержится только собранное приложение и веб-сервер.
Сборка и запуск
Сборка образа:
docker build -t my-multistage-app .
Запуск контейнера:
docker run -d -p 8080:80 my-multistage-app
Теперь ваше приложение будет доступно по адресу http://localhost:8080.
Заключение
Dockerfile — это мощный инструмент, который позволяет автоматизировать сборку Docker-образов и упрощает развертывание приложений. В этой статье мы рассмотрели несколько практических примеров написания Dockerfile для различных типов приложений: от простого веб-сервера Nginx до более сложных приложений на Node.js, Python и PHP. Эти примеры помогут вам понять, как правильно строить и настраивать Docker-образы для ваших проектов.
Комментарии