Cargo с несколькими контейнерами
Cargo описывает одну нагрузку. В Nanocl 0.18 каждый Cargo объявляет один или несколько именованных Containers приложения, необязательные упорядоченные InitContainers и сохраняемое число Replicas.
ApiVersion: v0.18
Namespace: global
Cargoes:
- Name: storefront
Replicas: 2
NetworkMode: storefront-net
Secrets:
- shared-env
InitContainers:
- Name: migrate
Image: ghcr.io/example/storefront-migrate:1.0.0
Containers:
- Name: api
Image: ghcr.io/example/storefront-api:1.0.0
Healthcheck:
Test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:8080/health || exit 1"]
Interval: 5000000000
Timeout: 3000000000
Retries: 3
- Name: worker
Image: ghcr.io/example/storefront-worker:1.0.0
Essential: false
Secrets:
- worker-envИмена контейнеров должны быть уникальными в обоих списках. _sandbox зарезервировано Nanocl. Cargo должен иметь хотя бы один контейнер приложения и хотя бы одно обязательное приложение. Приложения обязательны, если не задано Essential: false; init-контейнеры всегда обязательны.
Реплики и песочница
Каждая реплика имеет свои процессы приложений и отдельные запуски init-контейнеров. Для двух и более приложений в сети, отличной от сети хоста, Nanocl создаёт внутренний процесс песочницы реплики. Приложения присоединяются к её сетевому пространству имён, разделяют IP-адрес и взаимодействуют через localhost.
Cargo с одним приложением запускает его напрямую, даже при наличии init-контейнеров. С NetworkMode: host приложения также запускаются напрямую. Песочница — деталь реализации: не объявляйте её в Statefile и не выбирайте как контейнер приложения.
Init-контейнеры каждой реплики выполняются последовательно в порядке объявления. Nanocl запускает приложения только после завершения всех init-контейнеров с кодом 0. Ненулевой код блокирует переход реплики к приложениям.
Общие настройки и настройки контейнеров
NetworkMode, PortBindings, Hostname и Dns Cargo настраивают владельца сети реплики. Secrets Cargo наследуются всеми init-контейнерами и приложениями. Placement и ResourceRequirement также принадлежат Cargo.
Каждый именованный контейнер сохраняет свою конфигурацию Docker: образ, команду, окружение, проверку здоровья, capabilities, устройства, binds, mounts и секреты контейнера. Файловые системы и пространства имён IPC, PID, UTS, пользователя и cgroup автоматически не разделяются. Для общих постоянных данных настройте одинаковый том Docker или bind mount у нужных контейнеров.
Nanocl резервирует поля владения сетью и жизненного цикла. Поля контейнера HostConfig.PortBindings, PublishAllPorts, AutoRemove, NetworkingConfig и NetworkDisabled отклоняются. HostConfig.NetworkMode контейнера можно опустить или задать как host либо none; прямые ссылки container:... в настройках сети, IPC, PID, UTS, пользователя и cgroup отклоняются.
Идентификация процессов и отказы
Ключ Cargo остаётся namespace.name, а каждый процесс имеет конкретное имя с порядковым номером реплики и логическим именем контейнера. Перед командами для процессов получите реальное имя или полный Docker ID через nanocl ps. См. Операции с процессами.
Процессы приложений по умолчанию используют политику перезапуска Docker always. Если обязательное приложение или необходимая песочница не готовы, Nanocl сообщает unhealthy для Cargo. Необязательное приложение по-прежнему управляется, но его здоровье не блокирует готовность Cargo.