Баарына салам! Анын
баштап
Мунун баары сентябрдын жаандуу кечинде Digital Oceanдан 5 долларга ижарага алган машинамды тазалап жатканымда башталды, ал Docker бардык 24 гигабайт диск мейкиндигин сүрөттөрү жана контейнерлери менен толтургандыктан тоңуп калган. Кызыгы, бул сүрөттөр менен контейнерлердин баары убактылуу болгондуктан, китепкананын же алкактын жаңы версиясы чыккан сайын менин колдонмомдун иштешин текшерүү үчүн гана керек болчу. Мен таштандыларды тазалоо үчүн кабык скрипттерин жазууга жана cron графигин түзүүгө аракет кылдым, бирок бул жардам берген жок: ал сөзсүз түрдө менин серверимдин диск мейкиндиги жеп калышы жана сервердин илинип калышы (эң жакшысы) менен аяктады. Бир убакта мен Дженкинсти контейнерде кантип иштетүү керектиги жана ага жөнөтүлгөн докер демон розеткасы аркылуу куруу түтүктөрүн кантип түзүп жана жок кыла ала тургандыгы жөнүндө макалага туш болдум. Бул идея мага жакты, бирок мен андан ары барууну чечтим жана Dockerдин ичинде түздөн-түз Dockerди иштетүү менен эксперимент жасоону чечтим. Ошол учурда мага Docker сүрөттөрүн жүктөп алуу жана башка контейнердин ичинде сыноо үчүн керектүү бардык тиркемелер үчүн контейнерлерди түзүү (келгиле, аны сахналык контейнер деп атайлы) логикалык чечим болуп көрүндү. Идея -rm желеги менен стадиялык контейнерди баштоо болчу, ал токтогондо бүт контейнерди жана анын бардык мазмунун автоматтык түрдө жок кылат. Мен Докердин сүрөтү менен Dockerдин өзүнөн аралаштым (
Машыгуу. Конустар
Мен контейнерди өзүм каалагандай иштетүүнү көздөп, эксперименттеримди уланттым, натыйжада сансыз бүчүрлөр пайда болду. Менин өзүмдү кыйноонун натыйжасы төмөнкү алгоритм болду:
-
Докер контейнерин интерактивдүү режимде ишке киргизебиз.
docker run --privileged -it docker:18.09.6
Контейнердин версиясына көңүл буруңуз, оңго же солго кадам таштаңыз жана сиздин DinD ашкабакка айланат. Чындыгында, жаңы версия чыкканда нерселер көп бузулат.
Биз дароо кабыкчага киришибиз керек. -
Биз кайсы контейнерлер иштеп жатканын аныктоого аракет кылып жатабыз (Жооп: жок), бирок баары бир команданы иштетели:
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
-
Келгиле, өзүбүз иштетели:
dockerd &
Дагы бир жагымсыз сюрприз:
failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: Iptables not found
-
Iptables жана bash пакеттерин орнотуңуз (баары shга караганда bashда иштөө жагымдуураак):
apk add --no-cache iptables bash
-
келгиле, bash иштетели. Акыры, биз кадимки кабыкчага кайтып келдик
-
Келгиле, 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
-
Enter баскычын басыңыз. Биз башга кайтып келдик.
Мындан ары биз Docker контейнерибиздин ичинде башка контейнерлерди ишке киргизгенге аракет кылсак болот, бирок Docker контейнерибиздин ичинде дагы бир Docker контейнерин ишке киргизгибиз келсе же бир нерсе туура эмес болуп, контейнер бузулуп калсачы? Баарын кайра башта.
Менчик DinD контейнери жана жаңы эксперименттер
Жогорудагы кадамдарды кайра-кайра кайталабоо үчүн, мен өзүмдүн DinD контейнеримди түздүм:
Жумушчу DinD чечими мага Dockerди Докердин ичинде рекурсивдүү иштетүүгө жана укмуштуудай эксперименттерди жасоого мүмкүнчүлүк берди.
Мен азыр MySQL жана Nodejs иштетүү менен ушундай (ийгиликтүү) экспериментти сүрөттөп берем.
Эң чыдабаган адам бул жерде кандай болгонун көрө алат
Баштадык:
-
DinDди интерактивдүү режимде ишке киргизебиз. DinDдин бул версиясында биз бала контейнерлерибиз колдоно ала турган бардык портторду кол менен карталашыбыз керек (мен буга чейин эле иштеп жатам)
docker run --privileged -it -p 80:8080 -p 3306:3306 alekslitvinenk/dind
Биз башга киребиз, ал жерден биз дароо балдар контейнерлерин ишке киргизе алабыз.
-
MySQLди ишке киргизиңиз:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=strongpassword -d -p 3306:3306 mysql
-
Биз маалымат базасына жергиликтүү түрдө туташкандай эле туташабыз. Келгиле, баары иштей турганына ынаналы.
-
Экинчи контейнерди ишке киргизиңиз:
docker run -d --rm -p 8080:8080 alekslitvinenk/hello-world-nodejs-server
Сураныч, порттун картасы так болорун эске алыңыз 8080:8080, анткени биз 80-портту хосттон ата-энелик контейнерге 8080 портуна чейин картага түшүрдүк.
-
Браузердеги localhost'ка барабыз, сервер "Салам дүйнө!" деп жооп беришин текшериңиз.
Менин учурда, Докер контейнерлери менен жасалган эксперимент абдан жакшы болду жана мен долбоорду иштеп чыгууну жана аны сахналаштыруу үчүн колдоном. Менимче, бул Кубернетес менен Дженкинс Икс караганда бир топ жеңил чечим. Бирок бул менин субъективдүү пикирим.
Менимче, бул бүгүнкү макала үчүн. Кийинки макалада мен Dockerди рекурсивдүү Dockerде иштетүү жана каталогдорду уя салынган контейнерлерге тереңдетүү боюнча эксперименттерди кеңири сүрөттөп берем.
PS Эгер сиз бул долбоорду пайдалуу деп тапсаңыз, ага GitHub'да жылдыз берип, айрыңыз жана досторуңузга айтыңыз.
1 Оңдолгон каталар, 2 видеого багытталган
Source: www.habr.com