- 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-4 и напиши свое простое приложение (например Python скрипт + PostgreSQL), запустив их через
docker run. - Перенеси это в Блок 5 (
docker-compose.yml). - Поставь себе локальный кластер (Minikube или Kind) и попробуй перенести свой
docker-compose.ymlв набор манифестов K8s (Блоки 6-13), позапускай команды из Блоков 9 и 10, попробуй "сломать" под (дать неверную переменную) и поиспользоватьdescribeиlogsиз Блока 7.
- Docker. Начало -
Итак, после установки Docker пройдемся по простым и очевидным для Linux пользователя командам:
docker --help- вызвать окно с полным перечнем командDockerdocker search <image-name>- поиск наDockerHubобраза по имениdocker pull <image-name>- скачать образdocker images- посмотреть перечень уже скаченных образовdocker rmi <image-name>- удалить образdocker start/stop <container-name>- запустить/остановитьDocker-контейнерdocker ps- посмотреть перечень контейнеровdocker rm <container-name>- удалить контейнерdocker exec <command>- исполнить команду внутри контейнераdocker build- создать образ изDockerfiledocker 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>