Mysql
 sql >> база данни >  >> RDS >> Mysql

Съставяне на стека - Опростете внедряването на Docker на MySQL контейнери

Docker 1.13 въвежда дългоочаквана функция, наречена поддръжка на композитни файлове, която ни позволява да дефинираме нашите контейнери с приятен прост конфигурационен файл вместо с една дълга команда. Ако погледнете предишните ни публикации в блога „MySQL на Docker“, използвахме множество дълги командни редове, за да стартираме контейнери и услуги. Чрез използване на compose-file контейнерите се определят лесно за внедряване. Това намалява риска от човешка грешка, тъй като не е нужно да помните дълги команди с множество параметри.

В тази публикация в блога ще ви покажем как да използвате compose-file, като използваме прости примери около внедряването на MySQL. Предполагаме, че имате инсталиран Docker Engine 1.13 на 3 физически хоста и режимът Swarm е конфигуриран на всички хостове.

Въведение в Compose-File

Във файла Compose вие посочвате всичко във формат YAML, вместо да се опитвате да запомните всички аргументи, които трябва да предадем на командите на Docker. Тук можете да дефинирате услуги, мрежи и обеми. Определението ще бъде взето от Docker и много прилича на предаване на параметри от командния ред на командата „docker run|network|volume“.

Като въведение ще внедрим прост самостоятелен MySQL контейнер. Преди да започнете да пишете Compose файл, първо трябва да знаете командата run. Взети от нашата първа серия MySQL на Docker блогове, нека съставим следната команда „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

Командата docker-compose ще търси файл по подразбиране, наречен “docker-compose.yml” в текущата директория. Така че, нека първо създадем необходимите директории предварително:

$ mkdir -p ~/compose-files/mysql/single
$ mkdir -p /storage/docker/mysql-datadir
$ cd ~/compose-files/mysql/single

В YAML ето какво трябва да бъде написано:

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

Запазете горното съдържание в “~/compose-files/mysql/single/docker-compose.yml”. Уверете се, че сте в текущата директория ~/compose-files/mysql/single, след което я стартирайте, като изпълните следната команда:

$ 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

Проверете дали контейнерът работи в отделен режим:

