2 min read

Dockerfile: собираем свой образ с нуля

Dockerfile: собираем свой образ с нуля

Готовые образы из Docker Hub закрывают большинство задач, но не все. Когда нужна своя сборка — со специфичными зависимостями, конфигами, версиями — пишу Dockerfile. Это текстовый файл с инструкциями, по которым Docker собирает образ. Разбираю, из чего он состоит, и собираю рабочий образ с нуля.

Основные инструкции Dockerfile

  1. FROM — базовый образ, от которого собираем (например, FROM ubuntu:22.04)
  2. RUN — выполнить команду внутри контейнера на этапе сборки (например, RUN apt-get update)
  3. COPY / ADD — скопировать файлы с хоста в контейнер
  4. WORKDIR — задать рабочую директорию
  5. EXPOSE — указать, какие порты будут доступны
  6. CMD / ENTRYPOINT — команда, которая запускается при старте контейнера

Простой пример

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "app.py"]

Сборка:

docker build -t my-app:latest .

Советы по оптимизации

  • Используй .dockerignore, чтобы не тащить в образ лишние файлы
  • Объединяй команды RUN — каждая создаёт новый слой образа
  • Бери минимальные базовые образы, например alpine — меньше вес, меньше поверхность атаки

Собираем образ Ubuntu с nginx

Дальше — рабочий пример от установки Docker до запуска контейнера.

Шаг 1. Установка Docker

sudo apt update
sudo apt install -y docker.io

Проверка:

docker --version

Шаг 2. Создание Dockerfile

mkdir mydocker
cd mydocker
nano Dockerfile

Содержимое файла:

# Базовый образ Ubuntu 22.04
FROM ubuntu:22.04

# Обновляем список пакетов
RUN apt-get update

# Устанавливаем nginx
RUN apt-get install -y nginx && \
    rm -rf /var/lib/apt/lists/*

# Переменная окружения с путём к конфигу
ENV nginx_conf /etc/nginx/nginx.conf

# Конфигурация nginx
COPY default /etc/nginx/sites-available/default
RUN echo "\ndaemon off;" >> ${nginx_conf}

# Тома для конфигов и логов
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]

# Команда запуска
CMD ["nginx", "-g", "daemon off;"]

# Открытые порты
EXPOSE 80 443

Строка rm -rf /var/lib/apt/lists/* в той же команде RUN — не отдельный шаг, а способ не тащить кэш apt в финальный слой образа.

Шаг 3. Сборка образа

docker build -t mynginx .

Проверка списка образов:

docker images

Шаг 4. Запуск контейнера

docker run -d -p 8080:80 -p 8443:443 mynginx

Проверка:

curl http://localhost:8080

Или открыть в браузере: http://localhost:8080

Шаг 5. Управление контейнером

Остановить:

docker stop <container_id>

Удалить контейнер:

docker rm <container_id>

Удалить образ:

docker rmi mynginx

Получился образ на базе Ubuntu 22.04 с настроенным nginx — собственная сборка, воспроизводимая на любой машине с Docker. Dockerfile превращает развёртывание в одну команду и убирает разницу между "у меня работает" и "на сервере работает".


Если хочешь обсудить похожую задачу — пиши на [email protected] или заходи на 1it.pro.

Связаться с нами
Telegram
WhatsApp
Email