Како сам покренуо Доцкер унутар Доцкер-а и шта је изашло из њега

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

Како сам покренуо Доцкер унутар Доцкер-а и шта је изашло из њега

почетак

Све је почело кишне септембарске вечери када сам чистио машину коју сам изнајмио за 5 долара на Дигитал Оцеану, која је била замрзнута због чињенице да је Доцкер својим сликама и контејнерима попунио свих 24 гигабајта доступног простора на диску. Иронија је била у томе што су све ове слике и контејнери били пролазни и били су потребни само за тестирање перформанси моје апликације сваки пут када је објављена нова верзија библиотеке или оквира. Покушао сам да напишем схелл скрипте и поставим црон распоред за чишћење смећа, али није помогло: сваки пут се то неизбежно завршило тако што је простор на диску мог сервера био поједен и сервер виси (у најбољем случају). У неком тренутку сам наишао на чланак о томе како покренути Џенкинса у контејнеру и како он може да креира и брише цевоводе за изградњу кроз доцкер даемон соцкет прослеђен у њега. Свидела ми се идеја, али сам одлучио да идем даље и покушам да експериментишем са директним покретањем Доцкер-а унутар Доцкер-а. У то време ми се чинило потпуно логичним решењем да преузмем Доцкер слике и направим контејнере за све апликације које су ми биле потребне за тестирање унутар другог контејнера (назовимо га сценским контејнером). Идеја је била да се покрене сценски контејнер са -рм заставицом, која аутоматски брише цео контејнер и сав његов садржај када се заустави. Побркао сам се са Доцкер сликом из самог Доцкера (https://hub.docker.com/_/docker), али се испоставило да је превише гломазно и никада нисам успео да га натерам да ради онако како ми је требао и желео сам да идем до краја.

Вежбајте. Конуси

Намеравао сам да учиним да контејнер ради онако како ми је требало и наставио сам своје експерименте, што је резултирало безброј пупољака. Резултат мог самомучења био је следећи алгоритам:

  1. Покрећемо Доцкер контејнер у интерактивном режиму.

    docker run --privileged -it docker:18.09.6

    Обратите пажњу на верзију контејнера, идите десно или лево и ваш ДинД се претвара у бундеву. У ствари, ствари се често кваре када се објави нова верзија.
    Морамо одмах ући у шкољку.

  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. Инсталирајте иптаблес и басх пакете (све је пријатније радити у басх-у него у сх-у):

    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. Притисните ентер. Вратили смо се у басх.

Од сада можемо покушати да покренемо друге контејнере унутар нашег Доцкер контејнера, али шта ако желимо да покренемо други Доцкер контејнер унутар нашег Доцкер контејнера или нешто пође по злу и контејнер се сруши? Почети све испочетка.

Властити ДинД контејнер и нови експерименти

Како сам покренуо Доцкер унутар Доцкер-а и шта је изашло из њега
Да бих избегао понављање горњих корака изнова и изнова, направио сам свој ДинД контејнер:

https://github.com/alekslitvinenk/dind

Радно решење ДинД ми је дало могућност да рекурзивно покрећем Доцкер унутар Доцкер-а и радим авантуристичкије експерименте.
Сада ћу описати један такав (успешан) експеримент са покретањем МиСКЛ-а и Нодејс-а.
Најнестрпљивији виде како је овде било

Пусти видео

Дакле, кренимо:

  1. Покрећемо ДинД у интерактивном режиму. У овој верзији ДинД-а, морамо ручно да мапирамо све портове које наши подређени контејнери могу да користе (већ радим на томе)

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

    Улазимо у басх, одакле одмах можемо да почнемо да лансирамо дечије контејнере.

  2. Покрените МиСКЛ:

    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. Идемо на лоцалхост у претраживачу, уверите се да сервер одговара „Хелло Ворлд!“

У мом случају, експеримент са угнежђеним Доцкер контејнерима се показао прилично позитивним и наставићу да развијам пројекат и користим га за постављање. Чини ми се да је ово много лакше решење од Кубернетеса и Џенкинса Кс. Али ово је моје субјективно мишљење.

Мислим да је то све за данашњи чланак. У следећем чланку ћу детаљније описати експерименте са рекурзивним покретањем Доцкер-а у Доцкер-у и монтирањем директоријума дубоко у угнежђене контејнере.

ПС Ако сматрате да је овај пројекат користан, дајте му звездицу на ГитХуб-у, поделите га и реците својим пријатељима.

ЕдитКСНУМКС Исправљене грешке, фокусирано на 2 видео снимка

Извор: ввв.хабр.цом

Купите поуздан хостинг за сајтове са ДДоС заштитом, ВПС ВДС сервере 🔥 Купите поуздан веб хостинг са DDoS заштитом, VPS VDS сервере | ProHoster