Dockerfile: собираем свой образ с нуля
Готовые образы из Docker Hub закрывают большинство задач, но не все. Когда нужна своя сборка — со специфичными зависимостями, конфигами, версиями — пишу Dockerfile. Это текстовый файл с инструкциями, по которым Docker собирает образ. Разбираю, из чего он состоит, и собираю рабочий образ с нуля.
Основные инструкции Dockerfile
- FROM — базовый образ, от которого собираем (например,
FROM ubuntu:22.04) - RUN — выполнить команду внутри контейнера на этапе сборки (например,
RUN apt-get update) - COPY / ADD — скопировать файлы с хоста в контейнер
- WORKDIR — задать рабочую директорию
- EXPOSE — указать, какие порты будут доступны
- 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.