CI அல்லது சோதனை சூழலுக்கு Docker-in-Docker ஐப் பயன்படுத்துவதற்கு முன் கவனமாக சிந்தியுங்கள்

CI அல்லது சோதனை சூழலுக்கு Docker-in-Docker ஐப் பயன்படுத்துவதற்கு முன் கவனமாக சிந்தியுங்கள்

Docker-in-Docker என்பது ஒரு மெய்நிகராக்கப்பட்ட டோக்கர் டீமான் சூழல், கொள்கலன் படங்களை உருவாக்குவதற்கு கொள்கலனிலேயே இயங்குகிறது. Docker-in-Docker ஐ உருவாக்குவதன் முக்கிய நோக்கம் Docker ஐ உருவாக்க உதவுவதாகும். ஜென்கின்ஸ் சிஐயை இயக்க பலர் இதைப் பயன்படுத்துகின்றனர். இது முதலில் சாதாரணமாகத் தெரிகிறது, ஆனால் ஜென்கின்ஸ் சிஐ கொள்கலனில் டோக்கரை நிறுவுவதன் மூலம் சிக்கல்களைத் தவிர்க்கலாம். இதை எப்படி செய்வது என்று இந்த கட்டுரை உங்களுக்கு சொல்கிறது. விவரங்கள் இல்லாமல் இறுதி தீர்வில் நீங்கள் ஆர்வமாக இருந்தால், கட்டுரையின் கடைசி பகுதியைப் படிக்கவும், "சிக்கலைத் தீர்ப்பது."

CI அல்லது சோதனை சூழலுக்கு Docker-in-Docker ஐப் பயன்படுத்துவதற்கு முன் கவனமாக சிந்தியுங்கள்

டோக்கர்-இன்-டோக்கர்: "நல்லது"

இரண்டு ஆண்டுகளுக்கு முன்பு நான் டோக்கரில் வைத்தேன் கொடி – சலுகை பெற்று எழுதினார் டிண்டின் முதல் பதிப்பு. டோக்கரை விரைவாக உருவாக்க முக்கிய குழுவிற்கு உதவுவதே இலக்காக இருந்தது. Docker-in-Docker க்கு முன், வழக்கமான வளர்ச்சி சுழற்சி இப்படி இருந்தது:

  • ஹேக்கிட்டி ஹேக்;
  • கட்ட;
  • இயங்கும் டோக்கர் டீமனை நிறுத்துதல்;
  • புதிய டோக்கர் டீமனை அறிமுகப்படுத்துதல்;
  • சோதனை;
  • சுழற்சியை மீண்டும் செய்யவும்.

நீங்கள் ஒரு அழகான, இனப்பெருக்கம் செய்யக்கூடிய சட்டசபையை (அதாவது ஒரு கொள்கலனில்) உருவாக்க விரும்பினால், அது மிகவும் சிக்கலானதாக மாறியது:

  • ஹேக்கிட்டி ஹேக்;
  • டோக்கரின் வேலை செய்யும் பதிப்பு இயங்குகிறது என்பதை உறுதிப்படுத்தவும்;
  • பழைய டோக்கருடன் புதிய டோக்கரை உருவாக்கவும்;
  • டோக்கர் டீமனை நிறுத்து;
  • புதிய டோக்கர் டீமானைத் தொடங்கவும்;
  • சோதனை;
  • புதிய டோக்கர் டீமனை நிறுத்து;
  • மீண்டும்.

Docker-in-Docker இன் வருகையுடன், செயல்முறை எளிமையாகிவிட்டது:

  • ஹேக்கிட்டி ஹேக்;
  • சட்டசபை + ஒரு கட்டத்தில் துவக்கம்;
  • சுழற்சியை மீண்டும் செய்யவும்.

இந்த வழி மிகவும் சிறந்தது அல்லவா?

CI அல்லது சோதனை சூழலுக்கு Docker-in-Docker ஐப் பயன்படுத்துவதற்கு முன் கவனமாக சிந்தியுங்கள்

டோக்கர்-இன்-டோக்கர்: "மோசம்"

இருப்பினும், பிரபலமான நம்பிக்கைக்கு மாறாக, டோக்கர்-இன்-டோக்கர் 100% நட்சத்திரங்கள், குதிரைவண்டி மற்றும் யூனிகார்ன்கள் அல்ல. நான் என்ன சொல்கிறேன் என்றால், ஒரு டெவலப்பர் அறிந்திருக்க வேண்டிய பல சிக்கல்கள் உள்ளன.

