డాకర్-ఇన్-డాకర్ అనేది కంటైనర్ ఇమేజ్లను రూపొందించడానికి కంటైనర్లోనే నడుస్తున్న వర్చువలైజ్డ్ డాకర్ డెమోన్ ఎన్విరాన్మెంట్. డాకర్-ఇన్-డాకర్ని సృష్టించడం యొక్క ముఖ్య ఉద్దేశ్యం డాకర్ను అభివృద్ధి చేయడంలో సహాయపడటం. జెంకిన్స్ CIని అమలు చేయడానికి చాలా మంది దీనిని ఉపయోగిస్తారు. ఇది మొదట సాధారణమైనదిగా అనిపిస్తుంది, కానీ జెంకిన్స్ CI కంటైనర్లో డాకర్ని ఇన్స్టాల్ చేయడం ద్వారా సమస్యలను నివారించవచ్చు. దీన్ని ఎలా చేయాలో ఈ వ్యాసం మీకు తెలియజేస్తుంది. వివరాలు లేకుండా తుది పరిష్కారంపై మీకు ఆసక్తి ఉంటే, వ్యాసంలోని చివరి విభాగమైన “సమస్యను పరిష్కరించడం” చదవండి.
డాకర్-ఇన్-డాకర్: "గుడ్"
రెండు సంవత్సరాల క్రితం నేను డాకర్లోకి ప్రవేశించాను
- హ్యాకిటీ హ్యాక్;
- నిర్మించు;
- నడుస్తున్న డాకర్ డెమోన్ను ఆపడం;
- కొత్త డాకర్ డెమోన్ను ప్రారంభించడం;
- పరీక్ష;
- చక్రం పునరావృతం చేయండి.
మీరు అందమైన, పునరుత్పాదక అసెంబ్లీని (అంటే, కంటైనర్లో) చేయాలనుకుంటే, అది మరింత క్లిష్టంగా మారింది:
- హ్యాకిటీ హ్యాక్;
- డాకర్ యొక్క వర్కింగ్ వెర్షన్ రన్ అవుతుందని నిర్ధారించుకోండి;
- పాత డాకర్తో కొత్త డాకర్ని నిర్మించండి;
- డాకర్ డెమోన్ను ఆపండి;
- కొత్త డాకర్ డెమోన్ను ప్రారంభించండి;
- పరీక్ష;
- కొత్త డాకర్ డెమోన్ను ఆపండి;
- పునరావృతం.
డాకర్-ఇన్-డాకర్ రాకతో, ప్రక్రియ సులభమైంది:
- హ్యాకిటీ హ్యాక్;
- అసెంబ్లీ + ఒక దశలో ప్రయోగ;
- చక్రం పునరావృతం చేయండి.
ఈ మార్గం చాలా మంచిది కాదా?
డాకర్-ఇన్-డాకర్: "చెడు"
అయినప్పటికీ, ప్రజాదరణ పొందిన నమ్మకానికి విరుద్ధంగా, డాకర్-ఇన్-డాకర్ 100% నక్షత్రాలు, పోనీలు మరియు యునికార్న్స్ కాదు. నా ఉద్దేశ్యం ఏమిటంటే, డెవలపర్ తెలుసుకోవలసిన అనేక సమస్యలు ఉన్నాయి.
వాటిలో ఒకటి AppArmor మరియు SELinux వంటి LSM లకు (Linux భద్రతా మాడ్యూల్స్) సంబంధించినది: కంటైనర్ను నడుపుతున్నప్పుడు, "అంతర్గత డాకర్" "బాహ్య డాకర్"తో విభేదించే లేదా గందరగోళానికి గురిచేసే భద్రతా ప్రొఫైల్లను వర్తింపజేయడానికి ప్రయత్నించవచ్చు. ప్రివిలేజ్డ్ ఫ్లాగ్ యొక్క అసలైన అమలును విలీనం చేయడానికి ప్రయత్నిస్తున్నప్పుడు పరిష్కరించడానికి ఇది చాలా కష్టమైన సమస్య. నా మార్పులు పని చేశాయి మరియు అన్ని పరీక్షలు నా డెబియన్ మెషీన్ మరియు ఉబుంటు టెస్ట్ VMలలో పాస్ అవుతాయి, కానీ అవి మైఖేల్ క్రాస్బీ యొక్క మెషీన్లో క్రాష్ మరియు బర్న్ అవుతాయి (నేను గుర్తుచేసుకున్నట్లుగా అతనికి ఫెడోరా ఉంది). సమస్య యొక్క ఖచ్చితమైన కారణం నాకు గుర్తులేదు, కానీ మైక్ SELINUX=enforce (నేను AppArmorని ఉపయోగించాను)తో పనిచేసే తెలివైన వ్యక్తి మరియు నా మార్పులు SELinux ప్రొఫైల్లను పరిగణనలోకి తీసుకోనందున ఇది జరిగి ఉండవచ్చు.
డాకర్-ఇన్-డాకర్: "ఈవిల్"
రెండవ సమస్య డాకర్ స్టోరేజ్ డ్రైవర్లతో ఉంది. మీరు డాకర్-ఇన్-డాకర్ని అమలు చేసినప్పుడు, బాహ్య డాకర్ సాధారణ ఫైల్ సిస్టమ్ (EXT4, BTRFS, లేదా మీరు కలిగి ఉన్న ఏదైనా) పైన నడుస్తుంది మరియు అంతర్గత డాకర్ కాపీ-ఆన్-రైట్ సిస్టమ్ (AUFS, BTRFS, డివైస్ మ్యాపర్) పైన నడుస్తుంది. , మొదలైనవి). , బాహ్య డాకర్ని ఉపయోగించడానికి కాన్ఫిగర్ చేయబడిన దానిపై ఆధారపడి). ఇది పని చేయని అనేక కలయికలను సృష్టిస్తుంది. ఉదాహరణకు, మీరు AUFS పైన AUFSని అమలు చేయలేరు.
మీరు BTRFS పైన BTRFSని అమలు చేస్తే, అది మొదట పని చేయాలి, కానీ ఒకసారి సమూహ సబ్వాల్యూమ్లు ఉంటే, పేరెంట్ సబ్వాల్యూమ్ను తొలగించడం విఫలమవుతుంది. డివైస్ మ్యాపర్ మాడ్యూల్కు నేమ్స్పేస్ లేదు, కాబట్టి బహుళ డాకర్ ఇన్స్టాన్స్లు ఒకే మెషీన్లో దీన్ని రన్ చేస్తున్నట్లయితే, అవన్నీ ఒకదానికొకటి మరియు కంటైనర్ బ్యాకప్ పరికరాలపై చిత్రాలను చూడగలవు (మరియు ప్రభావితం) చేయగలవు. ఇది చెడ్డది.
ఈ సమస్యలను పరిష్కరించడానికి అనేక పరిష్కారాలు ఉన్నాయి. ఉదాహరణకు, మీరు అంతర్గత డాకర్లో AUFSని ఉపయోగించాలనుకుంటే, /var/lib/docker ఫోల్డర్ను వాల్యూమ్గా మార్చండి మరియు మీరు బాగానే ఉంటారు. డివైస్ మ్యాపర్ లక్ష్య పేర్లకు డాకర్ కొన్ని బేస్ నేమ్స్పేస్లను జోడించారు, తద్వారా ఒకే మెషీన్లో బహుళ డాకర్ కాల్లు రన్ అవుతున్నట్లయితే, అవి ఒకదానిపై ఒకటి అడుగు పెట్టవు.
అయినప్పటికీ, అటువంటి సెటప్ చాలా సులభం కాదు, వీటిని చూడవచ్చు
డాకర్-ఇన్-డాకర్: ఇది మరింత తీవ్రమవుతుంది
బిల్డ్ కాష్ గురించి ఏమిటి? ఇది కూడా చాలా కష్టంగా ఉంటుంది. "నేను డాకర్-ఇన్-డాకర్ని నడుపుతుంటే, నా అంతర్గత డాకర్లోకి అన్నింటినీ తిరిగి లాగడానికి బదులుగా నా హోస్ట్లో హోస్ట్ చేసిన చిత్రాలను నేను ఎలా ఉపయోగించగలను" అని నన్ను తరచుగా అడుగుతారు?
కొంతమంది ఔత్సాహిక వ్యక్తులు హోస్ట్ నుండి డాకర్-ఇన్-డాకర్ కంటైనర్కు /var/lib/dockerని బైండ్ చేయడానికి ప్రయత్నించారు. కొన్నిసార్లు వారు బహుళ కంటైనర్లతో /var/lib/dockerని పంచుకుంటారు.
మీరు మీ డేటాను పాడు చేయాలనుకుంటున్నారా? ఎందుకంటే ఇది ఖచ్చితంగా మీ డేటాను పాడు చేస్తుంది!
డాకర్ డెమోన్ స్పష్టంగా /var/lib/dockerకి ప్రత్యేక ప్రాప్యతను కలిగి ఉండేలా రూపొందించబడింది. ఈ ఫోల్డర్లో ఉన్న డాకర్ ఫైల్లను మరేదైనా "తాకకూడదు, గుచ్చకూడదు లేదా ప్రోడ్ చేయకూడదు".
ఇది ఎందుకు? ఎందుకంటే ఇది డాట్క్లౌడ్ను అభివృద్ధి చేస్తున్నప్పుడు నేర్చుకున్న కష్టతరమైన పాఠాలలో ఒకటి. డాట్క్లౌడ్ కంటైనర్ ఇంజన్ ఏకకాలంలో /var/lib/dotcloudని యాక్సెస్ చేయడం ద్వారా బహుళ ప్రక్రియలను కలిగి ఉంది. అటామిక్ ఫైల్ రీప్లేస్మెంట్ (ఇన్-ప్లేస్ ఎడిటింగ్కు బదులుగా), సలహా మరియు తప్పనిసరి లాక్లతో కూడిన పెప్పరింగ్ కోడ్ మరియు SQLite మరియు BDB వంటి సురక్షిత సిస్టమ్లతో ఇతర ప్రయోగాలు వంటి మోసపూరిత ట్రిక్స్ ఎల్లప్పుడూ పని చేయలేదు. మేము మా కంటైనర్ ఇంజిన్ను రీడిజైనింగ్ చేస్తున్నప్పుడు, అది చివరికి డాకర్గా మారింది, అన్ని కాన్కరెన్సీ అర్ధంలేని వాటిని తొలగించడానికి అన్ని కంటైనర్ కార్యకలాపాలను ఒకే డెమోన్ కింద ఏకీకృతం చేయడం పెద్ద డిజైన్ నిర్ణయాలలో ఒకటి.
నన్ను తప్పుగా భావించవద్దు: బహుళ ప్రక్రియలు మరియు ఆధునిక సమాంతర నియంత్రణతో కూడిన మంచి, నమ్మదగిన మరియు వేగవంతమైనదాన్ని చేయడం పూర్తిగా సాధ్యమే. కానీ డాకర్ను మాత్రమే ప్లేయర్గా ఉపయోగించి కోడ్ని వ్రాయడం మరియు నిర్వహించడం చాలా సులభం మరియు సులభం అని మేము భావిస్తున్నాము.
మీరు బహుళ డాకర్ ఇన్స్టాన్స్ల మధ్య /var/lib/docker డైరెక్టరీని భాగస్వామ్యం చేస్తే, మీకు సమస్యలు ఎదురవుతాయని దీని అర్థం. వాస్తవానికి, ఇది పని చేయగలదు, ముఖ్యంగా పరీక్ష ప్రారంభ దశల్లో. "వినండి, మా, నేను డాకర్గా ఉబుంటును నడపగలను!" కానీ రెండు వేర్వేరు సందర్భాల్లో ఒకే చిత్రాన్ని లాగడం వంటి సంక్లిష్టమైనదాన్ని ప్రయత్నించండి, మరియు మీరు ప్రపంచం కాలిపోవడం చూస్తారు.
దీని అర్థం మీ CI సిస్టమ్ బిల్డ్లు మరియు రీబిల్డ్లను నిర్వహిస్తే, మీరు మీ డాకర్-ఇన్-డాకర్ కంటైనర్ను పునఃప్రారంభించిన ప్రతిసారీ, మీరు దాని కాష్లో న్యూక్ను పడిపోయే ప్రమాదం ఉంది. ఇది అస్సలు కూల్ కాదు!
ప్రసంగిస్తూ
ఒక అడుగు వెనక్కి వేద్దాం. మీకు నిజంగా డాకర్-ఇన్-డాకర్ అవసరమా లేదా ఆ 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
ఇది డాకర్-ఇన్-డాకర్ లాగా కనిపిస్తుంది మరియు పని చేస్తుంది, కానీ ఇది డాకర్-ఇన్-డాకర్ కాదు: ఈ కంటైనర్ అదనపు కంటైనర్లను సృష్టించినప్పుడు, అవి అగ్ర-స్థాయి డాకర్లో సృష్టించబడతాయి. మీరు గూడు యొక్క దుష్ప్రభావాలను అనుభవించలేరు మరియు అసెంబ్లీ కాష్ బహుళ కాల్లలో భాగస్వామ్యం చేయబడుతుంది.
గమనిక: ఈ కథనం యొక్క మునుపటి సంస్కరణలు డాకర్ బైనరీని హోస్ట్ నుండి కంటైనర్కు లింక్ చేయాలని సూచించాయి. డాకర్ ఇంజిన్ ఇకపై స్టాటిక్ లేదా నియర్-స్టాటిక్ లైబ్రరీలను కవర్ చేయనందున ఇది ఇప్పుడు నమ్మదగనిదిగా మారింది.
కాబట్టి, మీరు జెంకిన్స్ CI నుండి డాకర్ని ఉపయోగించాలనుకుంటే, మీకు 2 ఎంపికలు ఉన్నాయి:
ప్రాథమిక ఇమేజ్ ప్యాకేజింగ్ సిస్టమ్ను ఉపయోగించి డాకర్ CLIని ఇన్స్టాల్ చేయడం (అనగా మీ చిత్రం డెబియన్ ఆధారంగా ఉంటే, .deb ప్యాకేజీలను ఉపయోగించండి), డాకర్ APIని ఉపయోగించి.
కొన్ని ప్రకటనలు 🙂
మాతో ఉన్నందుకు ధన్యవాదాలు. మీరు మా కథనాలను ఇష్టపడుతున్నారా? మరింత ఆసక్తికరమైన కంటెంట్ని చూడాలనుకుంటున్నారా? ఆర్డర్ చేయడం ద్వారా లేదా స్నేహితులకు సిఫార్సు చేయడం ద్వారా మాకు మద్దతు ఇవ్వండి,
ఆమ్స్టర్డామ్లోని ఈక్వినిక్స్ టైర్ IV డేటా సెంటర్లో Dell R730xd 2x చౌకగా ఉందా? ఇక్కడ మాత్రమే
మూలం: www.habr.com