Введение и использование Containerd
Введение и использование Containerd

Введение и использование Containerd

Ван Сяньсен2023-08-082023-08-08

Обзор контейнера

изучение Containerd Прежде чем нам нужно Docker Давайте сделаем краткий обзор истории разработки, ведь на практике задействовано довольно много компонентов. О многих из них мы часто слышим, но не знаем точно, для чего эти компоненты используются, например. libcontainerrunccontainerdCRIOCI и т. д.

Docker

от Docker 1.11 Версия запускается, Докер Работа с контейнерами осуществляется не просто Docker Daemon для запуска, а путем интеграции containerd、runc Ожидание завершения нескольких компонентов. Хотя Docker Daemon Модуль демона постоянно реконструируется, но основные функции и позиционирование особо не изменились. Они были всегда. CS Архитектура, хранитель процессов Docker Client терминальное взаимодействие и управление Docker зеркалоиконтейнер。сейчассуществоватьиз Компоненты в Архитектуре containerd будет отвечать за управление жизненным циклом контейнеров на узлах кластера и выше. Docker Daemon поставлять gRPC интерфейс.

Когда мы хотим создать контейнер, теперь Docker Daemon Вы не можете создать его для нас напрямую, но можете запросить containerd Чтобы создать контейнер,Containerd После получения запроса он не будет напрямую управлять контейнером, а создаст контейнер с именем containerd-shim процесс, позвольте этому процессу управлять контейнером. Мы указываем, что процессу-контейнеру нужен родительский процесс для сбора и поддержания статуса. stdin ждать fd Открытое ожидание работы из этого родительского процесса есть контейнер, то если containerd Если он зависнет, то все контейнеры на всем хосте должны будут выйти, а введение containerd-shim Эта прокладка позволяет избежать этой проблемы.

Затем для создания контейнера потребуется выполнить некоторые действия. namespaces и cgroups настройка и монтаж root Операции файловой системы, эти операции на самом деле имеют стандарты и спецификации, тогда есть OCI (стандарт открытого контейнера),runc Это эталонная реализация (Docker Принудительно до бесконечности libcontainer Пожертвуйте его и измените его имя runc ), этот стандарт на самом деле является документом, который в основном оговаривает структуру образа контейнера и какие инструкции по эксплуатации должен получить контейнер, например: create、start、stop、delete ждать Эти Заказ。runc Просто следуй этому OCI документ для создания контейнера, соответствующего спецификации. Поскольку это стандарт, должны быть и другие. OCI реализация, например Kata、gVisor Эти контейнеры совместимы со средой выполнения. OCI Стандарт.

Итак, на самом деле запуск контейнера осуществляется через containerd-shim позвонить runc начать контейнериз,runc Началоськонтейнер Тогда он выйдет напрямую,containerd-shim станет родительским процессом процесса-контейнера, Отвечает за сбор статуса контейнерных процессов, Сообщите containerd, и в контейнере pid для 1 После завершения процесса он берет на себя управление дочерними процессами в контейнере для очистки. Убедитесь, что процессы-зомби не появляются.

и Docker Воля Контейнерные операции Все перенесеныприезжать containerd Вхожу, потому что в настоящее время занимается Рой, хочу войти PaaS Рынок, сделавший эту архитектуру сегментированной, позволит Docker Daemon Конкретно отвечаю за упаковку и оркестровку верхнего слоя. Конечно, мы знаем последующие результаты. Swarm существовать Kubernetes Передо мной было катастрофическое поражение, а затем Docker Компания будет containerd Проект был передан в дар CNCF Фонд, это тоже сейчас существуетиз Docker Архитектура。

CRI

мы знаем Kubernetes поставлять Понятноодин CRI интерфейс среды выполнения контейнера, то это CRI Что такое приезжать? это вообще-то тоже Docker развитие тесно связано.

существовать Kubernetes В первые дни, в то время Docker Реальность существования слишком горячая, Kubernetes Конечно, я сначала поддержу его. Docker, и он передается жестко закодированным путем непосредственного вызова. Docker API, за которым следует Docker постоянное развитие и Google В Kubernetes доминирует больше сред выполнения контейнеров. для поддерживает более оптимизированное изконтейнервремя выполнения,Google Just и Red Hat доминируют на посадочной площадке дистанция Понятно CRI стандарт для конвертации Kubernetes платформаиидентификацияизконтейнервремя выполнение (конечно, в основном для, убей его Docker) развязка.

