Узнаем о 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.com
Рис. с docker.com

Стандартные операции 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)


  1. farcaller
    25.10.2022 19:58
    +7

    Так а k8s, собственно, где?


    1. AlexGluck
      25.10.2022 20:06
      +3

      А продвинутость где?


    1. JuriM
      25.10.2022 21:00

      В заключении :)


  1. numb
    26.10.2022 01:57

    Продвинутых относительно чего?

    Статья - просто список базовых команд cli утилиты docker. Мое мнение - тут и до базового уровня далеко