• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    ALMADDocker a kontejnery
    Docker aneb přístupný provoz kontejnerizovaných aplikací
    Docker(Hub), Compose, Swarm, boot2docker, DevOps, LXC, ECS, TumTum a jiné buzzwordy
    Bezpečnost v prostředí kontejnerů
    Related: automatizace [ Centralizovaná správa stanic a ostatních prvků v síti konfigurace/inventarizace/instalace/aktualizace/zalohovani ]
    rozbalit záhlaví
    MARTEN
    MARTEN --- ---
    REFLEX: Pro tohle musis menit CMD, ten se provede az po mountnuti volume. Muzes mit pak docker-compose pro dev a pro prod, nebo muzes extendovat, pripadne ridit pres env. Do docker-compose pridej neco takoveho, nebo cokoliv dalsiho:
    front:
      command: bash -c "yarn install && yarn start"
    

    Muzes si udelat i docker-compose.dev.yml, kde bude jen tenhle command a pak to spoustet docker-compose -f docker-compose.yml -f docker-compose.dev.yml up, ale za mne to neni uplne hezke.
    Radsi bych udelal bash script, ktery bude v CMD. V tom souboru budes mit if DEBUG == 1 nebo neco jineho, pak staci zapnout tohle dev (DEBUG == 1) pomoci DEBUG=1 docker-compose up.

    Jinak tenhle image bude docela dost velkej. Prvne by si mel kopirovat pouze package.json a lock soubor. Spustit install a pak nakopirovat zbytek, layery pak budou mensi. Stejne tak ENV a HOST dej na zacatek, run staci jen jeden, delej to jako tri commandy, ale pomoci &&.
    KING
    KING --- ---
    REFLEX: to co chces imho neni v docker compose, ale spis multi stage build Docker image - https://medium.com/capital-one-tech/multi-stage-builds-and-dockerfile-b5866d9e2f84
    REFLEX
    REFLEX --- ---
    Chtel bych pres docker compose

    1) buildil pro dev prostredi
    2) buildil pro produkci

    docker-compose.yml
    
    version: '3'
    
    services:
      front:
        build:
          context: ./front
        working_dir: /app
        command: yarn dev
        ports:
          - "3000:3000"
        volumes:
          -  ./front/:/app
    


    Dockerfile v front/
    
    FROM node:14.0.0-alpine3.11
    
    # Create app directory
    WORKDIR /app
    ADD . /app/
    
    # global install & update
    RUN yarn install
    
    RUN rm yarn.lock
    RUN yarn build
    
    ENV HOST 0.0.0.0
    EXPOSE 3000
    
    # start command
    CMD [ "yarn", "start" ]
    


    S dockerem jsem zacal dnes tak to asi neni uplne ok.

    Na devu potrebuju napojit /front/ na /app/ (tady jsem zjistil ze mountovani volumu je az po buildu takze vlastne nejde ten yarn install) - aby fungoval reloas pri upravach

    Na prod bude pouze COPY

    Jde to vyresit jednim docker-compose nebo mam pro kazde prostredi udelat zvlast?
    SH_PANDA
    SH_PANDA --- ---
    Kdyby nekdo mel zajem, tak hledame k nam nekoho na OpenShift Ops v DevOps ;) Na kratko = projekt na kontrakt i na dlouho (kontrakt nebo HPP). Praha nebo Ostrava. Pracovni doba hodne flexibilni. Jak moc to muze byt remote zalezi na duvere vedeni. Nasho dlouholetyho admina jsem videl asi tak 6x za rok, z toho 3x na team buildingu. Kdyztak posta.
    JON
    JON --- ---
    INDIAN: Mluvim spis o tom testovani - ze to bud budu testovat na docker kontejnerech coz ma svoje problemy, nebo budu muset vymyslet jak to testovat na virtualech, ale tam to neni tak dobre integrovane do toho CI (nebo aspon nevim o tom, ze by slo nejak snadno startovat VM z CI, mozna blbe hledam).
    INDIAN
    INDIAN --- ---
    JON: v cem myslis ze by gitlab CI mel delat vic? ja sem s nim docela spojenej - pouzivam ho treba docasne na provisioning bare metal serveru kterej neni uplne trivialni - nastaveni idrac + pripojeni spec. vytvorenyho ISO, deaktivace port-channel na 2 switchich, vlastni instalace systemu, nastaveni teamingu a opet nastaveni port-channels a zbejvajici provisioning.
    Jednoduchej .gitlab-ci.yml s vyhrazenym runnerem s pristupem do produkcni site, s kontejnerem s ansible (tahanej z registry) a vsechny playbooky sou v projektu, klice a hesla v secrets...
    z moji strany mu neni co vytknout z hlediska deploymentu...
    JON
    JON --- ---
    INDIAN: hezky. Ja si taky dovedu predstavit testovani tech ansiblich roli a playbooku na VM, ale museli bychom to nejak dodelat do gitlab CI, a to mi prijde jednodussi trochu si k tomu ucelu poohnout dockeri kontejnery, ale ma to sva uskali, no.
    INDIAN
    INDIAN --- ---
    JON: tehlech nesvaru sem si davno samo vedom, s kontejnerama pracuju denne.

    FYI (tl;dr) jedna se o platformu na simulaci/validaci konfiguraci sitovejch prvku od Arista... dodavaj komplexni lab na bootsraping a spravu konfiguraci jejich devices v podobe virtualnich masin, ktery je simulujou a lze tak si s tim hrat nez se to nacpe do fyzickejch switchu v produkci
    Prave ze nativne pouzivaj VM a ve veskerych prezentacich nam cpali pouze VM. O kontejnerech se vubec nezminovali, ja si mezitim nasel ze si s nima zacli hrat konecne taky, ovsem ofiko dokumentace (krom moznosti si stahnout image) nic extra nesdeluje (jen par blogu).
    Nastesti frajer od nich co ma nas na starosti je ochotnej a sam je autorem nekolika utilit co se tyce provisioningu, takze mi poslal par odkazu na projekty jejich lidi na githubu, takze uz se mam ceho chytit...
    Problem je v tom ze v pripade VM inicializace probiha pres boot (tak jako u switchu pres ZTP)... Nicmene prakticky de jenom mu nacpat zakladni konfiguraci - coz lze samo jednoduse u kontejneru vyresit bud dodatecnym provisioningem pres CLI nebo si buildnout novej image.
    (nehrabal bych se v tom tak a udelal to klidne dle jejich ofiko doporuceni na VM, ale mam pred sebou migraci cca 20 datacenter s celkovym poctem 300 devices, tak bych to rad mel vic pruznejsi)
    JON
    JON --- ---
    INDIAN: hele, klidne naznac jaks to vyresil. Jinak pracovat s kontejnerama jako s VM je rozsirenej nesvar - napr me to nakopalo s rozbehem naposled v pondeli. Rovnou pridam popis a dotaz:

    Popis:
    Cca pred rokem, kdyz jsme si zavedli nejake deploye pomoci ansible jsem spachal "jednoduchej" setup na testovani ansible roli:
    - Nastartuje se kontejner "playbook" s ansible , rolema a playbookama
    - Nastartuje se kontejner "target" s bezicim ssh a cistym systemem
    1) v playbook kontejneru se pusti ansible s tim s cim ma
    2) pytestem se overi, ze to udelalo to co melo
    3) jedna z veci co se overuje je, ze se do "targetu" nainstaloval docker, a pomoci docker-compose tam jde neco spustit a posloucha a odpovida to na nejakym portu.

    Mozna jsem tu o tom uz mluvil, ale narazel jsem na kokotsky problemy s tim, jak do tech kontejneru dostat ssh klice (aniz by musely byt zapeceny v image) - kdyz jsem si je vyzobaval z ENV v bashi, tak se tam objevovaly zalomeni radku atd.. nakonec jsem to vyresil pythonim skriptem, ktery se pousti pri startu kontejneru a ten ty netisknutelny znaky zpracovava OK.

    Ted, cca po roce, jsem to rozvrtal v ramci prechodu na python3, a ejhle - docker in docker uz neni co bejval - pri mountovani volume z docker-compose to padalo, protoze overlay nemuze slouzit jako backing container pro overlay - coz jiste pred tim cca rokem jeste slo.

    Dotaz:
    Napada vas, jak tohle elegantne resit?
    Volumovat do "targetu" socket hostitelskyho dockeru (aby to nebylo DinD, ale side by side) mi neprijde OK, pac chci otestovat i to, ze se tam tim ansiblem nainstaluje, a navic bude pritomnost toho socketu vadit pri te instalaci, ne?
    INDIAN
    INDIAN --- ---
    INDIAN: samozrejme ze se snazim podojit kozla s necim jako bootfile-name (facepalm) ... aneb kdyz se nekdo snazi pracovat s kontejnerama jako s VM (2xfacepalm)

    (reseni bez nutnosti pouziti DHCP nalezeno, takze sem to tu jen zbytecne zaplacal)
    INDIAN
    INDIAN --- ---
    RUDOLF: mno ja uz sem mezitim zjistil, ze nativne docker tuhle moznost vubec neumoznuje ...
    tyhle clanky sem uz videl taky, momentalne zkousim tenhle hack https://rollout.io/blog/connecting-docker-containers-to-production-network-ip-per-container/ a bouzel nedari se taky.

    Budu to muset principielne cely obejit bez DHCP
    RUDOLF
    RUDOLF --- ---
    INDIAN: nemám osobní zkušenost + otázka jestli jsem dobře porozuměl zadání. Jen jsem si přečetl dva texty. Přijde mi že ipam out of box neumí komunikovat s externím DHCP serverem.. Externí DHCP server řeší https://gist.github.com/nerdalert/3d2b891d41e0fa8d688c

    A tady text který mě tam navedl: http://hicu.be/docker-dhcp
    INDIAN
    INDIAN --- ---
    mam trochu specifickej pripad, potreboval bych radu ohledne macvlan kdy by nekdo vedel...

    snazim se dostat par kontejneru explicitne na do LAN... hlavne teda potrebuju aby si vyzadaly z lokalniho DHCP serveru IP, na kterym uz je ceka dle preddefinovanych MAC adres dany IP s konfiguraci (duvodem je jim injektovat konfiguraci pomoci bootfile-name).

    docker-compose.yml
    version: "2"
    
    services:
    
      ceoslab0:
        container_name: ceoslab0
        image: gitlab-registry.acme.com/network/arista-containers/ceosimage:latest
        privileged: true
        mac_address: "02:42:ac:1f:ee:00"
        networks:
          front:
    
      ceoslab1:
        container_name: ceoslab1
        image: gitlab-registry.acme.com/network/arista-containers/ceosimage:latest
        privileged: true
        mac_address: "02:42:ac:1f:ee:01"
        networks:
          front:
    
    
    networks:
      front:
        driver: macvlan
        driver_opts:
         parent: eth0
        ipam:
          config:
            - subnet: 172.16.96.0/23
              gateway: 172.16.96.1
              ip_range: 172.16.97.176/28
              aux_addresses: 
                router: 172.16.97.190
    

    A pak mu vytvorim interface:
    ip link add ceoslab link eth0 type macvlan mode bridge
    ip addr add 172.16.97.190/23 dev ceoslab
    ip link set ceoslab up
    ip route add 172.16.97.176/28 dev ceoslab 
    


    pri startu se ale na ten dhcp server venku vubec nedostane (pouze prideli nahodne adresu z uvedenyho intervalu):
    # docker exec -it ceoslab0 ip r
    default via 172.16.96.1 dev eth0 
    blackhole 127.0.0.0/8 proto gated scope nowhere 
    127.0.0.1 dev lo proto gated scope link src 127.0.0.1 
    172.16.96.0/23 dev eth0 proto kernel scope link src 172.16.97.185
    


    neresil nekdo neco podobnyho uz?
    HOUMLES
    HOUMLES --- ---
    nema nekdo zkusenost jak updatnout rucne vnitrni dns na swarmu? potreboval bych z nej smazat jeden zaznam, kterej patri sluzbe, ktera uz nebezi, ale balancer mi na ni porad preskakuje.
    nevim jak se mi to povedlo, ale je tam a musim za ho zbavit.
    bohuzel nemam moznost to cely resetovat a znovu spustit coz je mi jasny, ze by pomohlo.
    MLEKAR_STEIN
    MLEKAR_STEIN --- ---
    SPACEANGEL:
    jak pise MARTEN, extra hosts...

    mam to v praci, protoze je pozadavek mit db "na železe" aby byla db "stejně jako na produkci".

    v compose to je pro
    services:
        servicename:
            extra_hosts:
                - "jmenoserveru:10.20.30.40"
            hromadadlasichparametru....
    

    pro samotny docker parametr:
    --add-host [Hostname]:[IPAddress]
    
    MARTEN
    MARTEN --- ---
    SPACEANGEL: moznosti by bylo vic. docke ma virtualni sitovku, lze se tedy pripojovat pres ip hosta (v configu daemona), nebo pridat additional hosts a delat to pak pres name.
    pripadne by mohlo jit zmenit network na host.
    nebo asi skoro nejlepe rozbehnout mysql taky v dockeru. kdyz uz v nem bezi zbytek, pro neco mit mimo nej.
    SH_PANDA
    SH_PANDA --- ---
    SPACEANGEL: asi mam lepsi google fu. Nezkousel jsem, ale tohle vypada jako to co hledas https://forums.docker.com/t/accessing-host-machine-from-within-docker-container/14248
    SPACEANGEL
    SPACEANGEL --- ---
    ahoj, debilni dotaz, ale je mozny nejakej port v kontejneru presmerovat ven na hosta (proste obracene)?

    Konkretni situace: na hostitelskem pocitaci bezi mysql, a nekolik kontejneru s php. A me jde o to, aby skripty v tom kontejneru proste se pripojovali na localhost:1234 (cislo portu libivolne) a to bylo protunelovany na 3306 na tom hostilteskem.

    Jo, zkousel jsem googlit, ale moc jsem toho nevygooglil a jsem z toho takovej nemoudrej :)
    MISO
    MISO --- ---
    JON: ahoj, je to skutocne tak, jak vravis, vlastnik musi byt nastaveny na root:root. Skusal som i ine distra, tam sa to chovalo rovnako, tzn. nefungovalo. Dakujem tebe i ostatnym za vas cas.

    Riesenie pre docker compose je vlastny Dockerfile, kde sa spravne nastavia permissions.
    
    FROM alpine:latest
    COPY --chown=root:root ../etc/crontabs/root /etc/crontabs
    ENTRYPOINT crond -f -L /var/log/crond.log
    
    JON
    JON --- ---
    MISO:
    tl;dr; zkontrolovat ls -la /etc/crontabs/root uvnitr kontejneru, jestli patri rootovi a jestli ma prava 644

    Jak jsem si s tim hral:

    dovolil jsem si zmenit command v docker-compose na
    command: crond -f -d0
    abych pro cronlog nemusel lezt do kontejneru a logovalo to vic

    takhle vypadaj crontabs v cistym alpinu
    
    / # ls -la /etc/crontabs/root 
    -rw-------    1 root     root           318 Nov  5 21:58 /etc/crontabs/root
    


    takhle vypada obsah crontabu s namountovanym volume z docker-compose.yml (pote co jsem souboru ./etc/crontabs/root na host machine zmenil opravneni na 644 - na to je cron haklivej)
    
    / # ls -la /etc/crontabs/root
    -rw-r--r--    1 1000     1000            41 Nov  5 22:03 /etc/crontabs/root
    

    takze problem bude v tom, ze se do kontejneru neprevedl majitel souboru jako root, takze ho cron vyignoruje

    Kdyz jsem pak uvnitr kontejneru smazal /etc/crontabs/root a vytvoril si novej s tvym obsahem, tak zapisuje.
    Kdyz jsem na host machine chownul ./etc/crontabs/root na root a pak spustil docker-compose up, tak to zapisovalo.
    Kdyz jsem chownul v kontejneru /etc/crontabs/root na root pred prvnim wakeupem cronu, tak to zapisovalo.
    ALE! Kdyz jsem chownul v kontejneru /etc/crontabs/root na root az po prvnim wakupu cronu, tak uz si ho pamatoval jako vyignorovanej a nic neprobehlo. To je ale zdokumentovana vlastnost (nekterych) cronu.
    MISO
    MISO --- ---
    JON, MARTEN: cron bezi pod rootom, aj to echo som uz skusal :-/ skuste si to spustit, skutocne by mali stacit tie 2 subory. Subor z /etc/crontabs/root sa nalinkuje do /var/spool/cron, crontab -l vypise spravne nastavenie, len to proste neseje :)

    # ps aux
    PID   USER     TIME  COMMAND
        1 root      0:00 crond -f -L /var/log/crond.log
        6 root      0:00 sh
       18 root      0:00 ps aux
    
    MARTEN
    MARTEN --- ---
    v base containerech zadny cron vetsinou nebezi. takze bych kouknul, jestli tam je, dost bych se divil
    Kliknutím sem můžete změnit nastavení reklam