அவற்றில் ஒன்று AppArmor மற்றும் SELinux போன்ற LSM (லினக்ஸ் பாதுகாப்பு தொகுதிகள்) பற்றியது: ஒரு கொள்கலனை இயக்கும் போது, ​​"உள் டோக்கர்" பாதுகாப்பு சுயவிவரங்களைப் பயன்படுத்த முயற்சி செய்யலாம், அது "வெளிப்புற டோக்கரை" முரண்படும் அல்லது குழப்பும். சலுகை பெற்ற கொடியின் அசல் செயலாக்கத்தை ஒன்றிணைக்க முயற்சிக்கும்போது இது மிகவும் கடினமான சிக்கலாகும். எனது மாற்றங்கள் வேலை செய்தன மற்றும் அனைத்து சோதனைகளும் எனது டெபியன் இயந்திரம் மற்றும் உபுண்டு சோதனை VM களில் கடந்து செல்லும், ஆனால் அவை மைக்கேல் கிராஸ்பியின் இயந்திரத்தில் செயலிழந்து எரியும் (நான் நினைவுகூருவது போல் அவருக்கு ஃபெடோரா இருந்தது). பிரச்சனைக்கான சரியான காரணத்தை என்னால் நினைவில் கொள்ள முடியவில்லை, ஆனால் மைக் SELINUX=enforce (நான் AppArmor ஐப் பயன்படுத்தினேன்) உடன் பணிபுரியும் ஒரு புத்திசாலியான பையன் என்பதாலும், எனது மாற்றங்கள் SELinux சுயவிவரங்களை கணக்கில் எடுத்துக் கொள்ளாததாலும் இருக்கலாம்.

டோக்கர்-இன்-டோக்கர்: "தீமை"

இரண்டாவது சிக்கல் டோக்கர் சேமிப்பக இயக்கிகளில் உள்ளது. நீங்கள் Docker-in-Dockerஐ இயக்கும் போது, ​​வெளிப்புற Docker ஆனது வழக்கமான கோப்பு முறைமையில் (EXT4, BTRFS அல்லது உங்களிடம் உள்ளவை) இயங்குகிறது மற்றும் உள் டோக்கர் ஒரு நகல்-ஆன்-ரைட் சிஸ்டத்தின் (AUFS, BTRFS, சாதன மேப்பர்) மேல் இயங்குகிறது. , முதலியன). இது வேலை செய்யாத பல சேர்க்கைகளை உருவாக்குகிறது. எடுத்துக்காட்டாக, நீங்கள் AUFS க்கு மேல் AUFS ஐ இயக்க முடியாது.

நீங்கள் BTRFS க்கு மேல் BTRFS ஐ இயக்கினால், அது முதலில் வேலை செய்ய வேண்டும், ஆனால் உள்ளமைக்கப்பட்ட துணைத்தொகுதிகள் இருந்தால், பெற்றோர் துணைத்தொகுதியை நீக்குவது தோல்வியடையும். சாதன மேப்பர் தொகுதிக்கு பெயர்வெளி இல்லை, எனவே பல டோக்கர் நிகழ்வுகள் அதை ஒரே கணினியில் இயக்கினால், அவை அனைத்தும் ஒன்றுக்கொன்று மற்றும் கொள்கலன் காப்பு சாதனங்களில் உள்ள படங்களைப் பார்க்க முடியும் (மற்றும் தாக்கத்தை ஏற்படுத்துகிறது). இது மோசம்.

இந்தப் பிரச்சனைகளில் பலவற்றைத் தீர்க்கும் வழிகள் உள்ளன. எடுத்துக்காட்டாக, நீங்கள் உள் டோக்கரில் AUFS ஐப் பயன்படுத்த விரும்பினால், /var/lib/docker கோப்புறையை ஒரு தொகுதியாக மாற்றவும், நீங்கள் நன்றாக இருப்பீர்கள். டோக்கர் சில அடிப்படை பெயர்வெளிகளை டிவைஸ் மேப்பர் இலக்கு பெயர்களில் சேர்த்துள்ளார், இதனால் பல டோக்கர் அழைப்புகள் ஒரே கணினியில் இயங்கினால், அவை ஒன்றையொன்று காலடி எடுத்து வைக்காது.

இருப்பினும், அத்தகைய அமைப்பு எளிமையானது அல்ல, இவற்றிலிருந்து பார்க்க முடியும் கட்டுரைகள் கிட்ஹப்பில் உள்ள டிண்ட் களஞ்சியத்தில்.