CRI(Container Runtime Interface интерфейс среды выполнения контейнера) по сути Kubernetes Набор интерфейсов, определенных для взаимодействия со средой выполнения контейнера, поэтому любая среда выполнения контейнера, реализующая этот набор интерфейсов, может быть подключена к Kubernetes Поднимитесь на платформу. но Kubernetes посадочная дистанция CRI Этот набор стандартов все еще доминировал в то время, поэтому существуют некоторые контейнервремя. выполнение может не сбыться само по себе CRI интерфейс, так что есть прокладка (прокладка), один shim из-за ответственности естьделатьдля Адаптер будет различнымконтейнервремя выполнениясамизинтерфейсприспособлениеприезжать Kubernetes из CRI на интерфейсе, среди которых dockershim то есть Kubernetes стыковка Docker приезжать CRI интерфейс на изодинской реализации прокладки.

Kubelet проходить gRPC Среда выполнения платформы и контейнера или shim общаться, при котором kubelet для клиента, ЦРИ shim(Это также может бытьконтейнервремя само выполнение) как для сервера.

CRI Определение API В основном включает в себя два gRPC Служить,ImageService и RuntimeService,ImageService Услуга в основном заключается в вывозе изображение、Посмотреть и Удалить изображениеждать Держатьделать,RuntimeService Он используется для управления Pod жизненный цикл иконтейнериз, а также взаимодействие с контейнеризвызов (exec/attach/port-forward) операции ожидания, могут осуществлять kubelet Китайский логотип --container-runtime-endpoint и --image-service-endpoint настроить оба сервиса из сокетов.

Но здесь такой же есть и исключения для одного, то есть есть Докер, из-за Docker В то время из имел очень высокий статус в мире, и Kubernetes Это напрямую встроено dockershim существовать kubelet в из, поэтому, если вы используетеиз, это Docker Этот видконтейнервремя выполнение Нет необходимости обращаться к адаптеру Установкаконфигурации самостоятельно, и конечно этот шаг кажется парализующим. Docker компания.

Теперь существовать, если мыиспользуем Docker изразговаривать,когда мысуществовать Kubernetes Создано в один Pod во время, сначала есть kubelet проходить CRI Вызов интерфейса dockershim,Запрос на создание одинконтейнера,kubelet Можно рассматривать как один простойиз CRI Client, и dockershim то есть Получить запросиз Сервера, но они все существуют kubelet Встроенный из.

dockershim После получения запроса на проживание, преобразован в Docker Daemon Может идентифицировать запросы, волосыприезжать Docker Daemon Создано по запросу одинконтейнер, запросил приезжать Docker Daemon Следовать за есть Docker Создать контейнеризпроцесс Понятно,позвонить containerd,затем создайте containerd-shim процесс,проходить Долженпроцесспозвонить runc чтобы фактически создать контейнер.

На самом деле, если внимательно понаблюдать, нетрудно найти применение Docker На самом деле цепочка вызовов относительно длинная, и реальная операция фактически связана с контейнером. containerd Этого вполне достаточно, Докер Слишком сложно и громоздко, конечно. Docker Популярные избигодинпричина есть посуда имеет множество удобных функций, но для Kubernetes В этих функциях вообще нет необходимости, поскольку суть фор заключается в использовании интерфейса для работы с контейнером, поэтому, естественно, вы можете использовать контейнервремя. выполнениявыключательприезжать containerd Приходить.

выключательприезжать containerd Промежуточные звенья можно исключить, а опыт эксплуатации тот же, что и раньше, но потому что Используйте напрямуюконтейнервремя график выполнения контейнера, значит они правы Docker Это невидимо. Итак, вы проверяли эти контейнериз Docker Инструмент нельзя использовать.

ты больше не можешь использовать docker ps или docker inspect Заказполучитьконтейнеринформация。потому чтоне могусписок контейнеров, поэтому вы не можете получить логи, остановить контейнер или даже передать docker exec существоватьконтейнерказнен в Заказ。

Конечно, мы все еще можем скачать зеркало или пользователей. docker build команду для создания образа, но используйте Docker Сборка, скачивание иззеркало, для контейнервремя выполненияи Kubernetes,Ничего не видно。для Понятносуществовать Kubernetes Для использования вам необходимо отодвинуть зеркало на склад прибывающего зеркала.

Вы можете видеть на картинке выше, что существуют containerd 1.0 центр, справа CRI изприспособлениедапроходитьодинодиниз CRI-Containerd процесс для завершения, потому что изначально containerd Он также будет адаптироваться к другим системам (таким как рой), поэтому прямой реализации нет ЦНИИ, так чтоэтотстыковка Оставь работу CRI-Containerd этот shim .

Тогда приезжать containerd 1.1 Удален после версии CRI-Containerd этот shim, напрямую интегрируйте логику адаптации в виде плагина. containerd В основном процесс, сейчас существует для того, чтобы извызов были более краткими.

в то же время Kubernetes Сообщество также создало один, посвященный Kubernetes из CRI время выполнения CRI-O,Прямая совместимость со спецификациями CRI и OCI.

