Сайт на Laravel. Урок 3. Docker Compose

docker compose

Привет! В прошлый раз мы установили Docker на виртуальную машину с CentOS 7. Сегодня продолжим настраивать удобное окружение для работы. Рассмотрим программу docker compose. Ее установку, возможности и преимущества.

Docker compose

Для работы готового веб приложения необходимо множество вещей. Как минимум: веб сервер, база данных, исполняемый код. А в процессе разработки используется еще больше дополнительных сервисов вроде composer, git, npm и других.

В прошлый раз мы посмотрели как запустить веб сервер с помощью docker и работать с ним. Мы бы могли запустить все необходимые компоненты системы в одном контейнере, но в таком случае все преимущества докера были бы недоступны. Тогда он стал бы еще одной виртуальной машиной внутри нашей виртуальной CentOS.

При использовании Docker принято разделять каждый сервис по отдельным контейнерам. Отдельный для вебсервера apache, еще один для вебсервера nginx, один для базы данных, и так далее.

Чтобы не создавать все контейнеры вручную, существует специальный инструмент и имя ему docker compose.

Docker Compose — это средство, разработанное для помощи в определении и совместном использовании многоконтейнерных приложений. С помощью средства Compose можно создать файл YAML для определения служб и с помощью одной команды запускать и останавливать все, что нужно.

Установка

Скачаем файлы docker compose с официального репозитория проекта с помощью curl.

curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64" -o /usr/local/bin/docker-compose

Создадим символьную строку и сделаем файл исполняемым

chmod +x /usr/local/bin/docker-compose

ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Теперь compose должен работать в системе. Проверить это можно с помощью ключа -v

docker-compose -v

docker-compose -v
docker-compose -v

Все работает, но как использовать программу для автоматизации создания контейнеров.

docker-compose.yaml

Создадим файл описания нашего окружения и опишем в нем все контейнеры, которые мы хотим иметь в распоряжении.

version: "2"
services:
www:
build: .
ports:
- "8001:80"
volumes:
- ./www:/var/www/html/
links:
- db
networks:
- default
db:
image: mysql
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: myDb
MYSQL_USER: user
MYSQL_PASSWORD: test
MYSQL_ROOT_PASSWORD: test
volumes:
- ./dump:/docker-entrypoint-initdb.d
- persistent:/var/lib/mysql
networks:
- default
phpmyadmin:
image: phpmyadmin/phpmyadmin
links:
- db:db
ports:
- 8000:80
environment:
MYSQL_USER: user
MYSQL_PASSWORD: test
MYSQL_ROOT_PASSWORD: test
volumes:
persistent:

В этом файле мы описываем контейнеры, которые нам нужны. А именно: сервис www с php и вебсервером apache, базой данных mysql и phpmyadmin для просмотра базы данных.

В том же каталоге создадим необходимые файлы и подкаталоги для нашей системы.

Во-первых, сервис www загружается из докерфайла. Создадим и запишем в него следущие строки.

FROM php:7.4-apache
RUN docker-php-ext-install mysqli

Таким образом мы создадим контейнер с вебсервером и интерпретатором php версии 7.4.

Для базы данных мы создали точку входа и теперь необходимо создать файл для нее.

Создадим подкаталог dump и файл myDb.sql со следующим содержанием в нем.

CREATE TABLE Person (
id int(11) NOT NULL,
name varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO Person (id, name) VALUES
(1, 'William'),
(2, 'Marc'),
(3, 'John');

Здесь мы создаем таблицу Person и заполняем ее тестовыми данными.

Осталось создать файл index.php в подкаталоге www для нашего вебсервера.

Наполнение может быть любым, но мы попробуем сразу обратиться к базе данных, чтобы проверить работу всех сервисов сразу.

<html>
 <head>
  <title>Hello...</title>
  <meta charset="utf-8"> 
</head>
<body>
    <div class="container">
    <?php echo "<h1>Hi! I'm happy</h1>"; ?>
    <?php
    $conn = mysqli_connect('db', 'user', 'test', "myDb");
    $query = 'SELECT * From Person';
    $result = mysqli_query($conn, $query);

    echo '<table class="table table-striped">';
    echo '<thead><tr><th>id</th><th>name</th></tr></thead>';
    while($value = $result->fetch_array(MYSQLI_ASSOC)){
        echo '<tr>';
        foreach($value as $element){
            echo '<td>' . $element . '</td>';
        }
        echo '</tr>';
    }
    echo '</table>';

    $result->close();
    mysqli_close($conn);
    ?>
    </div>
</body>
</html>

Запуск контейнеров

Когда все необходимые файлы конфигурации созданы. Докер готов к запуску.

Для этого используем команду

docker-compose up -d

Ключ -d освободит терминал для дальнейшего использования.

Когда все образы скачаются, а контейнеры запустятся на машине, мы сможем проверить работу системы с нашей хост машины. Зайдем по адресу виртуальной машины через браузер. Мы должны увидеть как отработает наш файл index.php

http://192.168.0.107:8001

Не забудьте, что мы указали 8001 порт для вебсервера.

Заключение

Таким образом мы создали почти все необходимое окружение для нашего laravel проекта с помощью простого файла docker compose. Теперь, если мы захотим создать точно такое же окружение на другой машине, например на боевом сервере, мы сможем взять этот файл настроек и воссоздать те же образы на другом сервере.

Каким образом копировать необходимые файлы с одного сервера на другой поговорим в следующий раз.

До того, как вы уйдете, посмотрите наши статьи и уроки про Ардуино. Например, подключение OLED дисплея к Ардуино.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *