ለ CI ወይም ለሙከራ አካባቢ Docker-in-Docker ከመጠቀምዎ በፊት በጥንቃቄ ያስቡበት

ለ CI ወይም ለሙከራ አካባቢ Docker-in-Docker ከመጠቀምዎ በፊት በጥንቃቄ ያስቡበት

Docker-in-Docker የመያዣ ምስሎችን ለመስራት በራሱ ኮንቴይነር ላይ የሚሰራ ምናባዊ ዶከር ዴሞን ነው። ዶከር-ኢን-ዶከርን የመፍጠር ዋና ዓላማ ዶከርን በራሱ ለማዳበር መርዳት ነበር። ብዙ ሰዎች Jenkins CI ን ለማሄድ ይጠቀሙበታል። ይህ በመጀመሪያ የተለመደ ይመስላል, ነገር ግን ከዚያ በኋላ ዶከርን በጄንኪንስ CI ኮንቴይነር ውስጥ በመትከል ሊወገዱ የሚችሉ ችግሮች ይነሳሉ. ይህ ጽሑፍ እንዴት ማድረግ እንደሚቻል ያብራራል. ያለ ዝርዝሮች የመጨረሻውን መፍትሄ ፍላጎት ካሎት, የችግር አፈታት ጽሑፉን የመጨረሻውን ክፍል ብቻ ያንብቡ.

ለ CI ወይም ለሙከራ አካባቢ Docker-in-Docker ከመጠቀምዎ በፊት በጥንቃቄ ያስቡበት

Docker-in-Docker: ጥሩ

ከሁለት አመት በፊት ዶከር አስገባሁ ባንዲራ - ልዩ መብት ያለው እና የፃፈው የዲን የመጀመሪያ ስሪት. ግቡ ዋናው ቡድን ዶከርን በፍጥነት እንዲያዳብር መርዳት ነበር። ከDocker-in-Docker በፊት፣ የተለመደው የእድገት ዑደት የሚከተለው ነበር፡-

  • የጠለፋ ጠለፋ;
  • ስብሰባ (ግንባታ);
  • Docker daemon መሮጥ አቁም;
  • አዲስ ዶከር ዴሞን መጀመር;
  • ሙከራ;
  • ዑደት መድገም.

የሚያምር ፣ ሊባዛ የሚችል ስብሰባ (ማለትም በእቃ መያዣ ውስጥ) ለመስራት ከፈለጉ የበለጠ የተወሳሰበ ሆነ።

  • የጠለፋ ጠለፋ;
  • የሚሰራ የ Docker ስሪት እየሰራ መሆኑን ያረጋግጡ;
  • በአሮጌው ዶከር አዲስ ዶከር ይገንቡ;
  • ዶከር ዴሞን ያቁሙ;
  • አዲስ ዶከር ዴሞን ይጀምሩ;
  • ፈተና;
  • አዲሱን ዶከር ዴሞን ያቁሙ;
  • ድገም.

Docker-in-Docker በመጣ ጊዜ ሂደቱ ቀላል ሆኗል፡-

  • የጠለፋ ጠለፋ;
  • ስብሰባ + ማስጀመር በአንድ ደረጃ;
  • ዑደት መድገም.

ያ በጣም የተሻለ አይደለም?

ለ CI ወይም ለሙከራ አካባቢ 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 አንዳንድ የመሠረት ቦታዎችን በመሣሪያ ካርታ ዒላማ ስሞች ላይ አክሏል።

ነገር ግን፣ ከእነዚህ እንደምታዩት ይህ ማዋቀር ቀላል አይደለም። ጽሑፎች በ GitHub ላይ ባለው የዲን ማከማቻ ውስጥ።

Docker-in-Docker: እየባሰ ይሄዳል

ስለ የግንባታ መሸጎጫስ? ይህ ደግሞ በጣም አስቸጋሪ ሊሆን ይችላል. ሰዎች ብዙ ጊዜ “Docker-in-Docker እያሄድኩ ከሆነ፣ በውስጤ ዶከር ውስጥ ያለውን ነገር ሁሉ እንደገና ከመሳብ ይልቅ በአስተናጋጄ ላይ የተስተናገዱትን ምስሎች እንዴት መጠቀም እችላለሁ?” ብለው ይጠይቁኛል።

አንዳንድ ሥራ ፈጣሪ ሰዎች /var/lib/dockerን ከአስተናጋጁ ወደ Docker-in-Docker መያዣ ለማገናኘት ሞክረዋል። አንዳንድ ጊዜ /var/lib/docker ከበርካታ ኮንቴይነሮች ጋር ይጋራሉ።

ለ CI ወይም ለሙከራ አካባቢ Docker-in-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 ን በመጠቀም።

አንዳንድ ማስታወቂያዎች 🙂

ከእኛ ጋር ስለቆዩ እናመሰግናለን። ጽሑፎቻችንን ይወዳሉ? የበለጠ አስደሳች ይዘት ማየት ይፈልጋሉ? ትእዛዝ በማዘዝ ወይም ለጓደኞች በመምከር ይደግፉን፣ ደመና ቪፒኤስ ለገንቢዎች ከ$4.99, በእኛ ለእርስዎ የተፈለሰፈው ልዩ የመግቢያ ደረጃ አገልጋዮች አናሎግ፡- ስለ VPS (KVM) ሙሉ እውነት E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps ከ$19 ወይንስ እንዴት አገልጋይ መጋራት ይቻላል? (በRAID1 እና RAID10፣ እስከ 24 ኮሮች እና እስከ 40GB DDR4 ድረስ ይገኛል።

በአምስተርዳም ውስጥ በ Equinix Tier IV የመረጃ ማዕከል ውስጥ Dell R730xd 2x ርካሽ? እዚህ ብቻ 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV ከ$199 በኔዘርላንድስ! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - ከ$99! ስለ አንብብ የመሠረተ ልማት ኮርፖሬሽን እንዴት እንደሚገነባ ክፍል ጋር Dell R730xd E5-2650 v4 አገልጋዮች ዋጋ 9000 አንድ ሳንቲም ዩሮ?

ምንጭ: hab.com

አስተያየት ያክሉ