• ú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í
    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
    JON
    JON --- ---
    MISO: zkusil bych misto nejakyho commandu jen echo "prdel" >> /date.txt
    a problem muze byt v tom, ze cron nebude mit prava zapisu skoro nikam. Tak bych to daval do /pokus/date,txt a pripadne tomu /pokus menil prava.
    MISO
    MISO --- ---
    DANIELSOFT: diky za tip, bohuzial to nepomohlo :-/ skor asi nahradim distro alpine za nieco ine

    
    / # crontab -l
    * * * * * /bin/date >> /date.txt
    
    DANIELSOFT
    DANIELSOFT --- ---
    DANIELSOFT: u cronu to někdy tak je, že nemá "dobře" nasetované některé proměnné prostředí, důvod jsem teď línej hledat (bezpečnost?)
    DANIELSOFT
    DANIELSOFT --- ---
    MISO: možná date není v $PATH - co dát plnou cestu, např. /bin/date >> /foo.txt
    MISO
    MISO --- ---
    Ahoj, prosim o nakopnutie. Kde robim chybu? Spustim docker-compose up, kontajner sa spusti, z /var/log/crond.log i ps aux je zrejme, ze crond bezi, akurat /foo.txt sa vobec nevytvori. Vopred dakujem za vas cas.

    docker-compose.yml
    version: '2'
    
    services:
    
      cron:
          image: alpine:latest
          volumes:
              - ./etc/crontabs:/etc/crontabs
          command: crond -f -L /var/log/crond.log
    


    /etc/crontabs/root
    
    * * * * * date >> /foo.txt
    
    Kliknutím sem můžete změnit nastavení reklam