sql >> Databáze >  >> RDS >> Mysql

Skládání zásobníku – Zjednodušte nasazení kontejnerů MySQL v Dockeru

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ě:

  1. Vytvořit síť
  2. Vytvořte objem
  3. Vytáhněte obrázky
  4. Vytvořte mysql-drupal (protože kontejner „drupal“ je na něm závislý)
  5. 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 knihu

Sklá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ů

!


  1. 2 Funkce, které vrací měsíc od data v Oracle

  2. Ověření e-mailu TSQL (bez regulárního výrazu)

  3. Jak povolit všechna omezení CHECK a cizích klíčů pro tabulku na serveru SQL (příklady T-SQL)

  4. Chyba při vytváření prostorové databáze. CHYBA:nelze načíst knihovnu /usr/pgsql-9.1/lib/rtpostgis-2.0.so