этотплани containerd эта схема явно лучше стандартной dockershim Это намного проще, но поскольку большинство пользователей привыкли использовать Docker, поэтому все по-прежнему предпочитают его использовать dockershim план.

Но с CRI Программы из Разработки и другое контейнервремя выполненияверно CRI поддержка становится все более полной, Kubernetes Сообществосуществовать 2020 Год 7 Начал удалять через месяц dockershim план Понятно:https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2221-remove-dockershim 1.20 Генерал-лейтенант kubelet Встроенный из dockershim Разделение кода, встроенный dockershim отметкадлярежим обслуживания,Конечно, это все еще нормально, если использовать dockershim.,Цельсуществовать 1.23/1.24 Ни одна версия не выпущена dockershim из версии (код все еще существует, но он должен поддерживаться «из коробки» по умолчанию) docker Нужно построить самому kubelet, будет существовать после определенного льготного периодаот kubelet Удалить встроенный из dockershim код).

Так значит ли это, что Kubernetes Больше не поддерживается Docker Как дела? Конечно нет, это просто устаревшая встроенная функция. dockershim Возможности и функции, Докер идругойконтейнервремя выполнение будет рассматриваться одинаково и не будет рассматривать встроенную поддержку отдельно, если мы также хотим напрямую использовать Docker Этот видконтейнервремя Что должно делать выполнение? может быть dockershim функция извлекается отдельно и поддерживается независимо cri-dockerd Вот и все, как containerd 1.0 Версия в представлении CRI-Containerd,Конечно, есть другой способ есть Docker Официальное сообщество будет CRI интерфейсвстроенныйприезжать Dockerd добиться.

Но мы также знаем Dockerd Также перейдите непосредственно к вызову Containerd,и containerd 1.1 Он будет реализован встроенным после версии ЦНИИ, так что Docker Нет необходимости реализовывать его отдельно CRI Да, когда Kubernetes Больше нет встроенной поддержки из коробки. Docker Отныне лучший способ, конечно, естьпрямойиспользовать Containerd Этот видконтейнервремя выполнения,ии Долженконтейнервремя выполнение также практикуется в производственной среде, давайте узнаем об этом дальше Containerd изиспользовать。

Containerd

containerd Это один из стандартов промышленного класса изконтейнервремени. выполнения,это подчеркиваетпростотаНадежностьипортативность,containerd Может нести ответственность за выполнение следующих задач:

  • Управлять жизненным циклом контейнера (от Создать контейнерприезжатьразрушатьконтейнер)
  • Тянуть/толкать контейнерзеркало
  • Управление хранилищем (управление зеркалом и данными контейнера из хранилища)
  • вызов runc Запустить контейнер (с runc ждатьконтейнервремя выполнениявзаимодействие)
  • управлятьконтейнерсетьинтерфейсисеть

Архитектура

containerd Может использоваться как Linux и Windows издаэмон, который управляет полным жизненным циклом изконтейнера своей хост-системы, отзеркало передачу и хранение, приезжает выполнение и мониторинг контейнера, а затем перемещает базовое хранилище, перемещает сетевые вложения и т. д.

Картинка выше containerd Официальное изображение по представлению архитектуры можно увидеть. containerd То же самое относится и к принятию из C/S Архитектура,Служитьконецпроходить unix domain socket Открытый нижний уровень из gRPC API интерфейс, клиент использует эти API изконтейнер на узле управления, каждый containerd Отвечает только за одну машину, Pull зеркало, операции по контейнеризации (запуск, остановка ожидания), сети и хранилища выполняются containerd Заканчивать. В частности, контейнер управляется runc Ответственный, по сути, до тех пор, пока он отвечает OCI Технические характеристики изконтейнера могут поддерживаться.

для развязки, контейнер Система разделена на различные компоненты, каждый из которых состоит из нескольких модулей (Core часть), каждый тип модуля интегрирован в виде плагина. Containerd , а плагины являются взаимоисключающими. Например, на рисунке выше каждая длинная пунктирная линия и прямоугольник представляют тип плагина, в том числе. Service Plugin、Metadata Plugin、GC Plugin、Runtime Plugin ждать,в Service Plugin снова будет зависеть Metadata Plugin、GC Plugin и Runtime Плагин. Каждый маленький прямоугольник представляет собой один сегмент плагина, например. Metadata Plugin полагаться Containers Plugin、Content Plugin ждать。например:

  • Content Plugin: Благодаря тому, что он имеет доступ к адресуемому контенту в зеркале, все неизменяемое содержимое хранится здесь.
  • Snapshot Plugin: Используется для управления снимками файловой системы контейнерзеркалоиз, каждый слой в зеркале будет распакован в снимок файловой системы. на: Docker серединаиз graphdriver。

Общий containerd Его можно разделить на три основных блока: хранилище и метаданные. и Runtime。

Контейнерная установка

Вот моя система использования CentOS 7.9,Сначала проверьте, установлен ли seccomp полагаться:

Язык кода:javascript
копировать
$ cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
$ rpm -qa |grep libseccomp
libseccomp-2.3.1-4.el7.x86_64
# Если Нет Установить libseccomp Затем пакет выполняет следующее из Заказ Установитьполагаться
$ yum install wget -y
$ wget http://mirror.centos.org/centos/7/os/x86_64/Packages/libseccomp-2.3.1-4.el7.x86_64.rpm
$ yum install libseccomp-2.3.1-4.el7.x86_64.rpm -y

потому что containerd Нужно позвонить runc, поэтому нам также нужно сначала его установить беги, но containerd по представлениюодин содержит соответствующие рекомендациииз сжатых пакетов cri-containerd-cni-{VERSION}.{OS}-

Язык кода:javascript
копировать
# Создайте каталог для хранения пакетов программного обеспечения.
mkdir -p /server/tools/
cd /server/tools/
# Скачать пакет
wget https://github.com/containerd/containerd/releases/download/v1.7.3/cri-containerd-cni-1.7.3-linux-amd64.tar.gz
# Непосредственно разархивируйте сжатый пакет в каждый каталог системы проживания.
tar xvf cri-containerd-cni-1.7.3-linux-amd64.tar.gz -C /

## Файл запуска службы
cp /opt/containerd-1.7.3/etc/systemd/system/containerd.service /usr/lib/systemd/system/

Создайте файл конфигурации Containerd.

Язык кода:javascript
копировать
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

# 1. Измените файл ContainerdizConfiguration (необязательно 1). 2)
sed -i "s#SystemdCgroup\ \=\ false#SystemdCgroup\ \=\ true#g" /etc/containerd/config.toml
 
cat /etc/containerd/config.toml | grep SystemdCgroup
 
# 2. попытаться найтиприезжатьcontainerd.runtimes.runc.options,существовать Добавлено нижеSystemdCgroup = true
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
              SystemdCgroup = true
    [plugins."io.containerd.grpc.v1.cri".cni]

# 3. Добавить источник зеркала Али
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
        endpoint = ["https://l12384zex.mirror.aliyuncs.com"]  # Настройте свой источник

# 4. Измените адрес по умолчанию sandbox_image, чтобы он соответствовал адресу версии.
    sandbox_image = "kubernetes/pause"                       # По умолчанию он может быть заблокирован.
  • registry.mirrors."xxx": выразить потребность Конфигурация mirror склад-иззеркало, например registry.mirrors."docker.io" выражать Конфигурация docker.io из mirror。
  • endpoint: выражатьпоставлять mirror Например, мы можем зарегистрировать один сервис ускорения «Иззеркало» Alibaba Cloud и «Ззеркало», чтобы сделать это для docker.io из mirror。

В пути к хранилищу по умолчанию есть еще два пути:

Язык кода:javascript
копировать
root = "/var/lib/containerd"
state = "/run/containerd"

в root Он используется для сохранения постоянных данных, в том числе Snapshots, Content, Metadata Помимо различных данных плагина, каждый плагин имеет свой отдельный каталог Containerd. Сам он не хранит никаких данных, а все его функции берутся из загруженных плагинов.

икроме тогоиз state используется для экономии времени выполнение Временные данные, в том числе сокеты, pid, точка монтирования, время статус выполнения и нет необходимости сохранять данные плагина.

Запустить контейнер

containerd Сжатый пакет содержит один etc/systemd/system/containerd.service из файла, чтобы мы могли провести systemd настроить containerd Процесс для Guardian запущен, и его содержимое следующее:

Язык кода:javascript
копировать
$ cat /etc/systemd/system/containerd.service
# Copyright The containerd Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target

[Service]
#uncomment to enable the experimental sbservice (sandboxed) version of containerd/cri integration
#Environment="ENABLE_CRI_SANDBOXES=sandboxed"
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd

Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target

Здесь есть два важных параметра:

  • Delegate: эта опция позволяет containerd кивремя выполнения Собственныйуправлять Собственный Создать контейнериз группы. Если эта опция не установлена, systemd перенесу процесс, чтобы приехать самостоятельно из cgroups в, оти приводит к containerd Не удалось правильно получить ситуацию использования контейнера ресурсов.
  • KillMode: эта опция используется для обработки containerd Процесс был убит из-за этого. По умолчанию, systemd встречасуществоватьпроцессиз cgroup Найти и убить containerd из Все детипроцесс。KillMode Поля можно задатьиз Значения следующие。
    • control-group(значение по умолчанию):В текущей контрольной группеиз Все детипроцесс,Все будут убиты
    • process:Только убей мастерапроцесс
    • mixed:хозяинпроцессполучитприезжать SIGTERM Сигнал,ребенокпроцессполучатьприезжать SIGKILL Сигнал
    • none:Нетпроцессвстречабыть убитым,Просто выполните услугу из стоп-заказа.

