Здраво свима! У његовој , обећао сам да ћу причати о покретању Доцкер-а у Доцкер-у и практичним аспектима коришћења ове лекције. Време је да одржи обећање. Искусни девопсер ће вероватно приговорити да они којима је потребан Доцкер унутар Доцкера једноставно проследе Доцкер даемон соцкет са хоста у контејнер и то ће бити довољно у 99% случајева. Али немојте журити да бацате колачиће на мене, јер ћемо разговарати о томе да заправо покренете Доцкер унутар Доцкер-а. Ово решење има много могућих примена и овај чланак је о једној од њих, па се завалите и исправите руке испред себе.

почетак
Све је почело кишне септембарске вечери када сам чистио машину коју сам изнајмио за 5 долара на Дигитал Оцеану, која је била замрзнута због чињенице да је Доцкер својим сликама и контејнерима попунио свих 24 гигабајта доступног простора на диску. Иронија је била у томе што су све ове слике и контејнери били пролазни и били су потребни само за тестирање перформанси моје апликације сваки пут када је објављена нова верзија библиотеке или оквира. Покушао сам да напишем схелл скрипте и поставим црон распоред за чишћење смећа, али није помогло: сваки пут се то неизбежно завршило тако што је простор на диску мог сервера био поједен и сервер виси (у најбољем случају). У неком тренутку сам наишао на чланак о томе како покренути Џенкинса у контејнеру и како он може да креира и брише цевоводе за изградњу кроз доцкер даемон соцкет прослеђен у њега. Свидела ми се идеја, али сам одлучио да идем даље и покушам да експериментишем са директним покретањем Доцкер-а унутар Доцкер-а. У то време ми се чинило потпуно логичним решењем да преузмем Доцкер слике и направим контејнере за све апликације које су ми биле потребне за тестирање унутар другог контејнера (назовимо га сценским контејнером). Идеја је била да се покрене сценски контејнер са -рм заставицом, која аутоматски брише цео контејнер и сав његов садржај када се заустави. Побркао сам се са Доцкер сликом из самог Доцкера (), али се испоставило да је превише гломазно и никада нисам успео да га натерам да ради онако како ми је требао и желео сам да идем до краја.
Вежбајте. Конуси
Намеравао сам да учиним да контејнер ради онако како ми је требало и наставио сам своје експерименте, што је резултирало безброј пупољака. Резултат мог самомучења био је следећи алгоритам:
Покрећемо Доцкер контејнер у интерактивном режиму.
docker run --privileged -it docker:18.09.6Обратите пажњу на верзију контејнера, идите десно или лево и ваш ДинД се претвара у бундеву. У ствари, ствари се често кваре када се објави нова верзија.
Морамо одмах ући у шкољку.Покушавамо да сазнамо који контејнери су покренути (одговор: нема), али хајде да ипак покренемо команду:
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Хајде да га сами покренемо:
dockerd &Још једно непријатно изненађење:
failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: Iptables not foundИнсталирајте иптаблес и басх пакете (све је пријатније радити у басх-у него у сх-у):
apk add --no-cache iptables bashХајде да покренемо басх. Коначно смо се вратили у уобичајену љуску
Покушајмо поново да покренемо Доцкер:
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Притисните ентер. Вратили смо се у басх.
Од сада можемо покушати да покренемо друге контејнере унутар нашег Доцкер контејнера, али шта ако желимо да покренемо други Доцкер контејнер унутар нашег Доцкер контејнера или нешто пође по злу и контејнер се сруши? Почети све испочетка.
Властити ДинД контејнер и нови експерименти
Да бих избегао понављање горњих корака изнова и изнова, направио сам свој ДинД контејнер:
Радно решење ДинД ми је дало могућност да рекурзивно покрећем Доцкер унутар Доцкер-а и радим авантуристичкије експерименте.
Сада ћу описати један такав (успешан) експеримент са покретањем МиСКЛ-а и Нодејс-а.
Најнестрпљивији виде како је овде било

Дакле, кренимо:
Покрећемо ДинД у интерактивном режиму. У овој верзији ДинД-а, морамо ручно да мапирамо све портове које наши подређени контејнери могу да користе (већ радим на томе)
docker run --privileged -it -p 80:8080 -p 3306:3306 alekslitvinenk/dindУлазимо у басх, одакле одмах можемо да почнемо да лансирамо дечије контејнере.
Покрените МиСКЛ:
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.
Идемо на лоцалхост у претраживачу, уверите се да сервер одговара „Хелло Ворлд!“
У мом случају, експеримент са угнежђеним Доцкер контејнерима се показао прилично позитивним и наставићу да развијам пројекат и користим га за постављање. Чини ми се да је ово много лакше решење од Кубернетеса и Џенкинса Кс. Али ово је моје субјективно мишљење.
Мислим да је то све за данашњи чланак. У следећем чланку ћу детаљније описати експерименте са рекурзивним покретањем Доцкер-а у Доцкер-у и монтирањем директоријума дубоко у угнежђене контејнере.
ПС Ако сматрате да је овај пројекат користан, дајте му звездицу на ГитХуб-у, поделите га и реците својим пријатељима.
ЕдитКСНУМКС Исправљене грешке, фокусирано на 2 видео снимка
Извор: ввв.хабр.цом
