Docker 1.13 zavádí dlouho očekávanou funkci zvanou compose-file support, která nám umožňuje definovat naše kontejnery pomocí pěkného jednoduchého konfiguračního souboru namísto jediného dlouhého příkazu. Pokud se podíváte na naše předchozí blogové příspěvky „MySQL na Dockeru“, ke spouštění kontejnerů a služeb jsme použili několik dlouhých příkazových řádků. Pomocí compose-file lze snadno určit kontejnery pro nasazení. To snižuje riziko lidské chyby, protože si nemusíte pamatovat dlouhé příkazy s více parametry.
V tomto příspěvku na blogu vám ukážeme, jak používat skládání souboru pomocí jednoduchých příkladů nasazení MySQL. Předpokládáme, že máte Docker Engine 1.13 nainstalovaný na 3 fyzických hostitelích a režim Swarm je nakonfigurován na všech hostitelích.
Úvod do Compose-File
V souboru Compose-file zadáte vše ve formátu YAML, na rozdíl od snahy zapamatovat si všechny argumenty, které musíme předat příkazům Dockeru. Zde můžete definovat služby, sítě a svazky. Definici převezme Docker a je to velmi podobné předávání parametrů příkazového řádku příkazu „docker run|network|volume“.
Na úvod nasadíme jednoduchý samostatný kontejner MySQL. Než začnete psát soubor Compose, musíte nejprve znát příkaz run. Převzato z naší první série blogů MySQL na Dockeru, pojďme sestavit následující příkaz „docker run“:
$ docker run --detach \
--name=test-mysql \
--publish 6603:3306 \
--env="MYSQL_ROOT_PASSWORD=mypassword" \
-v /storage/docker/mysql-datadir:/var/lib/mysql \
mysql
Příkaz docker-compose vyhledá v aktuálním adresáři výchozí soubor s názvem „docker-compose.yml“. Nejprve tedy nejprve vytvořte požadované adresáře:
$ mkdir -p ~/compose-files/mysql/single
$ mkdir -p /storage/docker/mysql-datadir
$ cd ~/compose-files/mysql/single
V YAML by mělo být napsáno zde:
version: '2'
services:
mysql:
image: mysql
container_name: test-mysql
ports:
- 6603:3306
environment:
MYSQL_ROOT_PASSWORD: "mypassword"
volumes:
- /storage/docker/mysql-datadir:/var/lib/mysql
Uložte výše uvedený obsah do „~/compose-files/mysql/single/docker-compose.yml“. Ujistěte se, že jste v aktuálním adresáři ~/compose-files/mysql/single, a poté jej spusťte spuštěním následujícího příkazu:
$ docker-compose up -d
WARNING: The Docker Engine you're using is running in swarm mode.
Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.
To deploy your application across the swarm, use `docker stack deploy`.
Creating test-mysql
Ověřte, zda kontejner běží v odpojeném režimu:
[[email protected] single]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
379d5c15ef44 mysql "docker-entrypoint..." 8 minutes ago Up 8 minutes 0.0.0.0:6603->3306/tcp test-mysql
Gratulujeme! Nyní máme kontejner MySQL spuštěný pomocí jediného příkazu.
Nasazení zásobníku
Compose-file věci zjednodušuje, poskytuje nám jasnější pohled na to, jak má infrastruktura vypadat. Vytvořme zásobník kontejnerů, který se skládá z webové stránky běžící na Drupalu, pomocí instance MySQL pod vyhrazenou sítí a propojíme je dohromady.
Podobně jako výše se podíváme na verzi příkazového řádku ve správném pořadí, abychom vytvořili tento zásobník:
$ docker volume create mysql_data
$ docker network create drupal_mysql_net --driver=bridge
$ docker run -d --name=mysql-drupal --restart=always -v mysql_data:/var/lib/mysql --net=drupal_mysql_net -e MYSQL_ROOT_PASSWORD="mypassword" -e MYSQL_DATABASE="drupal" mysql
$ docker run -d --name=drupal -p 8080:80 --restart=always -v /var/www/html/modules -v /var/www/html/profiles -v /var/www/html/themes -v /var/www/html/sites --link mysql:mysql --net=drupal_mysql_net drupal
Chcete-li začít skládat, nejprve vytvořte adresář pro náš nový zásobník:
$ mkdir -p ~/compose-files/drupal-mysql
$ cd ~/compose-files/drupal-mysql
Poté vytvořte obsah zápisu docker-compose.yml podle níže uvedeného:
version: '2'
services:
mysql:
image: mysql
container_name: mysql-drupal
environment:
MYSQL_ROOT_PASSWORD: "mypassword"
MYSQL_DATABASE: "drupal"
volumes:
- mysql_data:/var/lib/mysql
restart: always
networks:
- drupal_mysql_net
drupal:
depends_on:
- mysql
image: drupal
container_name: drupal
ports:
- 8080:80
volumes:
- /var/www/html/modules
- /var/www/html/profiles
- /var/www/html/themes
- /var/www/html/sites
links:
- mysql:mysql
restart: always
networks:
- drupal_mysql_net
volumes:
mysql_data:
networks:
drupal_mysql_net:
driver: bridge
Zapalte je:
$ docker-compose up -d
..
Creating network "drupalmysql_drupal_mysql_net" with driver "bridge"
Creating volume "drupalmysql_mysql_data" with default driver
Pulling drupal (drupal:latest)...
..
Creating mysql-drupal
Creating drupal
Docker provede nasazení následovně:
- Vytvořit síť
- Vytvořte objem
- Vytáhněte obrázky
- Vytvořte mysql-drupal (protože kontejner „drupal“ je na něm závislý)
- Vytvořte kontejner drupal
V tomto bodě lze naši architekturu ilustrovat následovně:
Poté můžeme na stránce průvodce instalací zadat „mysql“ jako hostitele MySQL, protože oba kontejnery jsou propojeny. A je to. Chcete-li je zrušit, jednoduše spusťte následující příkaz ve stejném adresáři:
$ docker-compose down
Odpovídající kontejnery budou odpovídajícím způsobem ukončeny a odstraněny. Vezměte na vědomí, že příkaz docker-compose je vázán na jednotlivého fyzického hostitele, na kterém běží Docker. Aby bylo možné spustit na více fyzických hostitelích napříč Swarm, je třeba s ním zacházet odlišně pomocí příkazu „docker stack“. To si vysvětlíme v další části.
Několik ninek MySQL na Dockeru:Jak kontejnerizovat databáziZjistěte vše, co potřebujete pochopit, když zvažujete spuštění služby MySQL nad virtualizací kontejnerů DockerStáhněte si bílou knihuSkládání balíčku napříč rojem
Nejprve se ujistěte, že Docker engine běží na verzi 1.13 a je povolen režim Swarm a je v připraveném stavu:
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
8n8t3r4fvm8u01yhli9522xi9 * docker1.local Ready Active Reachable
o1dfbbnmhn1qayjry32bpl2by docker2.local Ready Active Reachable
tng5r9ax0ve855pih1110amv8 docker3.local Ready Active Leader
Abychom mohli použít funkci zásobníku pro režim Docker Swarm, musíme použít formát Docker Compose verze 3. Chystáme se nasadit nastavení podobné výše uvedenému, kromě 3uzlového nastavení Galera jako backend MySQL. Podrobnosti jsme již vysvětlili v tomto příspěvku na blogu.
Nejprve vytvořte adresář pro náš nový zásobník:
$ mkdir -p ~/compose-files/drupal-galera
$ cd ~/compose-files/drupal-galera
Poté přidejte následující řádky do „docker-compose.yml“:
version: '3'
services:
galera:
deploy:
replicas: 3
restart_policy:
condition: on-failure
delay: 30s
max_attempts: 3
window: 60s
update_config:
parallelism: 1
delay: 10s
max_failure_ratio: 0.3
image: severalnines/pxc56
environment:
MYSQL_ROOT_PASSWORD: "mypassword"
CLUSTER_NAME: "my_galera"
XTRABACKUP_PASSWORD: "mypassword"
DISCOVERY_SERVICE: '192.168.55.111:2379,192.168.55.112:2379,192.168.55.207:2379'
MYSQL_DATABASE: 'drupal'
networks:
- galera_net
drupal:
depends_on:
- galera
deploy:
replicas: 1
image: drupal
ports:
- 8080:80
volumes:
- drupal_modules:/var/www/html/modules
- drupal_profile:/var/www/html/profiles
- drupal_theme:/var/www/html/themes
- drupal_sites:/var/www/html/sites
networks:
- galera_net
volumes:
drupal_modules:
drupal_profile:
drupal_theme:
drupal_sites:
networks:
galera_net:
driver: overlay
Všimněte si, že obraz Galera, který jsme použili (několik řádků/pxc56), vyžaduje spuštěný cluster etcd nainstalovaný na každém fyzickém hostiteli Dockeru. Přečtěte si prosím tento blogový příspěvek o nezbytných krocích.
Jednou z důležitých částí našeho souboru compose-file je parametr max_attempts v sekci restart_policy. Musíme určit pevný limit na počet restartů v případě selhání. Díky tomu bude proces nasazení bezpečnější, protože plánovač Swarm se ve výchozím nastavení nikdy nevzdá pokusu o restartování kontejnerů. Pokud k tomu dojde, procesní smyčka zaplní diskový prostor fyzického hostitele nepoužitelnými kontejnery, když plánovač nemůže kontejnery uvést do požadovaného stavu. Toto je běžný přístup při práci se stavovými službami, jako je MySQL. Je lepší je srazit úplně, než je nechat běžet v nekonzistentním stavu.
Chcete-li je všechny spustit, stačí provést následující příkaz ve stejném adresáři, kde je umístěn docker-compose.yml:
$ docker stack deploy --compose-file=docker-compose.yml my_drupal
Ověřte, že je zásobník vytvořen pomocí 2 služeb (drupal a galera):
$ docker stack ls
NAME SERVICES
my_drupal 2
Můžeme také vypsat aktuální úkoly ve vytvořeném zásobníku. Výsledkem je kombinovaná verze příkazů „docker service ps my_drupal_galera“ a „docker service ps my_drupal_drupal“:
$ docker stack ps my_drupal
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
609jj9ji6rxt my_drupal_galera.1 severalnines/pxc56:latest docker3.local Running Running 7 minutes ago
z8mcqzf29lbq my_drupal_drupal.1 drupal:latest docker1.local Running Running 24 minutes ago
skblp9mfbbzi my_drupal_galera.2 severalnines/pxc56:latest docker1.local Running Running 10 minutes ago
cidn9kb0d62u my_drupal_galera.3 severalnines/pxc56:latest docker2.local Running Running 7 minutes ago
Jakmile získáme AKTUÁLNÍ STAV jako RUNNING, můžeme spustit instalaci Drupalu připojením k libovolné IP adrese hostitele Docker nebo názvu hostitele na portu 8080, jako v tomto případě jsme použili docker3 (ačkoli kontejner drupal je nasazen na docker1), http ://192.168.55.113:8080/. Pokračujte v instalaci a zadejte ‚galera‘ jako hostitele MySQL a ‚drupal‘ jako název databáze (jak je definováno v souboru compose-file pod proměnnou prostředí MYSQL_DATABASE):
A je to. Nasazení zásobníku bylo zjednodušeno pomocí Compose-file. V tuto chvíli naše architektura vypadá asi takto:
Chcete-li odstranit zásobník, stačí spustit následující příkaz:
$ docker stack rm my_drupal
Removing service my_drupal_galera
Removing service my_drupal_drupal
Removing network my_drupal_galera_net
Použití compose-file vám může ušetřit čas a snížit riziko lidské chyby ve srovnání s prací s dlouhými příkazovými řádky. Jedná se o perfektní nástroj, který si osvojíte, než budete pracovat s vícekontejnerovými aplikacemi Docker, zabývat se více prostředími nasazení (např. vývoj, test, staging, pre-prod, prod) a manipulovat s mnohem složitějšími službami, stejně jako MySQL Galera Cluster. Šťastné používání kontejnerů
!