мы должны KillMode из Настройка значениядля процесс, это гарантирует перезапуск обновления containerd Когда не убиваешь имеющийся изконтейнер.

Теперь мы можем запустить контейнер, просто выполнив следующее:

Язык кода:javascript
копировать
systemctl enable containerd --now

Его можно использовать после завершения запуска. containerd местный CLI инструмент ctr Например, проверьте версию:

Язык кода:javascript
копировать
[root@containerd ~]# ctr version
Client:
  Version:  v1.7.3
  Revision: 7880925980b188f4c97b462f709d0db8e8962aff
  Go version: go1.20.6

Server:
  Version:  v1.7.3
  Revision: 7880925980b188f4c97b462f709d0db8e8962aff
  UUID: 3e9b45dc-8dec-4b0f-b61f-01db90653f3c

Контейнерное использование

мы знаем Docker CLI инструмент обеспечивает необходимость улучшения пользовательского опыта за счет функций, контейнеров и такой жетакжепоставлятьодинпереписыватьсяиз CLI инструмент:ctr,но ctr из Функция Нет docker Идеально, но основные функции зеркаликонтейнериз все есть. Далее мы кратко представим ctr изиспользовать。

помощь

Прямой ввод ctr Заказ Получить всю актуальную информацию об операциях Заказиспользовать способами:

Язык кода:javascript
копировать
ctr
NAME:
   ctr - 
        __
  _____/ /______
 / ___/ __/ ___/
/ /__/ /_/ /
\___/\__/_/

containerd CLI


USAGE:
   ctr [global options] command [command options] [arguments...]

VERSION:
   v1.7.3

DESCRIPTION:
   
ctr is an unsupported debug and administrative client for interacting
with the containerd daemon. Because it is unsupported, the commands,
options, and operations are not guaranteed to be backward compatible or
stable from release to release of the containerd project.

COMMANDS:
   plugins, plugin            Provides information about containerd plugins
   version                    Print the client and server versions
   containers, c, container   Manage containers
   content                    Manage content
   events, event              Display containerd events
   images, image, i           Manage images
   leases                     Manage leases
   namespaces, namespace, ns  Manage namespaces
   pprof                      Provide golang pprof outputs for containerd
   run                        Run a container
   snapshots, snapshot        Manage snapshots
   tasks, t, task             Manage tasks
   install                    Install a new package
   oci                        OCI tools
   sandboxes, sandbox, sb, s  Manage sandboxes
   info                       Print the server info
   shim                       Interact with a shim directly
   help, h                    Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --debug                      Enable debug output in logs
   --address value, -a value    Address for containerd's GRPC server (default: "/run/containerd/containerd.sock") [$CONTAINERD_ADDRESS]
   --timeout value              Total timeout for ctr commands (default: 0s)
   --connect-timeout value      Timeout for connecting to containerd (default: 0s)
   --namespace value, -n value  Namespace to use with commands (default: "default") [$CONTAINERD_NAMESPACE]
   --help, -h                   show help
   --version, -v                print the version

Операция зеркала

Вытащить изображение

Вытащить изображение Можетиспользовать ctr image pull для завершения, например, вытягивание Docker Hub Официальное изображение nginx:alpine,Следует отметить, что из зеркала и в адресе требуется плюс. docker.io Host адрес:

Язык кода:javascript
копировать
$ ctr image pull docker.io/library/nginx:alpine
docker.io/library/nginx:alpine:                                                   resolved       |++++++++++++++++++++++++++++++++++++++| 
index-sha256:1713c88213a02f5595dd34520e9b7b26aa58dbfd192cf55b57209507dd7ed113:    done           |++++++++++++++++++++++++++++++++++++++| 
manifest-sha256:2d4efe74ef541248b0a70838c557de04509d1115dec6bfc21ad0d66e41574a8a: done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:768e67c521a97f2acf0382a9750c4d024fc1e541e22bab2dec1aad36703278f1:    done           |++++++++++++++++++++++++++++++++++++++| 
config-sha256:4937520ae206c8969734d9a659fc1e6594d9b22b9340bf0796defbea0c92dd02:   done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:4db1b89c0bd13344176ddce2d093b9da2ae58336823ffed2009a7ea4b62d2a95:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:bd338968799fef766509223449d72392692f1f56802da9059ae3f0965c2885e2:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:6a107772494d184e0fddf5d99c877e2fa8d07d1d47b714c17b7d20eba1da01c6:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:9f05b0cc5f6e8010689a6331bad9ca02c62caa226b7501a64d50dcca0847dcdb:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:4c5efdb87c4a2350cc1c2781a80a4d3e895447007d9d8eac1e743bf80dd75c84:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:c8794a7158bff7f518985e76c590029ccc6b4c0f6e66e82952c3476c095225c9:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:8de2a93581dcb1cc62dd7b6e1620bc8095befe0acb9161d5f053a9719e145678:    done           |++++++++++++++++++++++++++++++++++++++| 
elapsed: 13.3s                                                                    total:  16.2 M (1.2 MiB/s)                                       
unpacking linux/amd64 sha256:1713c88213a02f5595dd34520e9b7b26aa58dbfd192cf55b57209507dd7ed113...
done: 636.92611ms

Также можно использовать --platform Опция указывает соответствующее иззеркало платформы. Конечно, в соответствии с из, есть еще и зеркалоиз Заказ. ctr image push,еслидачастныйзеркалоносуществовать Толкатьизкогда Можетпроходить --user Настройте склад по имени пользователя и паролю.

Получение списка локальных зеркал

Язык кода:javascript
копировать
ctr image ls

использовать -q(--quiet) Возможность распечатать только имя изображения.

Обнаружить локальное зеркало

Язык кода:javascript
копировать
ctr image check

Основной вид, а именно STATUS,complete Указывает на то, что зеркало полностью исправно и доступно.

переименовывать

такой жеиз Мы также можем переименовать назначенный иззеркалодин Tag:

Язык кода:javascript
копировать
$ ctr image tag docker.io/library/nginx:alpine harbor.boysec.cn/course/nginx:alpine
harbor.boysec.cn/course/nginx:alpine
$ ctr image ls -q
docker.io/library/nginx:alpine
harbor.boysec.cn/course/nginx:alpine

Удалить изображение

ненужныйиспользоватьиззеркало Также можно использовать ctr image rm Чтобы удалить:

Язык кода:javascript
копировать
$ctr image rm harbor.boysec.cn/course/nginx:alpine
harbor.boysec.cn/course/nginx:alpine
$ctr image ls -q
docker.io/library/nginx:alpine

плюс --sync Опции можно синхронизировать Удалить изображение Все по теме из ресурсов.

Установите зеркало в каталог хоста прибытия.

Язык кода:javascript
копировать
$ ctr image mount docker.io/library/nginx:alpine /mnt
sha256:e65db1c2e5cc19ab93e734e2b72a2da80e3b8885d5bb57826fb3d6e2598e054f
/mnt
$ tree -L 1 /mnt
/mnt
├── bin
├── dev
├── docker-entrypoint.d
├── docker-entrypoint.sh
├── etc
├── home
├── lib
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin
├── srv
├── sys
├── tmp
├── usr
└── var

18 directories, 1 file

Удалите каталог хоста «зеркало»

Язык кода:javascript
копировать
$ ctr image unmount /mnt
/mnt

Экспортировать зеркало в сжатую упаковку.

Язык кода:javascript
копировать
$ ctr image export --all-platforms nginx.tar.gz docker.io/library/nginx:alpine

от Сжатый пакет импортного зеркала

Язык кода:javascript
копировать
$ ctr image import nginx.tar.gz

Прямой импорт может выглядеть аналогично ctr: content digest sha256:xxxxxx not found изError, для решения этого метода необходим pull Все изображения платформы:

Язык кода:javascript
копировать
$ ctr i pull --all-platforms docker.io/library/nginx:alpine
$ ctr i export --all-platforms nginx.tar.gz docker.io/library/nginx:alpine
$ ctr i rm docker.io/library/nginx:alpine
$ ctr i import nginx.tar.gz

Контейнерные операции

контейнер Связанные операции можно выполнить с помощью ctr container Получать.

Создать контейнер

Язык кода:javascript
копировать
$ ctr container create docker.io/library/nginx:alpine nginx

список контейнеров

Язык кода:javascript
копировать
$ ctr container ls
CONTAINER    IMAGE                             RUNTIME
nginx        docker.io/library/nginx:alpine    io.containerd.runc.v2

такой же Можетплюс -q Краткий список опций:

Язык кода:javascript
копировать
$ ctr container ls -q
nginx

Просмотр подробной конфигурации контейнера

Похоже на: docker inspect Функция.

Язык кода:javascript
копировать
$ ctr container info nginx
{
    "ID": "nginx",
    "Labels": {
        "io.containerd.image.config.stop-signal": "SIGQUIT",
        "maintainer": "NGINX Docker Maintainers \u003cdocker-maint@nginx.com\u003e"
    },
    "Image": "docker.io/library/nginx:alpine",
    "Runtime": {
        "Name": "io.containerd.runc.v2",
        "Options": {
            "type_url": "containerd.runc.v1.Options"
        }
    },
    "SnapshotKey": "nginx",
    "Snapshotter": "overlayfs",
    "CreatedAt": "2023-08-08T07:36:38.542046272Z",
    "UpdatedAt": "2023-08-08T07:36:38.542046272Z",
    "Extensions": {},
    "SandboxID": "",
    "Spec": {
......

Удалить контейнер

Язык кода:javascript
копировать
$ ctr container rm nginx
$ ctr container ls
CONTAINER    IMAGE    RUNTIME

удалять Понятноиспользовать rm ребенок Заказснаружи Также можно использовать delete или ВОЗ del Удалить контейнер。

Задача

Выше мы приводим container create Заказал создание изконтейнера, и нет в рабочем состоянии, всего один статический изконтейнер. один container Объект содержит только ресурсы, необходимые для запуска одинконтейнера, и соответствующие данные конфигурации, указывающие namespaces、rootfs иконтейнериз Конфигурация успешно инициализирована, но пользовательский процесс все еще не запущен.

одинконтейнер действительно работает Task Задачареализацияиз,Задача Вы можете настроить сетевую карту с помощью Контейнера, а также можете использовать Инструмент Конфигурации для мониторинга контейнерожидания.

Task Связанные операции можно выполнить с помощью ctr task Получите, следуйте за нами Task Чтобы запустить контейнер:

Язык кода:javascript
копировать
$ ctr container create docker.io/library/nginx:alpine nginx
# ctr task start -d nginx Ниже приведены отчеты об ошибках. runC сообщает об Надо сделать ремонт
# ctr: failed to create shim task: OCI runtime create failed: unable to retrieve OCI runtime error (open /run/containerd/io.containerd.runtime.v2.task/default/nginx/log.json: no such file or directory): runc did not terminate successfully: exit status 127: unknown
$ ctr task start -d nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/

запускатьконтейнерназад Можетпроходить task ls Проверятьтолькосуществоватьбегатьизконтейнер:

Язык кода:javascript
копировать
$ ctr task ls
TASK     PID     STATUS    
nginx    2121    RUNNING

такой же Также можно использовать exec Команда поступает в контейнер для работы:

Язык кода:javascript
копировать
$ ctr task exec --exec-id 0 -t nginx sh
/ #

Однако здесь следует отметить, что необходимо указать --exec-id параметр,этот id Вы можете написать все, что захотите, главное, чтобы это было уникально.

паузаконтейнер,и docker pause Аналогичные функции:

Язык кода:javascript
копировать
$ ctr task pause nginx

После паузы статус контейнера становится PAUSED

Язык кода:javascript
копировать
$ ctr task ls
TASK     PID     STATUS
nginx    2121    PAUSED

такой же Также можно использовать resume Команда для восстановления контейнера:

Язык кода:javascript
копировать
$ ctr task resume nginx
$ ctr task ls
TASK     PID     STATUS
nginx    2121    RUNNING

Но нужно обратить внимание ctr Нет stop Функция контейнеризации может только приостановить или уничтожить контейнер. убить контейнер можно использовать task kill Заказ:

Язык кода:javascript
копировать
$ ctr task kill nginx
$ ctr task ls
TASK     PID     STATUS
nginx    2121    STOPPED

Убив контейнер, вы увидите, что статус приезжатьконтейнериз изменился. STOPPED。такой жетакже Можетпроходить task rm команда удаления Task:

Язык кода:javascript
копировать
$ ctr task rm nginx
$ ctr task ls
TASK    PID    STATUS

Кроме того, мы также можем получить контейнериз cgroup Сопутствующая информация, можно использовать task metrics Заказ используется для получения контейнериз памяти и процессора. и PID изпределы ииспользоватьколичество。

Язык кода:javascript
копировать
# Перезапустить контейнер
$ ctr task metrics nginx
ID       TIMESTAMP                             
nginx    seconds:1691481224 nanos:147205514    

METRIC                   VALUE                  
memory.usage_in_bytes    1814528                
memory.limit_in_bytes    9223372036854771712    
memory.stat.cache        12288                  
cpuacct.usage            20856699               
cpuacct.usage_percpu     [20856699]             
pids.current             2                      
pids.limit               0  

возвращаться Можетиспользовать task ps Заказ Просмотреть все процесссуществоватьхосты в контейнериз PID:

Язык кода:javascript
копировать
$  ctr task ps nginx
PID     INFO
2294    -
2321    -
$ ctr task ls
TASK     PID     STATUS
nginx    2294    RUNNING

в Нет.один PID 2294 то естьнасконтейнерсерединаиз 1 номер процесса.

пространство имен

кроме того Containerd пространство также поддерживается в Китае концепция имениз, такая как просмотр космоса имен:

Язык кода:javascript
копировать
$ ctr ns ls
NAME    LABELS
default

Если не указано, ctr Использование по умолчанию default космос。такой же Также можно использовать ns create Заказсоздаватьодинпространство имен:

Язык кода:javascript
копировать
$ ctr ns create test
$ ctr ns ls
NAME    LABELS
default
test

использовать remove или ВОЗ rm Можно удалить namespace:

Язык кода:javascript
копировать
$ ctr ns rm test
test
$ ctr ns ls
NAME    LABELS
default

иметь Понятнопространство После имен можно указать, когда существует ресурс, из пространство имен, например просмотр test пространство имениззеркало,Можетсуществовать Держатьделать Заказпозжеплюс -n test Параметры:

Язык кода:javascript
копировать
$ ctr -n test image ls
REF TYPE DIGEST SIZE PLATFORMS LABELS

мы знаем Docker Фактически, это также вызов по умолчанию. контейнер, на самом деле Docker использоватьиз containerd Подземное пространство имена По умолчанию moby,и Нетда default,所к假如насиметь用 docker Запустите контейнер, тогда мы также сможем отправить ctr -n moby Чтобы найти изконтейнер ниже:

Язык кода:javascript
копировать
$ ctr -n moby container ls

такой же Kubernetes Внизиспользоватьиз containerd по умолчаниюпространство имена это k8s.io,所кнас Можетиспользовать ctr -n k8s.io Приходите и посмотрите Kubernetes Создайте изконтейнер ниже.

runC сообщает об ошибке

Запрос при выполнении команды runc:

Язык кода:javascript
копировать
[root@containerd tools]# runc
runc: symbol lookup error: runc: undefined symbol: seccomp_notify_respond

Решение: этотдасказать не хватаетполагаться Сумкаlibseccomp,нужно вниманиеиздаcentos7серединаyumскачатьиз Версияда2.3из,Версия не соответствует нашим последним требованиям контейнерного бизнеса.,Нужно скачать версию 2.4 или выше из

Язык кода:javascript
копировать
[root@containerd tools]# wget http://rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm
[root@containerd tools]# rpm -Uvh libseccomp-2.5.1-1.el8.x86_64.rpm 
boy illustration
Введение в параметры конфигурации большого экрана мониторинга Grafana (2)
boy illustration
В статье «Научно-популярная статья» подробно объясняется протокол NTP: анализ точной синхронизации времени.
boy illustration
Пример разработки: серверная часть Java и интерфейсная часть vue реализуют функции комментариев и ответов.
boy illustration
Nodejs реализует сжатие и распаковку файлов/каталогов.
boy illustration
SpringBootИнтегрироватьEasyExcelСложно реализоватьExcelлистимпортировать&Функция экспорта
boy illustration
Настройка среды под Mac (используйте Brew для установки go и protoc)
boy illustration
Навыки разрешения конфликтов в Git
boy illustration
Распределенная система журналов: развертывание Plumelog и доступ к системе
boy illustration
Артефакт, который делает код элегантным и лаконичным: программирование на Java8 Stream
boy illustration
Spring Boot(06): Spring Boot в сочетании с MySQL создает минималистскую и эффективную систему управления данными.
boy illustration
Как использовать ArrayPool
boy illustration
Интегрируйте iText в Spring Boot для реализации замены контента на основе шаблонов PDF.
boy illustration
Redis реализует очередь задержки на основе zset
boy illustration
Получить текущий пакет jar. path_java получает файл jar.
boy illustration
Краткое обсуждение высокопроизводительного шлюза Apache ShenYu
boy illustration
Если вы этого не понимаете, то на собеседовании даже не осмелитесь сказать, что знакомы с Redis.
boy illustration
elasticsearch медленный запрос, устранение неполадок записи, запрос с подстановочными знаками
boy illustration
По какому стандарту взимается плата за обслуживание программного обеспечения?
boy illustration
IP-адрес Получить
boy illustration
【Java】Решено: org.springframework.web.HttpRequestMethodNotSupportedException
boy illustration
Native js отправляет запрос на публикацию_javascript отправляет запрос на публикацию
boy illustration
.net PDF в Word_pdf в Word
boy illustration
[Пул потоков] Как Springboot использует пул потоков
boy illustration
Подробное объяснение в одной статье: Как работают пулы потоков
boy illustration
Серия SpringCloud (6) | Поговорим о балансировке нагрузки
boy illustration
IDEA Maven может упаковать все импортное полностью красное решение — универсальное решение.
boy illustration
Последний выпуск 2023 года, самое полное руководство по обучению Spring Boot во всей сети (с интеллект-картой).
boy illustration
[Решено — Практическая работа] SaTokenException: запрос не может быть получен в контексте, отличном от Интернета. Решение проблем — Практическая работа.
boy illustration
HikariPool-1 - Connection is not available, request timed out after 30000ms
boy illustration
Power Query: автоматическое суммирование ежемесячных данных с обновлением одним щелчком мыши.