- Docker Roadmap -

Блок 1: Базовый Docker (Работа с образами)

Образ (Image) — этоReadOnly-шаблон, из которого создаются контейнеры.

  • docker pull - скачать образ из удаленного реестра (Docker Hub и др.)
  • docker build - собрать образ из Dockerfile (ключи: -t для задания имени/тега, --no-cache для сборки без кэша, --build-arg для передачи переменных)
  • docker images (или docker image ls) - вывести список всех локальных образов
  • docker rmi - удалить локальный образ (ключ -f для принудительного удаления)
  • docker tag - создать дополнительный тег для образа (подготовка к отправке в приватный реестр)
  • docker push - отправить собранный образ в удаленный реестр
  • docker save - экспортировать образ(ы) в .tar архив (полезно для переноса без интернета)
  • docker load - импортировать образ из .tar архива

Блок 2: Базовый Docker (Жизненный цикл контейнеров)

Контейнер (Container) — это запущенный процесс, изолированный от системы, использующий образ.

  • docker run - создать и запустить контейнер (ключи: -d в фоне, -p проброс портов, -v проброс томов, --name задать имя, --rm удалить после остановки, -e передать переменные окружения, --network подключить к сети)
  • docker create - создать контейнер (без запуска, чтобы настроить и запустить потом)
  • docker start - запустить ранее созданный или остановленный контейнер
  • docker stop - корректно остановить контейнер (отправляет SIGTERM, затем SIGKILL)
  • docker restart - перезапустить контейнер
  • docker kill - мгновенно убить контейнер (отправляет SIGKILL без ожидания корректного завершения)
  • docker rm - удалить остановленный контейнер (ключ -v чтобы удалить привязанные анонимные тома)
  • docker ps - вывести список работающих контейнеров (ключ -a показать все, включая остановленные)

Блок 3: Базовый Docker (Интерактивность и дебаг)

Без этих команд отладка падений будет невозможной.

  • docker exec - выполнить команду внутри работающего контейнера (ключи: -it для интерактивного входа в bash/sh, -u от имени другого пользователя)
  • docker logs - вывести логи контейнера (ключи: -f следить в реальном времени, --tail 100 показать последние 100 строк, --since с определенного времени)
  • docker inspect - показать детальную информацию о любом объекте Docker (контейнере, образе, сети) в формате JSON (ключ -f для фильтрации конкретного поля, например IP адреса)
  • docker cp - скопировать файл/папку между локальной файловой системой и работающим контейнером
  • docker diff - показать изменения в файловой системе контейнера по сравнению с исходным образом (что было добавлено/изменено/удалено)
  • docker stats - показать потребление ресурсов (CPU, RAM, Network, Disk) работающими контейнерами в реальном времени

Блок 4: Базовый Docker (Система, сети и тома)

Инфраструктурные команды для сохранения данных и связи контейнеров.

  • docker volume ls - вывести список созданных томов (Volumes)
  • docker volume create - создать новый том для сохранения данных
  • docker volume inspect - посмотреть реальный путь к тому на хост-машине
  • docker network ls - вывести список сетей
  • docker network create - создать пользовательскую сеть (ключ --driver bridge для создания изолированной мостовой сети)
  • docker system prune - запустить "сборщик мусора" (удалит все остановленные контейнеры, неиспользуемые сети, образы без тегов и кэш сборки)
  • docker system df - показать, сколько дискового места занято образами, контейнерами и томами

Блок 5: Docker Compose (Оркестрация в одном файле)

Compose позволяет описать связку контейнеров (например, веб-сервер + база данных) в одном docker-compose.yml. (Примечание: в новых версиях команда пишется docker compose без дефиса, но docker-compose всё ещё используется).

  • docker compose up - прочитать docker-compose.yml, создать сеть, тома и запустить все сервисы (ключи: -d в фоне, --build пересобрать образы перед запуском, --scale service=N запустить N копий сервиса)
  • docker compose down - остановить и удалить контейнеры, а также созданные для них сети (ключ -v удалит еще и тома, ключ --rmi all удалит образы)
  • docker compose start - запустить остановленные контейнеры (без пересоздания)
  • docker compose stop - остановить контейнеры (без удаления)
  • docker compose restart - перезапустить сервисы
  • docker compose build - пересобрать образы сервисов
  • docker compose ps - показать статус контейнеров текущего проекта (compose-стека)
  • docker compose logs - вывести логи всех сервисов проекта (можно указать имя конкретного сервиса в конце)
  • docker compose exec - выполнить команду внутри контейнера конкретного сервиса
  • docker compose run - запустить разовую команду в новом контейнере сервиса (создаст новый контейнер со своими сетями, полезно для миграций БД)
  • docker compose config - валидировать и вывести итоговый конфиг (показывает, как отработали переменные окружения и расширения)

