К основному контенту

Docker tips

Так случается в экспериментах с docker, что возникают повторяющиеся проблемы, решение которых ты уже находил, но приходится гуглить их снова. Поэтому буду складывать здесь найденные решения, чтобы не забыть.
Большая часть проблем приходится на управление swarm (роем/кластером), что собственно неудивительно, т.к. надо разворачивать топологию, размечать метками для сервисов, обеспечивать доступность образов (если используется локальный реп, а не DockerHub).
Докер развернут у меня на обычной windows-10 home edition, т.е. виртуализации нет, поэтому приходится пользоваться Docker Toolkit на виртуальных машинах. С этим жить в принципе можно, хотя и есть некоторые особенности, которые в обычных гайдах не указываются (там тем более чаще всего фигурирует Linux).

Не находится образы на нодах

При деплое стека через compose-файл в статусе отображается "No such image 192.168.99.100:5000/имя_образа". Хотя образ точно был собран и отображается в docker images под именно таким названием.
Здесь возможны как минимум 2 причины:
1. Реестр образов не запущен. Когда собираются образы, они хранятся в локальной репе (аналог репы maven), но он виден только на той машине, где они собирались. Для того, чтоб их начали видеть ноды, нужно их задеплоить в общее место - это может быть DockerHub или кастомная репа (аналог nexus/artifactory для того же maven). Для кастомной репы нужно запустить ее образ в докере. Инструкция здесь: https://docs.docker.com/registry/deploying/.
2. Ноды не могут достучаться до реестра. Причина может быть в ненастроенном https - см. дальше об этом.

Ноды требуют https протокол для реестра

Во время попытки запуска сервиса на ноде, попытке запуллить образ на ноду или при попытке запушить образ в реестр возникает подобная ошибка:
server gave HTTP response to HTTPS client
Это связано с тем, что по-умолчанию ноды (в том числе и дефолтный) используют https для безопасности. Чтобы это обойти и разрешить ходить по http, необходимо установить флаг --insecure-registry.
Для дефолтной ноды можно добавить его в параметры инициализации в следующем файле:
$USER/.docker/machine/machines/default/config.json
Добавляется следующий параметр:
    "EngineOptions": {
        "InsecureRegistry": [
            "192.168.99.100/5000"
        ],
    }
Для нод же придется лезть в каждую по ssh и проставлять параметр руками в /var/lib/boot2docker/profile:
--insecure-registry 192.168.99.100:5000
Далее следует перезагрузить ноду:
docker-machine restart node_name
Данный вариант является небзопасным и применять его не для локальных экспериментов крайне не рекомендуется.
Так же следует помнить, что операцию на нодах придется повторить, если они удалялись.

Сервисы зависли в статусе Pending

 После деплоя приложения на кластер, сервисы, которые должны запускаться, висят в Pending статусе. Вероятнее всего, докер не может найти подходящих нод для разворачивания сервиса. Тут следует проверить compose-файл и сравнить их с настройками кластера - вероятно есть какая-то нестыковка в placement-ограничениях.
Например, частая ошибка у меня такая:
в compose-file:
      deploy:
            placement:
                constraints:
                    - node.labels.type == back-logic

Но при простановке метки на ноде, я не указал type:
docker node update --label-add back-logic node_name
Хотя нужно не забывать проставлять имя:
docker node update --label-add type=back-logic node_name

Комментарии