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
–rmzadat, že se má po ukončení smazat - parametrem
-itlze 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_NAMEnebodocker 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] . - každý krok vytváří novou layer, je proto dobré
- shlukovat RUN příkazdy jen do jednoho RUN
- dělat nejprve statické akce, aby šlo při dalším buildu používat předchozí layers
- například použít COPY až po instalaci dalších balíčků
- 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(LAGACY)- 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
- použít docker network
- upravuje přímo /etc/hosts?
Instead of $> docker run -d -P --name rethinkdb rethinkdb $> docker run -d --link rethinkdb:rethinkdb my-server you will now use $> docker network create --name my-network $> docker run -d -P --name rethinkdb1 --net=my-network rethinkdb $> docker run -d --net=my-network my-server
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
-vnezadá 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 COMMANDlze spustit libovolný příkaz v běžícím kontejneru docker inspect CONTAINER_NAMEvypíš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
- https://www.cloudsvet.cz/?p=198 (základy)
- https://www.cloudsvet.cz/?p=272 (docker compose)
docker.1647431649.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)
