నేను డాకర్ లోపల డాకర్‌ని ఎలా నడిపించాను మరియు దాని నుండి ఏమి వచ్చింది

అందరికి వందనాలు! ఆయన లో మునుపటి వ్యాసం, నేను డాకర్‌లో డాకర్‌ని రన్ చేయడం గురించి మరియు ఈ పాఠాన్ని ఉపయోగించడంలోని ఆచరణాత్మక అంశాల గురించి మాట్లాడతానని వాగ్దానం చేసాను. మీ వాగ్దానాన్ని నిలబెట్టుకునే సమయం ఇది. అనుభవజ్ఞుడైన డెవోప్సర్ బహుశా డాకర్ లోపల డాకర్ అవసరమయ్యే వారు డాకర్ డెమోన్ సాకెట్‌ను హోస్ట్ నుండి కంటైనర్‌లోకి ఫార్వార్డ్ చేయవచ్చు మరియు 99% కేసులలో ఇది సరిపోతుంది. కానీ నాపై కుక్కీలను విసిరేందుకు తొందరపడకండి, ఎందుకంటే మేము డాకర్ లోపల డాకర్‌ని అమలు చేయడం గురించి మాట్లాడుతాము. ఈ పరిష్కారం అనేక రకాల అప్లికేషన్‌లను కలిగి ఉంది మరియు ఈ కథనం వాటిలో ఒకదాని గురించి ఉంది, కాబట్టి వెనుకకు కూర్చుని మీ చేతులను మీ ముందు నిఠారుగా ఉంచండి.

నేను డాకర్ లోపల డాకర్‌ని ఎలా నడిపించాను మరియు దాని నుండి ఏమి వచ్చింది

Начало

