Мен Докерди Докердин ичинде кантип иштеттим жана андан эмне чыкты

Баарына салам! Анын мурунку макала, Мен Докерди Dockerде иштетүү жана бул сабакты колдонуунун практикалык аспектилери жөнүндө сөз кылууга убада бердим. Убаданы аткарууга убакыт келди. Тажрыйбалуу иштеп чыгуучу Докердин ичинде Dockerге муктаж болгондор Docker демонунун розеткасын хосттон контейнерге жөнөтөт деп каршы чыгышы мүмкүн жана бул 99% учурларда жетиштүү болот. Бирок мага кукилерди ыргытууга шашпаңыз, анткени биз Докерди Докердин ичинде иштетүү жөнүндө сүйлөшөбүз. Бул чечимдин көптөгөн мүмкүн болгон колдонмолору бар жана бул макала алардын бири жөнүндө, андыктан артка отуруп, колуңузду алдыңызда түздөңүз.

Мен Докерди Докердин ичинде кантип иштеттим жана андан эмне чыкты

баштап

Мунун баары сентябрдын жаандуу кечинде Digital Oceanдан 5 долларга ижарага алган машинамды тазалап жатканымда башталды, ал Docker бардык 24 гигабайт диск мейкиндигин сүрөттөрү жана контейнерлери менен толтургандыктан тоңуп калган. Кызыгы, бул сүрөттөр менен контейнерлердин баары убактылуу болгондуктан, китепкананын же алкактын жаңы версиясы чыккан сайын менин колдонмомдун иштешин текшерүү үчүн гана керек болчу. Мен таштандыларды тазалоо үчүн кабык скрипттерин жазууга жана cron графигин түзүүгө аракет кылдым, бирок бул жардам берген жок: ал сөзсүз түрдө менин серверимдин диск мейкиндиги жеп калышы жана сервердин илинип калышы (эң жакшысы) менен аяктады. Бир убакта мен Дженкинсти контейнерде кантип иштетүү керектиги жана ага жөнөтүлгөн докер демон розеткасы аркылуу куруу түтүктөрүн кантип түзүп жана жок кыла ала тургандыгы жөнүндө макалага туш болдум. Бул идея мага жакты, бирок мен андан ары барууну чечтим жана Dockerдин ичинде түздөн-түз Dockerди иштетүү менен эксперимент жасоону чечтим. Ошол учурда мага Docker сүрөттөрүн жүктөп алуу жана башка контейнердин ичинде сыноо үчүн керектүү бардык тиркемелер үчүн контейнерлерди түзүү (келгиле, аны сахналык контейнер деп атайлы) логикалык чечим болуп көрүндү. Идея -rm желеги менен стадиялык контейнерди баштоо болчу, ал токтогондо бүт контейнерди жана анын бардык мазмунун автоматтык түрдө жок кылат. Мен Докердин сүрөтү менен Dockerдин өзүнөн аралаштым (https://hub.docker.com/_/docker), бирок бул өтө түйшүктүү болуп чыкты жана мен аны эч качан керектүүдөй иштете алган жокмун жана мен өзүм бардык жол менен баргым келди.

Машыгуу. Конустар

Мен контейнерди өзүм каалагандай иштетүүнү көздөп, эксперименттеримди уланттым, натыйжада сансыз бүчүрлөр пайда болду. Менин өзүмдү кыйноонун натыйжасы төмөнкү алгоритм болду:

  1. Докер контейнерин интерактивдүү режимде ишке киргизебиз.

    docker run --privileged -it docker:18.09.6

    Контейнердин версиясына көңүл буруңуз, оңго же солго кадам таштаңыз жана сиздин DinD ашкабакка айланат. Чындыгында, жаңы версия чыкканда нерселер көп бузулат.
    Биз дароо кабыкчага киришибиз керек.

  2. Биз кайсы контейнерлер иштеп жатканын аныктоого аракет кылып жатабыз (Жооп: жок), бирок баары бир команданы иштетели:

    docker ps

    Сиз бир аз таң каласыз, бирок Docker демону иштебейт экен:

    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га караганда bashда иштөө жагымдуураак):

    apk add --no-cache iptables bash

  5. келгиле, bash иштетели. Акыры, биз кадимки кабыкчага кайтып келдик

  6. Келгиле, Dockerди кайра иштетүүгө аракет кылалы:

    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. Enter баскычын басыңыз. Биз башга кайтып келдик.

Мындан ары биз Docker контейнерибиздин ичинде башка контейнерлерди ишке киргизгенге аракет кылсак болот, бирок Docker контейнерибиздин ичинде дагы бир Docker контейнерин ишке киргизгибиз келсе же бир нерсе туура эмес болуп, контейнер бузулуп калсачы? Баарын кайра башта.

Менчик DinD контейнери жана жаңы эксперименттер

Мен Докерди Докердин ичинде кантип иштеттим жана андан эмне чыкты
Жогорудагы кадамдарды кайра-кайра кайталабоо үчүн, мен өзүмдүн DinD контейнеримди түздүм:

https://github.com/alekslitvinenk/dind

Жумушчу DinD чечими мага Dockerди Докердин ичинде рекурсивдүү иштетүүгө жана укмуштуудай эксперименттерди жасоого мүмкүнчүлүк берди.
Мен азыр MySQL жана Nodejs иштетүү менен ушундай (ийгиликтүү) экспериментти сүрөттөп берем.
Эң чыдабаган адам бул жерде кандай болгонун көрө алат

Баштадык:

  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. Браузердеги localhost'ка барабыз, сервер "Салам дүйнө!" деп жооп беришин текшериңиз.

Менин учурда, Докер контейнерлери менен жасалган эксперимент абдан жакшы болду жана мен долбоорду иштеп чыгууну жана аны сахналаштыруу үчүн колдоном. Менимче, бул Кубернетес менен Дженкинс Икс караганда бир топ жеңил чечим. Бирок бул менин субъективдүү пикирим.

Менимче, бул бүгүнкү макала үчүн. Кийинки макалада мен Dockerди рекурсивдүү Dockerде иштетүү жана каталогдорду уя салынган контейнерлерге тереңдетүү боюнча эксперименттерди кеңири сүрөттөп берем.

PS Эгер сиз бул долбоорду пайдалуу деп тапсаңыз, ага GitHub'да жылдыз берип, айрыңыз жана досторуңузга айтыңыз.

1 Оңдолгон каталар, 2 видеого багытталган

Source: www.habr.com

Комментарий кошуу