Блок 6: Kubernetes — Кластер и Ноды

K8s (kubectl) управляет кластером машин. Эти команды нужны для базового понимания состояния.

  • kubectl cluster-info - вывести эндпоинты главного компонента кластера (Control Plane)
  • kubectl get nodes - вывести список всех нод (рабочих машин) в кластере и их статус (Ready/NotReady)
  • kubectl describe node - показать детальную информацию о ноде (сколько CPU/RAM выделено, сколько доступно, какие поды на ней запущены)
  • kubectl top nodes - показать потребление ресурсов нодами в реальном времени (нужен установленный Metrics Server)

Блок 7: Kubernetes — Поды (Базовая единица)

Под (Pod) — это минимальная развертываемая единица в K8s (обычно содержит один контейнер).

  • kubectl run - быстро создать под из образа (напрямую или сгенерировав для него Deployment)
  • kubectl get pods - вывести список подов в текущем неймспейсе (ключи: -o wide покажет IP и ноду, -w будет обновлять в реальном времени)
  • kubectl describe pod - САМАЯ ВАЖНАЯ КОМАНДА ДЛЯ ДЕБАГА. Показывает события (Events): почему под не стартует, не может достать образ, упал по OOM (нехватке памяти) и т.д.
  • kubectl logs - вывести логи пода (ключи: -f реальное время, -c имя_контейнера если в поде несколько контейнеров, --previous показать логи крашнувшегося контейнера перед перезапуском)
  • kubectl exec - выполнить команду внутри пода (ключи: -it для интерактивного терминала, -c для выбора контейнера)
  • kubectl cp - скопировать файлы между локальной машиной и подом
  • kubectl delete pod - удалить под (если под был создан через Deployment, он тут же поднимется заново — это нужно понимать!)

Блок 8: Kubernetes — Декларативное управление (YAML)

В K8s всё делается через манифесты (YAML файлы).

  • kubectl apply -f - применить конфигурацию из YAML файла к кластеру (ключ -R рекурсивно применить ко всем файлам в папке)
  • kubectl create -f - создать ресурс из YAML (отличие от apply в том, что create выдаст ошибку, если ресурс уже существует, а apply обновит его)
  • kubectl delete -f - удалить ресурсы, описанные в YAML файле
  • kubectl edit - открыть манифест работающего ресурса прямо в текстовом редакторе (vim) и применить изменения на лету
  • kubectl get all - вывести все ресурсы (поды, сервисы, деплойменты) в текущем неймспейсе

Блок 9: Kubernetes — Deployments (Управление репликами и обновлениями)

Deployment обеспечивает запуск нужного количества подов и контролирует их жизненный цикл.

  • kubectl get deployments - вывести список деплойментов
  • kubectl scale deployment - вручную изменить количество реплик (экземпляров подов) для деплоймента (ключ --replicas=5)
  • kubectl rollout status deployment - проверить статус развертывания (успешно ли завершилось обновление)
  • kubectl rollout history deployment - показать историю версий (ревизий) деплоймента
  • kubectl rollout undo deployment - откатить деплоймент на предыдущую версию (ключ --to-revision=N для отката на конкретную версию)
  • kubectl set image deployment - обновить образ в деплойменте (запустит Rolling Update — плавное обновление подов без даунтайма)

Блок 10: Kubernetes — Сети и Доступ (Services, Ingress)

В K8s поды имеют временные IP. Чтобы к ним обращаться постоянно, нужны Сервисы.

  • kubectl expose - создать сервис для доступа к подам/деплойменту (ключи: --port, --target-port, --type=NodePort/ClusterIP/LoadBalancer)
  • kubectl get services (или kubectl get svc) - вывести список сервисов
  • kubectl port-forward - ГЛАВНАЯ КОМАНДА ДЛЯ ЛОКАЛЬНОЙ РАЗРАБОТКИ. Пробрасывает порт с твоего компьютера прямо в под в кластере (например 8080:80)

Блок 11: Kubernetes — Конфиги, Секреты и Хранилища

Как передать настройки и сохранить данные между перезапусками подов.

  • kubectl create configmap - создать конфигмап из файла или литералов (передает неконфиденциальные переменные окружения или файлы конфигурации в поды)
  • kubectl create secret generic - создать секрет (хранит пароли, токены в закодированном виде base64)
  • kubectl get configmaps / kubectl get secrets - вывести списки конфигов и секретов
  • kubectl get pv - вывести список Persistent Volumes (реальные диски в инфраструктуре)
  • kubectl get pvc - вывести список Persistent Volume Claims (заявки подов на диски, связывает под и PV)

