Uživatelské nástroje

Nástroje pro tento web


docker

Toto je starší verze dokumentu!


Docker

Základy

  • image
    • obsahuje celé prostředí, což je vlastně souborový systém
    • seznam lokálních images docker images
    • img lze odstranit přes docker rmi <[REPOSITORY[:TAG]] | IMAGE_ID>
    • pokud je na image navázán nějaký kontejner, je třeba přidat force přes -f
  • container
    • instance image
    • měl by být jednoúčelový (aplikace nebo databáze, ne obojí v jednom)
    • vytvoří se prvním spuštěním docker run [–name CONTAINER_NAME] <REPOSITORY[:TAG]> [CMD_INSIDE]
    • jakmile doběhne příkaz, ukončí se, ale zůstává v systému.
      • při spuštění lze rovnou parametrem –rm zadat, že se má po ukončení smazat
      • parametrem -it lze zapnout interaktivní režim (čte STDIN)
    • spuštěné lze vypsat přes docker ps
    • všechny existující přes docker ps -a
    • ukončit lze přes docker stop CONTAINER_NAME nebo docker kill CONTAINER_NAME
    • všechny změny v conteiner jsou perzistentní
    • změněné soubory lze vypsat přes docker diff <CONTAINER_NAME>
    • container je možné smazat docker rm <CONTAINER_NAME>
    • z container lze vytvořit image přes docker commit <CONTAINER_NAME> <NEW_IMAGE_NAME>
      • ve skutečnosti je se tomu neříká name ale [REPOSITORY[:TAG]]
  • Dockerfile
    • skript popisující jak sestavit vlastní obraz
    • image se vytvoří přes docker build -t REPOSITORY[:TAG] .
  • docker-compose.yml
    • popisuje jak vytvořit více kontejnerů najednou
    • zpracovává docker-compose napsaný v python (pip install docker-compose)
  • entrypoint
    • definuje, co je proces s PID 1 při spuštění kontejneru
    • pokud není definován, použjije se /bin/sh -c
    • COMMAND slouží jako další parametr k entrypoint. U default entry point jde tedy o /bin/sh -c COMMAND

Komunikace mezi kontejnery

  • přes klasický socket
    • jeden kontejner otevře port, druhý se na něj připojí
    • je potřeba znát čisla portu, IP adresu, …
  • s využitím –link
    • pokud běží oba kontejnery na stejném hostovi
    • při spouštění kontejneru1 se zadaným link na běžící kontejner2 se do env kontejneru1 nastaví informace o kontejneru2 (jeho IP, otevřené porty, …)
root@baridell:/home/bari/tmp/docker1# docker run --rm debian env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=4c5bf135fdbe
HOME=/root
root@baridell:/home/bari/tmp/docker1# docker run --rm --link run1 debian env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=738ad8b05c57
RUN1_PORT=tcp://172.17.0.2:80
RUN1_PORT_80_TCP=tcp://172.17.0.2:80
RUN1_PORT_80_TCP_ADDR=172.17.0.2
RUN1_PORT_80_TCP_PORT=80
RUN1_PORT_80_TCP_PROTO=tcp
RUN1_NAME=/boring_kirch/run1
HOME=/root

Volume kontejnery

  • připojení adresáře z hostitele do kontejneru
    • aplikace a data by neměla být v jednom kontejneru
    • data mohou být na hostiteli a připojena do kontejneru, není to ale doporučováno, protože to porušuje zapouzdření, hodí se spíš pro testování
cloudsvet@ubuntu:~$ mkdir hostdata
cloudsvet@ubuntu:~$ touch hostdata/data.txt
cloudsvet@ubuntu:~$ docker run --rm -it -v ~/hostdata/:/mojedata debian bash
root@f5c011e9716b:/# ls mojedata/
data.txt
  • lze udělat volume kontejnér, který si pak mohou připojovat ostatní kontejnery
    • ostatní mají závislost na tomto kontejneru, ne na hostu
    • ale vlastní volume kontejner stejně je propojen s host file systémem (nejsou v kontejneru)
    • pokud se u parametru -v nezadá explicitní adresář na hostovi, vytvoří se náhodně vygenerovaný někde v hostitelském systému
// vytvoříme volume kontejner, nemusí se ani spouštět. Může to byt jen busybox.
docker create -v /mojedata --name mujdatacont busybox

// takhle ho pak použijeme
docker run -it --rm --volumes-from mujdatacont debian bash

Příklady

Wordpress

  • jeden kontejnér pro data pro mysql
  • jeden pro mysql
  • jeden pro worpress aplikaci
  • jeden pro data wordpress
  • docker-compose.yml vypadá takto:
 
data_mysql:
    image: busybox
    volumes:
     - /var/lib/mysql
 
data_wp:
    image: busybox
    volumes:
     - /var/www/html/
 
wordpress:
    image: wordpress
    volumes_from:
     - data_wp
    links:
     - mysql
    environment:
     - WORDPRESS_DB_PASSWORD=heslo
    ports:
     - "8080:80"
mysql:
    image: mysql:5.7
    volumes_from:
     - data_mysql
    environment:
     - MYSQL_ROOT_PASSWORD=heslo
     - MYSQL_DATABASE=wordpress

Ladění

  • logy lze prohlédnout přes docker logs CONTAINER_NAME
  • případně se dá připojit na spuštěný contejner přes docker attach CONTAINER_NAME
    • bacha, po CTRL+C se container ukončí
    • detach se dělá přes ctrl-p ctrl-q
  • přes docker exec CONTAINER_NAME COMMAND lze spustit libovolný příkaz v běžícím kontejneru
  • docker inspect CONTAINER_NAME vypíše všechny informace o kontejneru jako například s jakým env byl spuštěn, co je entrypoint, kde jsou datové soubory na hostovi, kde jsou logy…

Zdroje

docker.1647004443.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki