Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Работа с образами
docker_images

Работа с образами

Создание, тегирование, поиск и публикация Docker-образов

Работа с Docker-образами

Образы — фундамент Docker. Научитесь управлять ими: искать, загружать, создавать и публиковать.

#Что такое Docker-образ?

Docker-образ — это неизменяемый шаблон, содержащий:

  • Код приложения
  • Библиотеки и зависимости
  • Системные утилиты
  • Переменные окружения
  • Метаданные

Образ используется для создания контейнеров. Один образ может породить множество контейнеров.

#Структура образа

Образ состоит из слоёв (layers). Каждый слой — это результат выполнения инструкции в Dockerfile.

ASCII Diagram

Ключевые свойства слоёв:

  • Слои неизменяемы (immutable)
  • Слои кэшируются — переиспользуются при повторной сборке
  • Слои shared — разные образы могут использовать общие слои

#Именование образов

Формат имени образа:

[registry/]username/repository:tag

Компоненты:

  • registry — адрес реестра (docker.io по умолчанию)
  • username — имя пользователя или организации
  • repository — название образа
  • tag — версия (метка) образа

Примеры:

nginx:latest                    # Официальный nginx, последний тег
python:3.11-slim               # Python 3.11, slim-версия
docker.io/library/ubuntu:22.04  # Полное имя Ubuntu
myuser/myapp:v1.0.0            # Пользовательский образ
localhost:5000/myapp:dev       # Private registry

#Тег latest

latest — тег по умолчанию. Это не обязательно последняя версия, а просто метка.

# Эти команды эквивалентны: docker pull nginx docker pull nginx:latest

Best practice: используйте конкретные теги в production:

# ✅ Хорошо — конкретная версия nginx:1.25.3 python:3.11.4-slim # ❌ Плохо — может измениться unexpectedly nginx:latest python:latest

#Поиск образов

#Docker Hub

Docker Hub — публичный реестр образов.

# Поиск образов docker search nginx # Поиск с фильтром по звёздам docker search --filter stars=100 python

Вывод покажет:

  • NAME — имя образа
  • DESCRIPTION — описание
  • STARS — популярность
  • OFFICIAL — официальный образ (от команды Docker или вендора)
  • AUTOMATED — собран автоматически из репозитория

#Официальные образы

Официальные образы поддерживаются Docker Inc. или вендором продукта:

  • nginx — официальный образ nginx
  • python — от Python Software Foundation
  • postgres — от PostgreSQL Global Development Group
  • redis — от Redis Ltd

Проверяйте значок Official в Docker Hub.

#Загрузка образов (pull)

# Загрузить образ docker pull nginx:1.25 # Загрузить с указанием реестра docker pull docker.io/library/nginx:1.25 # Загрузить все теги образа (не рекомендуется) docker pull --all-tags nginx

Просмотр загруженных образов:

docker images # Или альтернативная команда docker image ls

Пример вывода:

REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        1.25      a63764d7563c   2 weeks ago     187MB
python       3.11-slim e4c5e02960a4   3 weeks ago     123MB
ubuntu       22.04     72300a873c2c   6 weeks ago     77.8MB

#Создание образов

#Способ 1: Коммит контейнера (не рекомендуется)

# Запустить контейнер docker run -it ubuntu:22.04 bash # Установить что-то внутри root@container:/# apt update && apt install -y nginx # Выйти и закоммитить изменения docker commit container_id my-nginx:custom

Почему не стоит использовать:

  • Нет воспроизводимости (нельзя воссоздать точно такой же образ)
  • Нет версионирования инструкций
  • Сложно поддерживать

#Способ 2: Dockerfile (рекомендуется)

Создайте файл Dockerfile:

FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["python", "app.py"]

Сборка образа:

# Сборка с тегом docker build -t myapp:v1.0 . # Сборка с несколькими тегами docker build -t myapp:v1.0 -t myapp:latest . # Сборка без кэша docker build --no-cache -t myapp:v1.0 . # Сборка с аргументами docker build --build-arg VERSION=1.0 -t myapp:v1.0 .

Точка (.) в конце — контекст сборки (директория с файлами).

#Просмотр информации об образе

# Подробная информация docker image inspect nginx:1.25 # История слоёв docker history nginx:1.25 # Размер образа docker images nginx --format "{{.Repository}}:{{.Tag}} - {{.Size}}"

Пример docker history:

