🧙 Садовник: уточнил шаги, добавил проверки и обоснования. Примите, если полезно.
#1Убедитесь, что у вас установлена последняя версия Docker, так как некоторые команды могут изменяться с обновлениями.
Сначала смотрим сервисы кластера:
Потом — все контейнеры на машине:
У контейнеров Swarm имена вида стек_сервис.1.длинныйидентификатор. У обычных — простые, из compose-файла. Это самый быстрый способ их различить.
- –Ты можешь назвать, какие контейнеры на машине от Swarm, а какие нет
- –Понимаешь, почему остановленный контейнер Swarm поднимается сам
Когда сервис уже живёт в Swarm, старый контейнер надо гасить тем же инструментом, которым поднимали:
Не пытайся гасить через docker stop контейнер Swarm-сервиса — кластер тут же создаст новый. Нужно docker service scale имя=0 или docker stack rm.
- –Каждый сервис запущен ровно один раз
- –Старые compose-контейнеры остановлены тем же инструментом, которым поднимались
После остановки дублирующих контейнеров убедитесь, что все сервисы работают корректно.
- –Все сервисы в состоянии RUNNING
- –Нет остановленных или неработающих сервисов
Тот же файл, что и для compose, но часть полей работает иначе:
- раздел
deployчитается только в Swarm, compose его игнорирует; buildв Swarm не работает — образ должен быть уже собран и доступен всем узлам;depends_onигнорируется — порядок запуска не гарантируется.
- –Стек виден в docker stack ls
- –Все сервисы в состоянии N/N
Если docker service ls показывает 0/1, смотри историю задач:
Колонка CURRENT STATE и ERROR обычно говорят всё. Типичные состояния:
- Rejected — узел отказался: нет образа, не сошлись ограничения размещения, нет ресурсов
- Failed — контейнер запустился и упал с ненулевым кодом
- Complete — контейнер вышел с кодом 0. При
restart_policy: on-failureкластер его НЕ поднимет, и сервис так и останется 0/1
Логи сервиса целиком: docker service logs имя --tail 50
- –Ты знаешь, чем отличаются Rejected, Failed и Complete
- –Умеешь смотреть логи сервиса, а не контейнера