Docker-in-Docker የመያዣ ምስሎችን ለመስራት በራሱ ኮንቴይነር ላይ የሚሰራ ምናባዊ ዶከር ዴሞን ነው። ዶከር-ኢን-ዶከርን የመፍጠር ዋና ዓላማ ዶከርን በራሱ ለማዳበር መርዳት ነበር። ብዙ ሰዎች Jenkins CI ን ለማሄድ ይጠቀሙበታል። ይህ በመጀመሪያ የተለመደ ይመስላል, ነገር ግን ከዚያ በኋላ ዶከርን በጄንኪንስ CI ኮንቴይነር ውስጥ በመትከል ሊወገዱ የሚችሉ ችግሮች ይነሳሉ. ይህ ጽሑፍ እንዴት ማድረግ እንደሚቻል ያብራራል. ያለ ዝርዝሮች የመጨረሻውን መፍትሄ ፍላጎት ካሎት, የችግር አፈታት ጽሑፉን የመጨረሻውን ክፍል ብቻ ያንብቡ.
Docker-in-Docker: ጥሩ
ከሁለት አመት በፊት ዶከር አስገባሁ
- የጠለፋ ጠለፋ;
- ስብሰባ (ግንባታ);
- Docker daemon መሮጥ አቁም;
- አዲስ ዶከር ዴሞን መጀመር;
- ሙከራ;
- ዑደት መድገም.
የሚያምር ፣ ሊባዛ የሚችል ስብሰባ (ማለትም በእቃ መያዣ ውስጥ) ለመስራት ከፈለጉ የበለጠ የተወሳሰበ ሆነ።
- የጠለፋ ጠለፋ;
- የሚሰራ የ Docker ስሪት እየሰራ መሆኑን ያረጋግጡ;
- በአሮጌው ዶከር አዲስ ዶከር ይገንቡ;
- ዶከር ዴሞን ያቁሙ;
- አዲስ ዶከር ዴሞን ይጀምሩ;
- ፈተና;
- አዲሱን ዶከር ዴሞን ያቁሙ;
- ድገም.
Docker-in-Docker በመጣ ጊዜ ሂደቱ ቀላል ሆኗል፡-
- የጠለፋ ጠለፋ;
- ስብሰባ + ማስጀመር በአንድ ደረጃ;
- ዑደት መድገም.
ያ በጣም የተሻለ አይደለም?
Docker-in-Docker: "መጥፎ"
ሆኖም፣ ከታዋቂ እምነት በተቃራኒ ዶከር-ኢን-ዶከር 100% ኮከቦች፣ ድኒዎች እና ዩኒኮርኖች አይደሉም። ማለቴ አንድ ገንቢ ሊያውቃቸው የሚገቡ ጥቂት ጉዳዮች አሉ።
አንድ ሰው እንደ አፕአርሞር እና ሴሊኑክስ ያሉ ኤል.ኤስ.ኤም.ኤስ (ሊኑክስ ሴኩሪቲ ሞጁሎችን) ይመለከታል፡ ኮንቴነር ሲሰራ “የውስጥ ዶከር” የሚጋጩ ወይም “ውጫዊ ዶከርን” የሚደብቁ የደህንነት መገለጫዎችን ሊጠቀም ይችላል። ዋናውን የ--privileged ሰንደቅ አላማን ለማጣመር ሲሞከር ይህ በጣም አስቸጋሪው ችግር ነው። የእኔ ለውጦች ሠርተዋል እና ሁሉም ፈተናዎች የእኔን ዴቢያን ማሽን አልፈው ኡቡንቱ ቪኤምዎችን ይፈትኑ ነበር ፣ ግን እነሱ በሚካኤል ክሮዝቢ ማሽን ላይ ይወድቃሉ እና ይቃጠላሉ (እኔ እስከማስታውሰው ድረስ Fedora ነበረው)። የችግሩን ትክክለኛ መንስኤ አላስታውስም ፣ ግን ምናልባት ማይክ ከ SELINUX = enforce (AppArmor) ጋር አብሮ የሚሰራ ጥበበኛ ሰው ስለሆነ እና የእኔ ለውጦች የ SELinux መገለጫዎችን አላከበሩም ።
Docker-in-Docker: "ክፉ"
ሁለተኛው ችግር ከ Docker ማከማቻ ነጂዎች ጋር የተያያዘ ነው. Docker-in-Docker ን ሲያሄዱ ውጫዊው ዶከር በመደበኛ የፋይል ስርዓት (EXT4፣ BTRFS፣ ወይም ያለዎት ማንኛውም ነገር) ላይ ይሰራል፣ የውስጣዊው ዶከር ደግሞ በቅጂ-ላይ-መፃፍ ስርዓት (AUFS፣ BTRFS) ላይ ይሰራል። , Device Mapper, ወዘተ.) , ውጫዊ Docker ለመጠቀም በተዘጋጀው ላይ በመመስረት). በዚህ ሁኔታ, የማይሰሩ ብዙ ጥምሮች አሉ. ለምሳሌ፣ AUFSን በAUFS ላይ ማሄድ አይችሉም።
BTRFSን በBTRFS ላይ እያሄዱ ከሆነ፣ ይሄ መጀመሪያ ላይ መስራት አለበት፣ ነገር ግን አንድ ጊዜ የተከማቸ ንዑስ ጥራዞች ካሉ፣ የወላጅ ንዑስ መጠን ሊሰረዝ አይችልም። የመሣሪያ ካርታ ሞጁል ስም-አልባ ነው፣ ስለዚህ ብዙ Docker ምሳሌዎች በተመሳሳይ ማሽን ላይ ከተጠቀሙ ሁሉም የሌላውን ምስሎች ማየት (እና ተጽዕኖ) እና የመጠባበቂያ መሳሪያዎችን መያዣ ማድረግ ይችላሉ። ይህ መጥፎ ነው።
ብዙዎቹን እነዚህን ችግሮች ለመፍታት መፍትሄዎች አሉ. ለምሳሌ፣ AUFSን በውስጣዊ Docker መጠቀም ከፈለጉ፣ የ/var/lib/docker ማህደርን ወደ ድምጽ ብቻ ያዙሩት እና ደህና ይሆናሉ። ብዙ ዶከር ጥሪዎች በተመሳሳይ ማሽን ላይ ከተደረጉ እርስ በእርሳቸው "አይረግጡም" እንዲሉ Docker አንዳንድ የመሠረት ቦታዎችን በመሣሪያ ካርታ ዒላማ ስሞች ላይ አክሏል።
ነገር ግን፣ ከእነዚህ እንደምታዩት ይህ ማዋቀር ቀላል አይደለም።
Docker-in-Docker: እየባሰ ይሄዳል
ስለ የግንባታ መሸጎጫስ? ይህ ደግሞ በጣም አስቸጋሪ ሊሆን ይችላል. ሰዎች ብዙ ጊዜ “Docker-in-Docker እያሄድኩ ከሆነ፣ በውስጤ ዶከር ውስጥ ያለውን ነገር ሁሉ እንደገና ከመሳብ ይልቅ በአስተናጋጄ ላይ የተስተናገዱትን ምስሎች እንዴት መጠቀም እችላለሁ?” ብለው ይጠይቁኛል።
አንዳንድ ሥራ ፈጣሪ ሰዎች /var/lib/dockerን ከአስተናጋጁ ወደ Docker-in-Docker መያዣ ለማገናኘት ሞክረዋል። አንዳንድ ጊዜ /var/lib/docker ከበርካታ ኮንቴይነሮች ጋር ይጋራሉ።
መረጃን ማበላሸት ይፈልጋሉ? ምክንያቱም ያ ነው ውሂብህን የሚያበላሽው!
ዶከር ዴሞን በግልፅ የተነደፈው ለ/var/lib/docker ልዩ መዳረሻ እንዲኖረው ነው። ሌላ ምንም ነገር በዚህ አቃፊ ውስጥ ያሉትን የዶከር ፋይሎችን "መንካት፣ መንካት ወይም ሊሰማ" አይገባም።
ለምን እንዲህ ሆነ? ምክንያቱም በ dotCloud እድገት ውስጥ ከተማሩት በጣም ከባድ ትምህርቶች አንዱ ውጤት ነው። የdotCloud ኮንቴይነር ሞተር ብዙ ሂደቶችን በአንድ ጊዜ /var/lib/dotcloud በመድረስ ሰርቷል። እንደ የአቶሚክ ፋይል ምትክ (በቦታው ከማርትዕ ይልቅ)፣ የፔፐር ኮድ ከአማካሪ እና አስገዳጅ መቆለፊያዎች እና ሌሎች እንደ SQLite እና BDB ያሉ ደህንነታቸው የተጠበቀ ስርዓቶች ያሉ ሙከራዎች ሁልጊዜም አይሰሩም። የኮንቴይነር ሞተራችንን ስናስተካክል፣ በመጨረሻ Docker የሆነው፣ ከዋናዎቹ የንድፍ ውሳኔዎች ውስጥ አንዱ ሁሉንም የመያዣ ስራዎችን በአንድ ዴሞን ስር መሰብሰብ ነበር ይህን ሁሉ ከንቱነት ጋር ለማስወገድ።
እንዳትሳሳቱ፡ ብዙ ሂደቶችን እና ዘመናዊ ትይዩ ቁጥጥርን ያካተተ ጥሩ፣ አስተማማኝ እና ፈጣን የሆነ ነገር መስራት ሙሉ በሙሉ ይቻላል። እኛ ግን እንደ ብቸኛ ተጫዋች በ Docker ኮድ መጻፍ እና ማቆየት ቀላል እና ቀላል ነው ብለን እናስባለን።
ይህ ማለት የ/var/lib/docker ዳይሬክተሩን በበርካታ ዶከር አጋጣሚዎች ላይ ካጋሩ ችግር ይገጥማችኋል ማለት ነው። በእርግጥ ይህ ሊሠራ ይችላል, በተለይም በመጀመሪያዎቹ የፈተና ደረጃዎች. “ስማ፣ ማ፣ ኡቡንቱን በዶከር ማሄድ እችላለሁ!” ነገር ግን አንድ አይነት ምስል ከሁለት የተለያዩ አጋጣሚዎች እንደመጎተት የበለጠ የተወሳሰበ ነገር ይሞክሩ እና አለም ሲቃጠል ያያሉ።
ይህ ማለት የእርስዎ CI ስርዓት እየገነባ እና እየገነባ ከሆነ፣ የ Docker-in-Docker ኮንቴይነርዎን እንደገና በሚያስጀምሩበት ጊዜ ሁሉ የኑክሌር ቦምብ ወደ መሸጎጫው ውስጥ የመጣል አደጋ ያጋጥመዋል። በፍፁም አሪፍ አይደለም!
መላ መፈለግ
አንድ እርምጃ ወደ ኋላ እንመለስ። በእርግጥ Docker-in-Docker ያስፈልገዎታል ወይንስ የ CI ሲስተም እራሱ በኮንቴይነር ውስጥ እያለ ኮንቴይነሮችን እና ምስሎችን ከ CI ስርዓትዎ መገንባት እና ማስኬድ መቻል ይፈልጋሉ?
ብዙ ሰዎች የመጨረሻውን አማራጭ ይፈልጋሉ ማለትም እንደ ጄንኪንስ ያለ የ CI ስርዓት ኮንቴይነሮችን ማስኬድ እንዲችሉ ይፈልጋሉ። እና ይህን ለማድረግ ቀላሉ መንገድ የዶከር ሶኬትን በቀላሉ ከ -v ባንዲራ ጋር በማያያዝ ወደ CI ኮንቴይነርዎ ማስገባት ነው።
በቀላል አነጋገር፣ የእርስዎን የሲአይ ኮንቴይነር (ጄንኪንስ ወይም ሌላ) ሲጀምሩ ከዶከር-ኢን-ዶከር ጋር ከመጥለፍ ይልቅ በመስመሩ ይጀምሩት፡-
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
ይህ ኮንቴይነር አሁን የዶከር ሶኬት መዳረሻ ይኖረዋል እና ስለዚህ ኮንቴይነሮችን ማስኬድ ይችላል። "የልጅ" ኮንቴይነሮችን ከማስነሳት በቀር "ወንድም እህት" ኮንቴይነሮችን ያስነሳል።
ኦፊሴላዊውን የዶክተር ምስል በመጠቀም ይህንን ይሞክሩ (የዶክተር ሁለትዮሽ ይይዛል)
docker run -v /var/run/docker.sock:/var/run/docker.sock
-ti docker
ልክ እንደ Docker-in-Docker ነው የሚሰራው፣ ነገር ግን ዶከር ኢን-ዶከር አይደለም፡ ይህ ኮንቴይነር ተጨማሪ ኮንቴይነሮችን ሲፈጥር በከፍተኛ ደረጃ Docker ውስጥ ይፈጠራሉ። የጎጆ መክተት የጎንዮሽ ጉዳቶች አያጋጥምዎትም፣ እና የመገጣጠሚያው መሸጎጫ በበርካታ ጥሪዎች ላይ ይጋራል።
ማሳሰቢያ፡ የዚህ መጣጥፍ የቀደሙት ስሪቶች ዶከርን ሁለትዮሽ ከአስተናጋጁ ወደ መያዣው ማገናኘት ይመክራሉ። የዶከር ሞተር ከአሁን በኋላ ወደ ቋሚ ወይም የማይንቀሳቀሱ ቤተ-መጻሕፍት ስለማይዘረጋ ይህ አሁን አስተማማኝ አይደለም።
ስለዚህ ዶከርን ከጄንኪንስ CI ለመጠቀም ከፈለጉ 2 አማራጮች አሉዎት፡-
Docker CLI ን መጫን መሰረታዊ የምስል ማሸጊያ ስርዓትን በመጠቀም (ማለትም ምስልዎ በዴቢያን ላይ የተመሰረተ ከሆነ የ .deb ጥቅሎችን ይጠቀሙ) Docker API ን በመጠቀም።
አንዳንድ ማስታወቂያዎች 🙂
ከእኛ ጋር ስለቆዩ እናመሰግናለን። ጽሑፎቻችንን ይወዳሉ? የበለጠ አስደሳች ይዘት ማየት ይፈልጋሉ? ትእዛዝ በማዘዝ ወይም ለጓደኞች በመምከር ይደግፉን፣
በአምስተርዳም ውስጥ በ Equinix Tier IV የመረጃ ማዕከል ውስጥ Dell R730xd 2x ርካሽ? እዚህ ብቻ
ምንጭ: hab.com