Docker Image и Private Docker Hub

18 August 2024

В этой статье разберём, как создать свой 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.
  • Не клади лишние файлы: .dockerignore must-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

Leave a comment

Popular Posts

Advertisement

Headlines