[[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

Честито! Вече имаме MySQL контейнер, работещ само с една команда.

Разгръщане на стек

Compose-file опростява нещата, предоставя ни по-ясен поглед върху това как трябва да изглежда инфраструктурата. Нека създадем стек от контейнери, който се състои от уебсайт, работещ на Drupal, използващ MySQL екземпляр в специална мрежа и да ги свържем заедно.

Подобно на по-горе, нека да разгледаме версията на командния ред в правилния ред, за да изградим този стек:

$ 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

За да започнете да композирате, нека първо създадем директория за нашия нов стек:

$ mkdir -p ~/compose-files/drupal-mysql
$ cd ~/compose-files/drupal-mysql

След това създайте съдържание за писане на docker-compose.yml, както е показано по-долу:

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

Запалете ги:

$ 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 ще извърши внедряването, както следва:

  1. Създайте мрежа
  2. Създаване на обем
  3. Изтеглете изображения
  4. Създайте mysql-drupal (тъй като контейнерът „drupal“ зависи от него)
  5. Създайте контейнера drupal

В този момент нашата архитектура може да бъде илюстрирана по следния начин:

След това можем да посочим „mysql“ като хост на MySQL в страницата на съветника за инсталиране, тъй като и двата контейнера са свързани заедно. Това е. За да ги разрушите, просто изпълнете следната команда в същата директория:

$ docker-compose down

Съответните контейнери ще бъдат прекратени и съответно премахнати. Обърнете внимание, че командата docker-compose е обвързана с отделния физически хост, изпълняващ Docker. За да работи на множество физически хостове в Swarm, той трябва да бъде третиран по различен начин, като се използва команда „docker stack“. Ще обясним това в следващия раздел.

Severalnines MySQL на Docker:Как да контейнеризирате вашата база данни Открийте всичко, което трябва да разберете, когато обмисляте да стартирате услуга MySQL върху виртуализацията на Docker контейнер Изтеглете Бялата книга

Съставяне на стек в рояк

Първо, уверете се, че Docker двигателят работи на v1.13 и режимът Swarm е активиран и в състояние на готовност:

$ 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

За да използваме функцията за стека за режим Docker Swarm, трябва да използваме Docker Compose версия 3. Ще разположим настройка, подобна на горната, с изключение на настройка на Galera с 3 възли като бекенд на MySQL. Вече обяснихме подробно в тази публикация в блога.

Първо, създайте директория за нашия нов стек:

$ mkdir -p ~/compose-files/drupal-galera
$ cd ~/compose-files/drupal-galera

След това добавете следните редове в “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

Обърнете внимание, че изображението на Galera, което използвахме (severalnines/pxc56), изисква работещ etcd клъстер, инсталиран на всеки физически хост на Docker. Моля, вижте тази публикация в блога за необходимите стъпки.

Една от важните части в нашия файл за композиране е параметърът max_attempts в раздела restart_policy. Трябва да посочим твърдо ограничение за броя на рестартирането в случай на неуспех. Това ще направи процеса на внедряване по-безопасен, тъй като по подразбиране планировщикът на Swarm никога няма да се откаже в опитите си да рестартира контейнери. Ако това се случи, цикълът на процеса ще запълни дисковото пространство на физическия хост с неизползваеми контейнери, когато планировщикът не може да доведе контейнерите до желаното състояние. Това е често срещан подход при работа с услуги с поддържане на състоянието като MySQL. По-добре е да ги свалите напълно, отколкото да ги карате да работят в непоследователно състояние.

За да ги стартирате всички, просто изпълнете следната команда в същата директория, където се намира docker-compose.yml:

$ docker stack deploy --compose-file=docker-compose.yml my_drupal

Уверете се, че стекът е създаден с 2 услуги (drupal и galera):

$ docker stack ls
NAME       SERVICES
my_drupal  2

Можем също да изброим текущите задачи в създадения стек. Резултатът е комбинирана версия на командите “docker service ps my_drupal_galera” и “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

След като получим ТЕКУЩОТО СЪСТОЯНИЕ ИЗПОЛЗВАЩО, можем да започнем инсталацията на Drupal, като се свържем с който и да е от IP адреса или името на хоста на Docker на порт 8080, както в този случай използвахме docker3 (въпреки че контейнерът drupal е разположен на docker1), http ://192.168.55.113:8080/. Продължете с инсталацията и посочете „galera“ като хост MySQL и „drupal“ като име на базата данни (както е дефинирано във файла compose под променлива на средата MYSQL_DATABASE):

Това е. Разгръщането на стека беше опростено чрез използване на Compose-file. В този момент нашата архитектура изглежда така:

И накрая, за да премахнете стека, просто изпълнете следната команда:

$ docker stack rm my_drupal
Removing service my_drupal_galera
Removing service my_drupal_drupal
Removing network my_drupal_galera_net

Използването на compose-file може да ви спести време и да намали риска от човешка грешка в сравнение с работата с дълги командни редове. Това е идеален инструмент, който можете да овладеете, преди да работите с многоконтейнерни Docker приложения, работещи с множество среди за внедряване (например dev, test, staging, pre-prod, prod) и боравене с много по-сложни услуги, точно като MySQL Galera Cluster. Приятно контейнеризиране

!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да свиете/изчистите ibdata1 файл в MySQL

  2. Грешка в изготвения израз на mysql:MySQLSyntaxErrorException

  3. Извикване на съхранена процедура с изходен параметър чрез PDO

  4. Как да разделя низа на името в mysql?

  5. Как да се свържете с база данни с помощта на Sequel Pro