IMAGE          CREATED       CREATED BY                                      SIZE
a63764d7563c   2 weeks ago   /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B
<missing>      2 weeks ago   /bin/sh -c #(nop)  STOPSIGNAL SIGQUIT           0B
<missing>      2 weeks ago   /bin/sh -c #(nop)  EXPOSE 80                    0B
<missing>      2 weeks ago   /bin/sh -c #(nop)  ENTRYPOINT ["/docker-entr…   0B
<missing>      2 weeks ago   /bin/sh -c #(nop) COPY file:caec1a1b71a5d8…   1.2kB

#Тегирование образов

# Добавить тег к существующему образу docker tag myapp:v1.0 myapp:latest # Тег для push в реестр docker tag myapp:v1.0 username/myapp:v1.0 # Тег для remote registry docker tag myapp:v1.0 registry.example.com/myapp:v1.0

#Удаление образов

# Удалить образ по имени docker image rm nginx:1.25 # Удалить по ID docker image rm a63764d7563c # Удалить все неиспользуемые образы docker image prune # Удалить все образы, включая неиспользуемые docker image prune -a # Принудительное удаление docker image rm -f nginx:1.25

Важно: нельзя удалить образ, если есть контейнеры, созданные из него. Сначала удалите контейнеры.

#Публикация образов (push)

#Регистрация в Docker Hub

  1. Зарегистрируйтесь на hub.docker.com
  2. Создайте репозиторий (или используйте личный)
  3. Войдите в CLI:
docker login # Введите username и password

#Push образа

# Тегирование для Docker Hub docker tag myapp:v1.0 username/myapp:v1.0 # Публикация docker push username/myapp:v1.0 # Push всех тегов docker push username/myapp --all-tags

#Private репозитории

Docker Hub позволяет создавать private репозитории (ограниченно бесплатно).

# Создать private репозиторий через веб-интерфейс # Затем push как обычно docker push username/private-app:v1.0

#Multi-arch образы

Современные образы поддерживают несколько архитектур (amd64, arm64, arm/v7).

# Проверить поддерживаемые архитектуры docker manifest inspect nginx:1.25 # Сборка для нескольких архитектур docker buildx build \ --platform linux/amd64,linux/arm64 \ -t username/myapp:v1.0 \ --push \ .

docker buildx — инструмент для кросс-компиляции образов.

#Best Practices для образов

#1. Используйте конкретные теги

# ✅ Хорошо FROM python:3.11.4-slim # ❌ Плохо FROM python:latest FROM python

#2. Выбирайте минимальные базовые образы

# ✅ Минимальный образ FROM python:3.11-slim # ✅ Ещё меньше (Alpine) FROM python:3.11-alpine # ❌ Избыточно для production FROM ubuntu:22.04

Сравнение размеров:

  • python:3.11 — ~900 МБ
  • python:3.11-slim — ~120 МБ
  • python:3.11-alpine — ~50 МБ

#3. Один процесс — один контейнер

Не запускайте несколько процессов в одном контейнере. Для многопроцессных приложений используйте Docker Compose или оркестратор.

#4. Используйте .dockerignore

Создайте файл .dockerignore для исключения лишних файлов:

.git
__pycache__
*.pyc
.env
venv/
*.md
.dockerignore

Это уменьшит размер контекста сборки и образа.

#5. Сканируйте образы на уязвимости

# Встроенный сканер (Docker Desktop) docker scan myapp:v1.0 # Альтернативы: Trivy, Snyk, Clair trivy image myapp:v1.0

#Практика: создание и публикация образа

#Шаг 1: Подготовка

mkdir my-docker-app cd my-docker-app # Создайте простой app.py echo 'print("Hello from Docker!")' > app.py # Создайте Dockerfile cat > Dockerfile << EOF FROM python:3.11-slim WORKDIR /app COPY . . CMD ["python", "app.py"] EOF

#Шаг 2: Сборка

docker build -t my-hello:v1.0 .

#Шаг 3: Тестирование

docker run --rm my-hello:v1.0 # Hello from Docker!

#Шаг 4: Публикация (опционально)

docker login docker tag my-hello:v1.0 username/my-hello:v1.0 docker push username/my-hello:v1.0

#Troubleshooting

#Образ не собирается

Проверьте контекст сборки:

# Убедитесь, что файлы в директории ls -la # Проверьте Dockerfile на синтаксические ошибки docker build -t test . 2>&1 | head -50

#Образ слишком большой

# Проанализируйте слои docker history myapp:v1.0 # Используйте docker-slim для анализа docker-slim analyze myapp:v1.0

#Конфликт имён

# Удалите старый образ docker image rm myapp:v1.0 # Или используйте другое имя docker build -t myapp:v1.1 .

Далее: Создание Dockerfile