Узнаем о K8s по чуть-чуть каждый день. Контейнер определяется как специальная изолированная среда, в которой процессы могут выполняться независимо, но можно еще больше упростить это описание и сказать, что контейнеры — это изолированные процессы.
О базовых принципах технологии вы можете узнать из этой статьи. Мы же пойдем дальше и подробно рассмотрим предназначение таких команд как docker start, docker images, docker rmi, docker run, docker stop
и docker start
. С их помощью вы сможете извлекать образы, запускать контейнеры, использовать разные параметры для изменения статуса контейнеров и др.
Контейнеризованное приложение
Мы не запускаем контейнер с нуля, мы запускаем его из образа, который сначала можем извлечь:
$ docker pull nginx
$ docker run -d nginx
Что такое образ и как он связан с контейнерами?
Наверняка вы слышали это слово в контексте образа CD, образа жёсткого диска для переустановки ОС или образа виртуальной машины. У всех этих образов есть кое-что общее: они предоставляются только для чтения, не допускают изменений, файлы хранятся в стандартном формате, а затем данные извлекаются и выполняются при необходимости.
Все это относится и к образам в мире контейнеров. Контейнер создается операционной системой динамически, так что нам нужен какой-то способ «заморозить» начальное окружение и сохранить его в виде статического файла. Мы делаем контейнер плоским, чтобы его проще было хранить и переносить и можно было легко управлять его версиями.
С функциональной точки зрения образ упаковывается с приложением (вроде стандартного пакета tar
, rpm
, deb
и т. д.), но при этом содержит не только базовые исполняемые файлы, но и все окружение в системе, где выполняется приложение.
Это позволяет легко переносить приложение между платформами. Разработчик может создать приложение в Ubuntu, упаковать его в образ и запустить в CentOS безо всяких проблем. Это более сложный метод упаковки приложений, который должен учитывать зависимости в окружении.
docker pull nginx
используется для получения упакованного образа приложения nginx
, где содержится программа nginx
и рабочее окружение, которое ей нужно.
docker run nginx
извлекает из образа информацию, создает изолированное окружение с использованием указанных namespace, cgroup
и chroot
, а затем запускает программу nginx
.
В этих двух шагах используются стандартные системные вызовы Linux и файлы образов только для чтения, поэтому мы получим одинаковые результаты независимо от операционной системы и технологии реализации контейнеров.
Таким образом можно упаковывать и распространять любое приложение, и это близко к заветной мечте — «Напиши один раз, используй где угодно».
Благодаря контейнеризации приложение больше не взаимодействует с операционной системой напрямую. Оно инкапсулировано в образ, и за его выполнение отвечает контейнерное окружение.
Нужно понимать, что образ — это статический контейнер приложения, а контейнер — это динамической образ приложения. Они зависят друг от друга, влияют друг на друга и их невозможно разделить.
Стандартные операции Docker
Мы уже знаем две базовые команды: docker pull
и docker run
. Полное имя образа состоит из двух частей: имя и тег, разделенные двоеточием.
Имя — это обозначение приложения, например busybox, Alpine, Nginx, Redis и т. д., а тег — это дополнительная метка для различения версий приложения. Это может быть что угодно, например 3.15 (номер версии), jammy (код проекта), 1.21-alpine (номер версии плюс ОС) и т. д. Еще есть тег latest, он используется по умолчанию. Если мы указываем только имя, без тега, по умолчанию добавляется latest.
docker pull
Теперь мы умеем сочетать имена и теги и можем извлечь несколько образов командой docker pull
:
$ docker pull alpine:3.15
$ docker pull ubuntu:jammy
$ docker pull nginx:1.21-alpine
$ docker pull nginx:alpine
$ docker pull redis
docker images
Образы у нас есть, теперь можно узнать о них больше командой docker images
:
Здесь мы видим, что в столбце REPOSITORY указано имя образа, в столбце TAG — метка, а в столбце IMAGE ID — уникальный идентификатор. Обратите внимание, что у двух образов — nginx:1.21-alpine и nginx:alpine — одинаковые ID: “a63aa…”. Этому есть простое объяснение. У человека тоже может быть уникальный номер паспорта, а ещё прозвище помимо имени.
docker rmi
Давайте возьмем еще одну команду для работы с образами — docker rmi
. Она удаляет ненужные образы, чтобы освободить место на диске. rmi
— это сокращенное от remove image (удалить образ).
$ docker rmi redis
$ docker rmi d4c
Первая команда rmi удаляет образ Redis, потому что мы не добавили тег и используется latest по умолчанию. Во второй команде мы указываем три первые цифры IMAGE ID, и Docker находит образ по этому префиксу и удаляет его.
docker run
Мы сохранили образ локально и теперь можем выполнить команду docker run
, чтобы запустить статическое приложение и превратить его в динамический контейнер.
Базовый формат: docker run с параметрами запуска, затем имя или ID образа и по желанию дополнительная команда run. Например:
$ docker run -h srv alpine hostname
Здесь -h srv
— это параметр запуска контейнера, alpine
— имя образа, а hostname указывает, что в контейнере нужно запустить программу hostname, и выводит имя хоста.
docker run
— самая сложная команда для работы с контейнерами. Здесь нужно указывать параметры, чтобы скорректировать состояние выполнения контейнера. Можно добавить --help
, чтобы посмотреть справочную информацию. Самые распространенные параметры:
-it
запускает интерактивную оболочку, чтобы можно было напрямую войти в контейнер, примерно как мы входим в виртуальную машину. Это сочетание двух аргументов: -i и -t.-d
позволяет контейнеру выполняться в фоновом режиме. Это удобно, если мы запускаем серверные программы, вроде Nginx и Redis.--name
позволяет присвоить контейнеру имя для нашего удобства, но это необязательно. Если не указать значение, Docker присвоит случайное имя.
docker stop
Запущенный контейнер можно принудительно остановить командой docker stop
. Здесь можно указать имя контейнера, но удобнее будет использовать первые три символа ID.
$ docker stop ed4 d60 45c
Мы не увидим остановленный контейнер по команде docker ps, но это не значит, что контейнер уничтожен. Команда docker ps -a
показывает все контейнеры в системе.
docker rm
Остановленные контейнеры можно запустить снова командой docker start
. Если вы уверены, что они вам больше не нужны, используйте команду docker rm, чтобы полностью их удалить.
$ docker rm ed d6 45
Выглядит так, будто это не самый удобный способ управлять контейнерами. После запуска приходится использовать ps, чтобы посмотреть ID и удалить контейнер. Если не следить за этим, в системе накопится много мертвых контейнеров, которые потребляют системные ресурсы. Можно ли сделать так, чтобы Docker автоматически удалял нежелательные контейнеры?
Конечно. Можно добавить параметр —-rm
при выполнении команды docker run, и тогда Docker не будет сохранять контейнер и автоматически удалит его после выполнения, чтобы нам не пришлось делать это вручную.
Заключение
Краткая сводка по стандартным командам Docker:
docker pull
для извлечения образов,docker images
для просмотра образов иdocker rmi
для удаления образов.Команда
docker run
запускает контейнер и используется чаще всего. К ней можно добавлять разные параметры, чтобы менять статус контейнера. Для фоновых сервисов мы указываем-d
.Команда
docker exec
может выполнять в контейнере произвольные программы и особенно полезна при отладке.Другие распространенные операции:
docker ps
для просмотра контейнеров,docker stop
для остановки контейнеров иdocker rm
для удаления контейнеров.
Еще больше о Kubernetes
11 ноября в Слёрм стартует новый поток Kubernetes: Мега. Он предназначен для тех, кто хочет углубить свои знания в K8s и потрогать руками внутрянку кластера. В программе 6 часов практики, теория и разбор кейсов вместе со спикерами.
«Мега» подойдет всем, кому предстоит запускать Kubernetes в продакшн и отвечать за работу проекта в дальнейшем: специалистам по безопасности, системным инженерам, администраторам, архитекторам, DevOps и др.
Что даст курс, если все можно найти в документации?
Вы экономите время, которое могли бы потратить на самостоятельные эксперименты и чтение документации
Документация может месяцами лежать в папке «прочитать», а интенсив это конкретные даты
Практика под руководством опытных специалистов – это возможность здесь и сейчас разобрать ошибки.
Что вы будете делать:
Установите Kubernetes в ручном режиме, авторизуетесь в кластере, настроите autoscaling, разберете такие темы, как Open Policy Agent, Network Policy, безопасность и высокодоступные приложения, ротация сертификатов, аутентификация пользователей в кластере, хранение секретов, Horisontal Pod Autoscaler, создание собственного оператор K8s.
Чтобы понять, подходит ли вам формат, вы можете пройти бесплатную демо-версию с лекцией и практикой уже сейчас. Кстати, видеокурс доступен в любое время.
Узнать подробнее: https://slurm.club/3f4OuUK
Комментарии (4)
numb
26.10.2022 01:57Продвинутых относительно чего?
Статья - просто список базовых команд cli утилиты docker. Мое мнение - тут и до базового уровня далеко
farcaller
Так а k8s, собственно, где?
AlexGluck
А продвинутость где?
JuriM
В заключении :)