Блок 12: Kubernetes — Неймспейсы и Контексты

Для разделения среды (dev, prod) и переключения между разными кластерами.

  • kubectl get namespaces - вывести список неймспейсов (изолированные пространства внутри одного кластера)
  • kubectl create namespace - создать новый неймспейс
  • kubectl config get-contexts - вывести список доступных кластеров (контекстов), к которым у тебя есть доступ
  • kubectl config use-context - переключиться на другой кластер (например, с локального Minikube на продакшен AWS)
  • kubectl config set-context --current --namespace - задать неймспейс по умолчанию для текущего контекста (чтобы не писать -n my-namespace в каждой команде)

Блок 13: Kubernetes — Супер-дебаг и мониторинг

Когда всё сломалось и непонятно почему.

  • kubectl get events - посмотреть лог системных событий кластера (показывает, кто удалил под, почему нода упала, почему не хватило ресурсов)
  • kubectl api-resources - вывести справочник всех объектов, которые понимает кластер (включая кастомные CRD, устанавливаемые через Helm)
  • kubectl top pods - показать потребление CPU/RAM отдельными подами

Совет по пути изучения:

  1. Изучи Блоки 1-4 и напиши свое простое приложение (например Python скрипт + PostgreSQL), запустив их через docker run.
  2. Перенеси это в Блок 5 (docker-compose.yml).
  3. Поставь себе локальный кластер (Minikube или Kind) и попробуй перенести свой docker-compose.yml в набор манифестов K8s (Блоки 6-13), позапускай команды из Блоков 9 и 10, попробуй "сломать" под (дать неверную переменную) и поиспользовать describe и logs из Блока 7.

Начало курса!

- Docker. Начало -

Итак, после установки Docker пройдемся по простым и очевидным для Linux пользователя командам:

  1. docker --help - вызвать окно с полным перечнем команд Docker
  2. docker search <image-name> - поиск на DockerHub образа по имени
  3. docker pull <image-name> - скачать образ
  4. docker images - посмотреть перечень уже скаченных образов
  5. docker rmi <image-name> - удалить образ
  6. docker start/stop <container-name> - запустить/остановить Docker-контейнер
  7. docker ps - посмотреть перечень контейнеров
  8. docker rm <container-name> - удалить контейнер
  9. docker exec <command> - исполнить команду внутри контейнера
  10. docker build - создать образ из Dockerfile
  11. docker run <image-name> - запустить контейнер на основе образа <image-name> (если данного образа нет на локальной машине он будет автоматически найден в DockerHub, скачен и запущен!)
# вызов справки по Docker
docker --help

# вывести список запущенных контейнеров
sudo docker ps

# вывести список запущенных и остановленных контейнеров
sudo docker ps -a

# вывести список образов
sudo docker images

# запустить контейнер из образа
sudo docker run hello-world

# другие команды Docker
sudo docker search # поиск образа в Docker Hub
sudo docker pull # скачать образ из Docker Hub
sudo docker rm # удалить контейнер
sudo docker rmi # удалить образ
sudo docker stop # остановить контейнер
sudo docker build # собрать образ по инструкциям в Dockerfile
sudo docker exec # исполнить команду внутри контейнера

Чтобы постоянно не вводить sudo необходимо текущего пользователя поместить в группу docker (группа уже существует)

# создать группу docker
sudo groupadd docker

# вывести последние 10 строк из файла со списком групп
tail /etc/group

# добавить текущего пользователя в группу docker
sudo usermod -aG docker $USER

# вывести список групп пользователя itguy
groups $USER

# перезапустить службу docker
sudo systemctl restart docker

# перечитать список пользователей в группе docker
newgrp docker

Note

Контейнер Getting-Started  - это официальный учебный образ от Docker, предназначенный для быстрого знакомства с основами работы с контейнерами. Он содержит простое веб-приложение, которое идеально подходит для первых экспериментов.

# запустить контейнер hello-world
sudo docker run hello-world

# то же, но без указания прав root-пользователя
docker run hello-world

# запустить в фоновом режиме контейнер с документацией (на порту 80)
docker run -dp 80:80 docker/getting-started

# вывести список запущенных контейнеров
docker ps

# зайти на страницу локального сайта для просмотра документации (при запущенном предыдущем контейнере)
http://localhost:80

# остановить контейнер по его идентификатору
docker stop <container_id>