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 ще извърши внедряването, както следва:
- Създайте мрежа
- Създаване на обем
- Изтеглете изображения
- Създайте mysql-drupal (тъй като контейнерът „drupal“ зависи от него)
- Създайте контейнера 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. Приятно контейнеризиране
!