నేను డిజిటల్ ఓషన్‌లో $5కి అద్దెకు తీసుకున్న మెషిన్‌ను క్లీన్ చేస్తున్నప్పుడు వర్షం కురుస్తున్న సెప్టెంబర్ సాయంత్రం ఇదంతా ప్రారంభమైంది, డాకర్ దాని చిత్రాలు మరియు కంటైనర్‌లతో అందుబాటులో ఉన్న మొత్తం 24 గిగాబైట్ల డిస్క్ స్థలాన్ని నింపినందున స్తంభింపజేయబడింది. హాస్యాస్పదమేమిటంటే, ఈ చిత్రాలు మరియు కంటైనర్‌లన్నీ తాత్కాలికమైనవి మరియు లైబ్రరీ లేదా ఫ్రేమ్‌వర్క్ యొక్క కొత్త వెర్షన్ విడుదలైన ప్రతిసారీ నా అప్లికేషన్ పనితీరును పరీక్షించడానికి మాత్రమే అవసరం. నేను షెల్ స్క్రిప్ట్‌లను వ్రాయడానికి మరియు చెత్తను శుభ్రం చేయడానికి క్రాన్ షెడ్యూల్‌ను సెటప్ చేయడానికి ప్రయత్నించాను, కానీ అది సహాయం చేయలేదు: ప్రతిసారీ ఇది అనివార్యంగా నా సర్వర్ యొక్క డిస్క్ ఖాళీని తినివేయడం మరియు సర్వర్ వేలాడదీయడంతో ముగిసింది (ఉత్తమంగా). ఏదో ఒక సమయంలో, జెంకిన్స్‌ను కంటైనర్‌లో ఎలా రన్ చేయాలి మరియు దానిలో ఫార్వార్డ్ చేయబడిన డాకర్ డెమోన్ సాకెట్ ద్వారా బిల్డ్ పైప్‌లైన్‌లను ఎలా సృష్టించవచ్చు మరియు తొలగించవచ్చు అనే కథనాన్ని నేను చూశాను. నేను ఈ ఆలోచనను ఇష్టపడ్డాను, కానీ నేను మరింత ముందుకు వెళ్లాలని నిర్ణయించుకున్నాను మరియు డాకర్‌లో నేరుగా డాకర్‌ని అమలు చేయడానికి ప్రయత్నించాలని నిర్ణయించుకున్నాను. ఆ సమయంలో, డాకర్ చిత్రాలను డౌన్‌లోడ్ చేయడం మరియు మరొక కంటైనర్‌లో పరీక్షించడానికి అవసరమైన అన్ని అప్లికేషన్‌ల కోసం కంటైనర్‌లను సృష్టించడం నాకు పూర్తిగా తార్కిక పరిష్కారం అనిపించింది (దీనిని స్టేజింగ్ కంటైనర్ అని పిలుద్దాం). -rm ఫ్లాగ్‌తో స్టేజింగ్ కంటైనర్‌ను ప్రారంభించాలనే ఆలోచన ఉంది, ఇది ఆపివేయబడినప్పుడు మొత్తం కంటైనర్‌ను మరియు దానిలోని మొత్తం కంటెంట్‌లను ఆటోమేటిక్‌గా తొలగిస్తుంది. నేను డాకర్ నుండి డాకర్ ఇమేజ్‌తో టింకర్ చేసాను (https://hub.docker.com/_/docker), కానీ ఇది చాలా గజిబిజిగా మారింది మరియు నాకు అవసరమైన విధంగా పని చేయడానికి నేను ఎప్పుడూ నిర్వహించలేకపోయాను మరియు నేనే అన్ని విధాలుగా వెళ్లాలనుకుంటున్నాను.

సాధన. శంకువులు

కంటైనర్‌ను నాకు అవసరమైన విధంగా పని చేయడానికి నేను బయలుదేరాను మరియు నా ప్రయోగాలను కొనసాగించాను, దాని ఫలితంగా అనేక మొగ్గలు వచ్చాయి. నా స్వీయ హింస యొక్క ఫలితం క్రింది అల్గోరిథం:

  1. మేము ఇంటరాక్టివ్ మోడ్‌లో డాకర్ కంటైనర్‌ను ప్రారంభిస్తాము.

    docker run --privileged -it docker:18.09.6

    కంటైనర్ వెర్షన్‌పై శ్రద్ధ వహించండి, కుడి లేదా ఎడమవైపు అడుగు వేయండి మరియు మీ DinD గుమ్మడికాయగా మారుతుంది. నిజానికి, కొత్త వెర్షన్ విడుదలైనప్పుడు విషయాలు చాలా తరచుగా విరిగిపోతాయి.
    మేము వెంటనే షెల్ లోకి పొందాలి.

  2. ఏ కంటైనర్లు నడుస్తున్నాయో తెలుసుకోవడానికి మేము ప్రయత్నిస్తున్నాము (సమాధానం: ఏదీ లేదు), అయితే ఆదేశాన్ని ఎలాగైనా అమలు చేద్దాం:

    docker ps

    మీరు కొంచెం ఆశ్చర్యపోతారు, కానీ డాకర్ డెమోన్ కూడా పని చేయడం లేదని తేలింది:

    error during connect: Get http://docker:2375/v1.40/containers/json: dial tcp: lookup docker on 
    192.168.65.1:53: no such host

  3. దీన్ని మనమే అమలు చేద్దాం:

    dockerd &

    మరొక అసహ్యకరమైన ఆశ్చర్యం:

    failed to start daemon: Error initializing network controller: error obtaining controller instance: failed 
    to create NAT chain DOCKER: Iptables not found

  4. iptables మరియు bash ప్యాకేజీలను ఇన్‌స్టాల్ చేయండి (shలో కంటే బాష్‌లో పని చేయడానికి ప్రతిదీ మరింత ఆహ్లాదకరంగా ఉంటుంది):

    apk add --no-cache iptables bash

  5. బాష్ లాంచ్ చేద్దాం. చివరగా మేము సాధారణ షెల్‌లోకి తిరిగి వచ్చాము

  6. డాకర్‌ని మళ్లీ ప్రారంభించడానికి ప్రయత్నిద్దాం:

    dockerd &

    దీనితో ముగిసే లాగ్‌ల పొడవైన షీట్‌ని మనం చూడాలి:

    INFO[2019-11-25T19:51:19.448080400Z] Daemon has completed initialization          
    INFO[2019-11-25T19:51:19.474439300Z] API listen on /var/run/docker.sock

  7. ఎంటర్ నొక్కండి. మేము బాష్‌లోకి తిరిగి వచ్చాము.

ఇప్పటి నుండి, మేము మా డాకర్ కంటైనర్‌లో ఇతర కంటైనర్‌లను లాంచ్ చేయడానికి ప్రయత్నించవచ్చు, కానీ మన డాకర్ కంటైనర్‌లో మరొక డాకర్ కంటైనర్‌ను ప్రారంభించాలనుకుంటే లేదా ఏదైనా తప్పు జరిగి కంటైనర్ క్రాష్ అయితే? మళ్లీ ప్రారంభించండి.

స్వంత DinD కంటైనర్ మరియు కొత్త ప్రయోగాలు

నేను డాకర్ లోపల డాకర్‌ని ఎలా నడిపించాను మరియు దాని నుండి ఏమి వచ్చింది
పై దశలను మళ్లీ మళ్లీ పునరావృతం చేయకుండా ఉండటానికి, నేను నా స్వంత DinD కంటైనర్‌ను సృష్టించాను:

https://github.com/alekslitvinenk/dind

పని చేసే DinD సొల్యూషన్ నాకు డాకర్ లోపల డాకర్‌ను పునరావృతంగా అమలు చేయగల సామర్థ్యాన్ని అందించింది మరియు మరింత సాహసోపేతమైన ప్రయోగాలు చేయగలదు.
నేను ఇప్పుడు MySQL మరియు Nodejలను అమలు చేయడంలో అటువంటి (విజయవంతమైన) ప్రయోగాన్ని వివరించబోతున్నాను.
అత్యంత అసహనం ఇక్కడ ఎలా ఉందో చూడగలరు

కాబట్టి, ప్రారంభిద్దాం:

  1. మేము ఇంటరాక్టివ్ మోడ్‌లో DinDని ప్రారంభిస్తాము. DinD యొక్క ఈ సంస్కరణలో, మన పిల్లల కంటైనర్‌లు ఉపయోగించగల అన్ని పోర్ట్‌లను మనం మాన్యువల్‌గా మ్యాప్ చేయాలి (నేను ఇప్పటికే దీనిపై పని చేస్తున్నాను)

    docker run --privileged -it 
    -p 80:8080 
    -p 3306:3306 
    alekslitvinenk/dind

    మేము బాష్‌లోకి ప్రవేశిస్తాము, అక్కడ నుండి మేము వెంటనే పిల్లల కంటైనర్‌లను ప్రారంభించడం ప్రారంభించవచ్చు.

  2. MySQLని ప్రారంభించండి:

    docker run --name mysql -e MYSQL_ROOT_PASSWORD=strongpassword -d -p 3306:3306 mysql

  3. మేము డేటాబేస్‌కు స్థానికంగా కనెక్ట్ అయ్యే విధంగానే కనెక్ట్ చేస్తాము. ప్రతిదీ పని చేస్తుందని నిర్ధారించుకుందాం.

  4. రెండవ కంటైనర్‌ను ప్రారంభించండి:

    docker run -d --rm -p 8080:8080 alekslitvinenk/hello-world-nodejs-server

    పోర్ట్ మ్యాపింగ్ ఖచ్చితంగా ఉంటుందని దయచేసి గమనించండి 8080:8080, మేము ఇప్పటికే పోర్ట్ 80ని హోస్ట్ నుండి పేరెంట్ కంటైనర్‌కు పోర్ట్ 8080కి మ్యాప్ చేసాము.

  5. మేము బ్రౌజర్‌లోని లోకల్ హోస్ట్‌కి వెళ్తాము, సర్వర్ “హలో వరల్డ్!” అని ప్రతిస్పందిస్తుందని నిర్ధారించుకోండి.

నా విషయంలో, నెస్టెడ్ డాకర్ కంటైనర్‌లతో చేసిన ప్రయోగం చాలా సానుకూలంగా మారింది మరియు నేను ప్రాజెక్ట్‌ను అభివృద్ధి చేయడం మరియు దానిని స్టేజింగ్ కోసం ఉపయోగించడం కొనసాగిస్తాను. ఇది Kubernetes మరియు Jenkins X కంటే చాలా తేలికైన పరిష్కారం అని నాకు అనిపిస్తోంది. కానీ ఇది నా ఆత్మాశ్రయ అభిప్రాయం.

ఈరోజు కథనం కూడా అంతే అనుకుంటున్నాను. తదుపరి కథనంలో నేను డాకర్‌లో డాకర్‌ని పునరావృతంగా రన్ చేయడం మరియు డైరెక్టరీలను నెస్టెడ్ కంటైనర్‌లలోకి మౌంట్ చేయడం వంటి ప్రయోగాలను మరింత వివరంగా వివరిస్తాను.

PS మీకు ఈ ప్రాజెక్ట్ ఉపయోగకరంగా అనిపిస్తే, దయచేసి GitHubలో దానికి స్టార్‌ని ఇవ్వండి, ఫోర్క్ చేయండి మరియు మీ స్నేహితులకు చెప్పండి.

సవరించు 1 లోపాలు సరిదిద్దబడ్డాయి, 2 వీడియోలపై దృష్టి కేంద్రీకరించబడింది

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి