Создание, тегирование, поиск и публикация Docker-образов
Образы — фундамент Docker. Научитесь управлять ими: искать, загружать, создавать и публиковать.
Docker-образ — это неизменяемый шаблон, содержащий:
Образ используется для создания контейнеров. Один образ может породить множество контейнеров.
Образ состоит из слоёв (layers). Каждый слой — это результат выполнения инструкции в Dockerfile.

Ключевые свойства слоёв:
Формат имени образа:
[registry/]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
latestlatest — тег по умолчанию. Это не обязательно последняя версия, а просто метка.
# Эти команды эквивалентны:
docker pull nginx
docker pull nginx:latestBest practice: используйте конкретные теги в production:
# ✅ Хорошо — конкретная версия
nginx:1.25.3
python:3.11.4-slim
# ❌ Плохо — может измениться unexpectedly
nginx:latest
python:latestDocker Hub — публичный реестр образов.
# Поиск образов
docker search nginx
# Поиск с фильтром по звёздам
docker search --filter stars=100 pythonВывод покажет:
Официальные образы поддерживаются Docker Inc. или вендором продукта:
nginx — официальный образ nginxpython — от Python Software Foundationpostgres — от PostgreSQL Global Development Groupredis — от Redis LtdПроверяйте значок Official в Docker Hub.
# Загрузить образ
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
# Запустить контейнер
docker run -it ubuntu:22.04 bash
# Установить что-то внутри
root@container:/# apt update && apt install -y nginx
# Выйти и закоммитить изменения
docker commit container_id my-nginx:customПочему не стоит использовать:
Создайте файл 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Важно: нельзя удалить образ, если есть контейнеры, созданные из него. Сначала удалите контейнеры.
docker login
# Введите username и password# Тегирование для Docker Hub
docker tag myapp:v1.0 username/myapp:v1.0
# Публикация
docker push username/myapp:v1.0
# Push всех тегов
docker push username/myapp --all-tagsDocker Hub позволяет создавать private репозитории (ограниченно бесплатно).
# Создать private репозиторий через веб-интерфейс
# Затем push как обычно
docker push username/private-app:v1.0Современные образы поддерживают несколько архитектур (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 — инструмент для кросс-компиляции образов.
# ✅ Хорошо
FROM python:3.11.4-slim
# ❌ Плохо
FROM python:latest
FROM python# ✅ Минимальный образ
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 МБНе запускайте несколько процессов в одном контейнере. Для многопроцессных приложений используйте Docker Compose или оркестратор.
.dockerignoreСоздайте файл .dockerignore для исключения лишних файлов:
.git
__pycache__
*.pyc
.env
venv/
*.md
.dockerignore
Это уменьшит размер контекста сборки и образа.
# Встроенный сканер (Docker Desktop)
docker scan myapp:v1.0
# Альтернативы: Trivy, Snyk, Clair
trivy image myapp:v1.0mkdir 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"]
EOFdocker build -t my-hello:v1.0 .docker run --rm my-hello:v1.0
# Hello from Docker!docker login
docker tag my-hello:v1.0 username/my-hello:v1.0
docker push username/my-hello:v1.0Проверьте контекст сборки:
# Убедитесь, что файлы в директории
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 .[registry/]username/repository:tagВ следующей теме вы научитесь писать эффективные Dockerfile с использованием всех инструкций и best practices.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.