Docker-in-Docker: இது மோசமாகிறது

உருவாக்க கேச் பற்றி என்ன? இதுவும் மிகவும் கடினமாக இருக்கலாம். "நான் Docker-in-Dockerஐ இயக்கினால், எல்லாவற்றையும் எனது உள் டோக்கருக்குள் இழுப்பதற்குப் பதிலாக எனது ஹோஸ்டில் ஹோஸ்ட் செய்யப்பட்ட படங்களை எப்படிப் பயன்படுத்துவது" என்று அடிக்கடி என்னிடம் மக்கள் கேட்பார்கள்?

சில ஆர்வமுள்ள நபர்கள் ஹோஸ்டில் இருந்து /var/lib/docker ஐ Docker-in-Docker கொள்கலனுடன் பிணைக்க முயற்சித்துள்ளனர். சில நேரங்களில் அவர்கள் பல கொள்கலன்களுடன் /var/lib/docker ஐப் பகிர்ந்து கொள்கிறார்கள்.

CI அல்லது சோதனை சூழலுக்கு Docker-in-Docker ஐப் பயன்படுத்துவதற்கு முன் கவனமாக சிந்தியுங்கள்
உங்கள் தரவை சிதைக்க விரும்புகிறீர்களா? ஏனெனில் இதுவே உங்கள் தரவை சேதப்படுத்தும்!

டோக்கர் டெமான் தெளிவாக /var/lib/docker க்கான பிரத்தியேக அணுகலைப் பெற வடிவமைக்கப்பட்டுள்ளது. இந்தக் கோப்புறையில் உள்ள டோக்கர் கோப்புகளை வேறு எதுவும் "தொடவோ, குத்தவோ அல்லது தூண்டவோ" கூடாது.

ஏன் இப்படி? ஏனெனில் இது dotCloud ஐ உருவாக்கும் போது கற்றுக்கொண்ட கடினமான பாடங்களில் ஒன்றின் விளைவாகும். ஒரே நேரத்தில் /var/lib/dotcloud ஐ அணுகும் பல செயல்முறைகளைக் கொண்டு dotCloud கொள்கலன் இயந்திரம் இயங்கியது. அணுக் கோப்பு மாற்றுதல் (இன்-இன்-பிளேஸ் எடிட்டிங்கிற்குப் பதிலாக), ஆலோசனை மற்றும் கட்டாய பூட்டுகளுடன் கூடிய பெப்பர்ரிங் குறியீடு மற்றும் SQLite மற்றும் BDB போன்ற பாதுகாப்பான அமைப்புகளுடன் கூடிய பிற சோதனைகள் போன்ற தந்திரமான தந்திரங்கள் எப்போதும் வேலை செய்யவில்லை. நாங்கள் எங்கள் கொள்கலன் இயந்திரத்தை மறுவடிவமைப்பு செய்தபோது, ​​அது இறுதியில் டோக்கராக மாறியது, பெரிய வடிவமைப்பு முடிவுகளில் ஒன்று, ஒரே டீமானின் கீழ் அனைத்து கன்டெய்னர் செயல்பாடுகளையும் ஒருங்கிணைத்து, அனைத்து ஒத்திசைவு முட்டாள்தனங்களையும் அகற்றுவதாகும்.

என்னை தவறாக எண்ண வேண்டாம்: பல செயல்முறைகள் மற்றும் நவீன இணையான கட்டுப்பாட்டை உள்ளடக்கிய நல்ல, நம்பகமான மற்றும் வேகமான ஒன்றை உருவாக்குவது முற்றிலும் சாத்தியமாகும். ஆனால் டோக்கரை ஒரே பிளேயராகப் பயன்படுத்தி குறியீட்டை எழுதுவதும் பராமரிப்பதும் எளிமையானது மற்றும் எளிதானது என்று நாங்கள் நினைக்கிறோம்.

பல டோக்கர் நிகழ்வுகளுக்கு இடையில் /var/lib/docker கோப்பகத்தைப் பகிர்ந்தால், உங்களுக்கு சிக்கல்கள் ஏற்படும். நிச்சயமாக, இது வேலை செய்யலாம், குறிப்பாக சோதனையின் ஆரம்ப கட்டங்களில். "கேளுங்கள், மா, நான் உபுண்டுவை டாக்கராக இயக்க முடியும்!" ஆனால் இரண்டு வெவ்வேறு நிகழ்வுகளில் இருந்து ஒரே படத்தை இழுப்பது போன்ற சிக்கலான ஒன்றை முயற்சிக்கவும், உலகம் எரிவதை நீங்கள் காண்பீர்கள்.

