Продолжаем настройку кластера swarm.
В этой статье мы попробуем добавить сервер mysql к уже существующему стэку Docker Swarm.
Для правильного понимания статьи, необходимо ознакомится с её первой частью ссылка.
Итак, ранее мы развернули наше приложение в Docker Swarm совместно с Nginx, PHP. Дальше без mysql невозможно работать.
Поэтому, нам необходим обновленный образ (image) Docker для PHP, который будет содержать расширения для работы с базой данной и образ Mysql.
Итак, перейдем в директорию
cd /root/swarmtest/
vi docker-compose.yml
добавим к уже существующим секциям:
database:
container_name: database
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: my-secret-pw
MYSQL_ROOT_HOST: "%"
MYSQL_DATABASE: swtest_docker
MYSQL_USER: swtest
MYSQL_PASSWORD: swtest
ports:
- '4307:3306'
deploy:
replicas: 1
placement:
constraints:
- "node.labels.TAG==prod"
volumes:
- ./data/mysql:/var/lib/mysql
Этот код добавит последнюю версию mysql в ваш docker swarm стэк.
Единственное, я добавил новый ярлык к одному из серверов «node.labels.TAG==prod», как это делать описано в первой части – ссылка.
Так же необходим новый образ для PHP:
php:
image: docker-test_php:latest
ports:
- 9001:9001
deploy:
replicas: 2
resources:
limits:
cpus: '0.1'
memory: 200M
volumes:
#- /mnt:/var/www
- /gluster/volume1/www:/var/www
На локальном хосте у меня имелся готовый php образ «docker-test_php:latest».
Вы можете создать его на локальном хосте, затем экспортировать на сервер и импортировать в docker на хосте manager к уже существующим образам (image).
Вот файл, из которого собирался образ «docker-test_php:latest»:
FROM php:8.2-fpm
RUN apt update \
&& apt install -y zlib1g-dev g++ git libicu-dev zip libzip-dev libmagickwand-dev libmagickcore-dev \
libxml2-dev \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install intl opcache pdo pdo_mysql gd soap \
&& pecl install apcu \
&& docker-php-ext-enable apcu \
&& docker-php-ext-configure zip \
&& docker-php-ext-install zip \
&& docker-php-ext-install exif \
&& pecl install imagick \
&& docker-php-ext-enable imagick \
&& docker-php-ext-install sysvmsg \
&& docker-php-ext-install sysvsem \
&& docker-php-ext-install sysvshm \
&& docker-php-ext-configure sysvmsg --enable-sysvmsg \
&& docker-php-ext-configure sysvsem --enable-sysvsem \
&& docker-php-ext-configure sysvshm --enable-sysvshm
RUN cd /usr/local/etc/php/conf.d/ && \
echo 'memory_limit = -1' >> /usr/local/etc/php/conf.d/docker-php-ram-limit.ini
RUN apt-get update && apt-get install -y nodejs \
-y npm \
&& npm install --global yarn
WORKDIR /var/www/docker-test
Команда экспорта образа docker:
docker save -o <filename>.tar <image_name>
Команда импорта:
docker load < my-php-container.tar
После того как вы добавили этот образ на manager хост, можно убедиться в этом командой:
docker image list (docker images)
Для удаления стэка
docker stack rm swarmtest
Для запуска стэка (необходимо находится в той же директории что и файл docker-compose.yml)
docker stack deploy --compose-file docker-compose.yml
Для добавления mysql необходимо создать таблицу.
Для настройки авторизации на сервере mysql:
environment:
MYSQL_ROOT_PASSWORD: my-secret-pw
MYSQL_ROOT_HOST: "%"
MYSQL_DATABASE: swtest_docker
MYSQL_USER: swtest
MYSQL_PASSWORD: swtest
Не забывайте, что проверить где находится сервис можно используя команду «docker conatainer ls»:
Давайте зайдем на сервер mysql используя команду:
docker exec -it swarmtest_database.1.yjclod78lq6c6ak0z4uu0a4mt bash
Сейчас в базе данных swtest_docker нет таблиц. Пароль root у нас исходя из настроек “my-secret-pw”. Вам будет предложено ввести временный пароль. Используйте тот, который вы указали в переменной окружения MYSQL_ROOT_PASSWORD.
Создадим одну таблицу.
CREATE TABLE `Staff` (
`id` int DEFAULT NULL,
`name` varchar(255) NOT NULL,
`position` varchar(30) DEFAULT NULL,
`birthday` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Внесём данные:
LOCK TABLES `Staff` WRITE;
INSERT INTO `Staff` VALUES (1,'Alex','2','2024-09-26');
UNLOCK TABLES;
Сейчас вам станет доступным вывод из mysql из скрипта index.php.
<?php
echo '<html><head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body><div class="container">';
echo '<h2>Hello title</h2>';
echo '<p>Hello body <br/>';
echo '<p style="float:left;">
<img src="http://eapsite.ru/benjamin-voros-phIFdC6lA4E-unsplash.jpg" alt="Featued image for: Tutorial: Deploy a Full-Stack Application to a Docker Swarm" width="620" height="414"></p>
';
try {
$dbh = new PDO('mysql:dbname=swtest_docker;host=0.0.0.0:4307', 'swtest', 'swtest');
} catch (PDOException $e) {
die($e->getMessage());
}
$sth = $dbh->prepare("SELECT * FROM `Staff` WHERE `id` = ?");
$sth->execute(array('1'));
$array = $sth->fetch(PDO::FETCH_ASSOC);
function getUserIP()
{
// Get real visitor IP behind CloudFlare network
if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
$_SERVER['HTTP_CLIENT_IP'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
}
$client = @$_SERVER['HTTP_CLIENT_IP'];
$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
$remote = $_SERVER['REMOTE_ADDR'];
if(filter_var($client, FILTER_VALIDATE_IP))
{
$ip = $client;
}
elseif(filter_var($forward, FILTER_VALIDATE_IP))
{
$ip = $forward;
}
else
{
$ip = $remote;
}
return $ip;
}
$user_ip = getUserIP();
echo '<div style="clear:both;"><h2>Mysql</h2></div>';
echo '<br/>';
echo $user_ip; // Output IP address [Ex: 177.87.193.134]
//
echo '<br/>';
echo 'id ' . $array['id'] . '<br/>';
echo 'name ' . $array['name'] . '<br/>';
echo 'birthday ' . $array['birthday'] . '<br/>';
echo '<pre>';
print_r($_SERVER);
echo '</pre>';
echo '</div></body></html>
Скрипт имеет много лишнего. Но мы постараемся объяснить зачем это в нём содержится в следующей статье, в которой добавим прокси сервер "Traefik" ко всему ранее созданному и настроим его для совместной работы с Docker Swarm.
После этого, у Вас должна отображаться примерно следующая страница:
26 просмотров
Взаимосвязанные материалы
Продолжаем настройку кластера Swarm. В этой статье мы попробуем добавить Traefik к уже существующему стэку Docker Swarm. читать...
Docker Swarm и Nginx, PHP. Вебсервер в кластере Docker Swarm. Часть 2. Mysql. В этой статье мы попробуем добавить сервер mysql к уже существующему стэку Docker Swarm. читать...
С помощью Docker можно быстро развернуть рабочее web приложение с различными настройками и версиями. Docker Swarm выступает инструментом «оркестрации» контейнеров Docker, который позволяет управлять контейнерами как единое целое. читать...
Итак. Для чего он нужен. Он необходим для быстрого развертывания однообразного окружения для разработки разных приложений, к примеру на php и mysql о чем мы будем говорить далее. читать...