В этой статье разберём, как создать свой Docker Image с нуля: от базового Dockerfile до оптимизаций, многоступенчатой сборки и пуша в Docker Hub. Всё по-простому, по-devops’овски, без душнилова.
Базовый Dockerfile
Dockerfile — это инструкция, как собрать свой образ. Самый простой пример для nginx:
# Используем базовый image
FROM nginx:latest
# Копируем свои файлы внутрь контейнера
COPY index.html /usr/share/nginx/html/index.html
# Указываем порт
EXPOSE 80
Проверка структуры:
$ tree .
.
├── Dockerfile
└── index.html
Слои (Layers)
Каждая команда в Dockerfile создаёт слой. Команды типа COPY и RUN — самые "тяжёлые". Чем меньше слоёв и копируемых данных, тем быстрее сборка.
Плохой пример:
RUN apt update
RUN apt install -y python3
RUN apt install -y curl
Хороший пример:
RUN apt update \
&& apt install -y python3 curl \
&& apt clean
Сборка и запуск
Собрать образ:
$ docker build -t my-nginx .
Посмотреть имиджи:
$ docker images
Запустить контейнер на порту 8080:
$ docker run -d --name web -p 8080:80 my-nginx
Логи контейнера:
$ docker logs -f web
Остановить и удалить:
$ docker stop web && docker rm web
Best Practices
- Используй минимальные базовые образы:
alpine,slim. - Не клади лишние файлы:
.dockerignoremust-have. - Собирай зависимости в одном слое.
- Не запускай процессы от root.
- Прогревай кэш — сортируй команды по частоте изменений.
# .dockerignore
.git
*.log
node_modules
tmp/
Multistage Build
Многоступенчатая сборка позволяет делать тонкие и быстрые образы.
Пример для Node.js + Nginx:
# Стейдж сборки
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build
# Стейдж продакшн
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
Теперь образ весит не 800 МБ, а 25–40 МБ
Публикация в Docker Hub
Логинимся:
$ docker login
Тегируем:
$ docker tag my-nginx kent666/my-nginx:latest
Публикуем:
$ docker push kent666/my-nginx:latest
Проверяем на hub.docker.com — и можно тянуть образ на любые сервера:
$ docker pull kent666/my-nginx:latest