இதன் பொருள் என்னவென்றால், உங்கள் CI சிஸ்டம் பில்ட்கள் மற்றும் மறுகட்டமைப்பைச் செய்தால், ஒவ்வொரு முறையும் உங்கள் டோக்கர்-இன்-டோக்கர் கொள்கலனை மறுதொடக்கம் செய்தால், அதன் தற்காலிக சேமிப்பில் ஒரு அணுவைக் கைவிடும் அபாயம் உள்ளது. இது குளிர்ச்சியாக இல்லை!

சிக்கல் தீர்க்கும்

ஒரு படி பின்வாங்குவோம். உங்களுக்கு உண்மையில் Docker-in-Docker தேவையா அல்லது அந்த CI அமைப்பு ஒரு கொள்கலனில் இருக்கும் போது டோக்கரை இயக்கி, உங்கள் 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-in-Docker அல்ல: இந்தக் கொள்கலன் கூடுதல் கொள்கலன்களை உருவாக்கும் போது, ​​அவை உயர்மட்ட டோக்கரில் உருவாக்கப்படும். கூடு கட்டுவதால் ஏற்படும் பக்கவிளைவுகளை நீங்கள் அனுபவிக்க மாட்டீர்கள் மேலும் அசெம்பிளி கேச் பல அழைப்புகளில் பகிரப்படும்.

குறிப்பு: இந்தக் கட்டுரையின் முந்தைய பதிப்புகள் டோக்கர் பைனரியை ஹோஸ்டிலிருந்து கொள்கலனுடன் இணைக்க அறிவுறுத்தியது. டோக்கர் இன்ஜின் நிலையான அல்லது அருகிலுள்ள நிலையான நூலகங்களை உள்ளடக்காது என்பதால் இது இப்போது நம்பமுடியாததாகிவிட்டது.

எனவே, நீங்கள் ஜென்கின்ஸ் CI இலிருந்து டோக்கரைப் பயன்படுத்த விரும்பினால், உங்களுக்கு 2 விருப்பங்கள் உள்ளன:
அடிப்படை பட பேக்கேஜிங் அமைப்பைப் பயன்படுத்தி Docker CLI ஐ நிறுவுதல் (அதாவது உங்கள் படம் டெபியனை அடிப்படையாகக் கொண்டால், .deb தொகுப்புகளைப் பயன்படுத்தவும்), Docker API ஐப் பயன்படுத்தி.

சில விளம்பரங்கள் 🙂

எங்களுடன் தங்கியதற்கு நன்றி. எங்கள் கட்டுரைகளை விரும்புகிறீர்களா? மேலும் சுவாரஸ்யமான உள்ளடக்கத்தைப் பார்க்க வேண்டுமா? ஒரு ஆர்டரை வைப்பதன் மூலம் அல்லது நண்பர்களுக்கு பரிந்துரை செய்வதன் மூலம் எங்களை ஆதரிக்கவும், $4.99 இலிருந்து டெவலப்பர்களுக்கான கிளவுட் VPS, நுழைவு-நிலை சேவையகங்களின் தனித்துவமான அனலாக், இது உங்களுக்காக எங்களால் கண்டுபிடிக்கப்பட்டது: VPS (KVM) E5-2697 v3 (6 கோர்கள்) 10GB DDR4 480GB SSD 1Gbps பற்றிய முழு உண்மை $19 அல்லது எப்படி ஒரு சர்வரைப் பகிர்வது? (RAID1 மற்றும் RAID10 உடன் கிடைக்கும், 24 கோர்கள் வரை மற்றும் 40GB DDR4 வரை).

ஆம்ஸ்டர்டாமில் உள்ள Equinix Tier IV தரவு மையத்தில் Dell R730xd 2 மடங்கு மலிவானதா? இங்கே மட்டும் 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 முதல்! பற்றி படிக்கவும் உள்கட்டமைப்பு நிறுவனத்தை எவ்வாறு உருவாக்குவது. ஒரு பைசாவிற்கு 730 யூரோக்கள் மதிப்புள்ள Dell R5xd E2650-4 v9000 சேவையகங்களைப் பயன்படுத்தும் வகுப்பு?

ஆதாரம்: www.habr.com

கருத்தைச் சேர்