Днес се опитвах да генерирам Docker образ от Node.js проект и исках да го разположа на моя локален тестов swarm.
За съжаление, ако човек създаде локален Docker образ, той се съхранява и е достъпен само на възела, на който е създаден, а останалите възли в swarm не могат да го достъпят.
Решението е образът да се качи (push) в Docker регистър, от който всички възли в swarm могат да го изтеглят (pull).
Създаване на регистъра
За да стартирате регистър услуга в swarm, изпълнете:
docker service create —name registry —publish 5000:5000 registry:latest
Това ще създаде услугата registry и ще я стартира в swarm, като я направи достъпна за всички възли в swarm.
Качване на образ в регистъра
За да качите образ в регистъра, трябва да направите две неща – да го тагнете и след това да го push-нете.
Ето пример как да build-нете и тагнете образа наведнъж:
docker build . -t localhost.localdomain:5000/
И как да го качите в регистъра:
docker push localhost.localdomain:5000/
За да използвате образа в услуга или контейнер, посочвате пълния път от по-горе, т.е. localhost.localdomain:5000/<image-name>:latest.
Възлите в swarm ще имат достъп до образа и ще могат да го изтеглят и стартират.
Важна забележка относно адреса на регистъра
В повечето уроци онлайн адресът на регистъра е даден като localhost:5000. За съжаление това не работи и обикновено изтича времето за изчакване, когато се опитате да го ползвате. Ако го смените с localhost.localdomain, ще заработи!
Не знам защо се случва това, при положение че и localhost, и localhost.localdomain се разрешават до 127.0.0.1.