Разгръщане на PHP приложение с помощта на Docker-compose

PHP приложенията обикновено се съставят от уеб сървър, система за релационна база данни и самия езиков интерпретатор. В този урок ще използваме пълен стек от PHP приложения с помощта на docker. Това е задълбочен урок, в който ще изградим и организираме контейнери за Nginx (уеб сървъра), MySQL (системата на база данни) и PHP.

В името на този урок ще напишем просто приложение, което чете списък с градове от база данни и го показва на уеб страница, като по този начин ще демонстрираме основно, но работещо PHP приложение.

Това ръководство предполага, че вече имате инсталиран Docker-CE и поне минимални работни познания за docker. По този въпрос можете да прегледате следните уроци:

Конфигуриране на нашата работна среда

Приложението, базирано на докер в реалния живот, обикновено се състои от няколко контейнера. Ръчното им управление може лесно да стане доста объркано и тромаво. Това е мястото, където docker-compose влиза в игра. Той ви помага да управлявате редица контейнери чрез прост yamlконфигурационен файл.

Инсталирайте docker-compose.

curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Създайте папка, в която да съхранявате всички необходими файлове от този пример и след това cdв нея. Оттук нататък това е нашата работна директория и всяка команда ще се изпълнява в тази папка и всеки път ще бъде препратен спрямо нея. Тази папка може да бъде посочена по-късно като WORKING_DIR.

mkdir ~/docker
cd ~/docker

Сега създайте още три папки.

mkdir php nginx app

В phpпапката е мястото, където ще се изгражда нашия обичай PHP изображение на nginxпапката ще проведе необходимите файлове за нашия обичай Nginx образ и appпапката е мястото, където ще бъде въвеждането на изходния код и конфигурацията на нашата извадка приложение.

Конфигуриране на PHP контейнера

В този пример ще използваме php-fpmза свързване с уеб сървъра на Nginx. Ще използваме официалното базово изображение на PHP. Въпреки това, ние също трябва да инсталираме и активираме някои разширения, за да имаме достъп до базата данни. Вътре в phpпапката създайте файл с име Dockerfileи поставете следното съдържание в него.

FROM php:7.1-fpm-alpine3.4
RUN apk update --no-cache \
    && apk add --no-cache $PHPIZE_DEPS \
    && apk add --no-cache mysql-dev \
    && docker-php-ext-install pdo pdo_mysql

Имайте предвид, че използваме алпийската версия на официалното изображение на PHP. Alpine е много малка дистрибуция, насочена към контейнери, като осигурява много по-малки отпечатъци. Също така, имайте предвид използването на командата docker-php-ext-install, официалното изображение на PHP предоставя тази команда, за да улесни процеса на инсталиране и конфигуриране на PHP разширения.

Сега, нека изградим това изображение на Docker, като издадем следното (вътре в нашия WORKING_DIR):

docker build -t vultr-php php/

В docker-compose.ymlдосието

Както вече споменахме, docker-composeви позволява да управлявате редица контейнери чрез прост конфигурационен файл. Този конфигурационен файл обикновено се нарича docker-compose.yml. Създайте този файл в appпапката.

touch app/docker-compose.yml

Сега поставете следното съдържание в този файл.

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app

Ще обясним този синтаксис. Първо, обърнете внимание на първия ред.

version: '2'

Това указва версията на използвания docker-compose.ymlконфигурационен файл. Следващият ред указва услугите, или с други думи, контейнерите, които трябва да бъдат предоставени.

services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app

Имайте предвид, че всяка услуга има специфичен ключ вътре в servicesблока. Посоченото тук име ще се използва за препратка към този конкретен контейнер по-късно. Също така имайте предвид, че вътре в phpконфигурацията ние дефинираме изображението, използвано за стартиране на контейнера (това е изображението, което изградихме по-рано). Ние също така дефинираме картографиране на обема.

volumes:
  - ./:/app

Това казва docker-composeда се съпостави текущата директория ( ./) с /appдиректорията вътре в контейнера. Последният ред задава /appпапката вътре в контейнера като работна директория, което означава, че това е папката, от която по подразбиране се изпълняват всички бъдещи команди в контейнера.

Вече можем да организираме нашите контейнери.

cd ~/docker/app
docker-compose up -d

Можете да изпълните следната команда, за да сте сигурни, че PHP контейнерът е изпълнен:

docker ps

Как да изпълнявате команди вътре в контейнерите

Все още в appпапката, можем да изпълним всяка команда в дефиниран контейнер за услуги с помощта на docker-composeкомандата.

docker-compose exec [service] [command]

Най- [service]заместител се отнася до сервизния ключ. В нашия случай това беше php. Нека изпълним команда вътре в контейнера, за да проверим нашата PHP версия.

docker-compose exec php php -v

Ще видите следния изход.

PHP 7.1.14 (cli) (built: Feb  7 2018 00:40:45) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

Конфигуриране на контейнера Nginx

Точно като PHP контейнера, трябва да създадем персонализирано изображение за уеб сървъра. Но в този случай просто трябва да предоставим конфигурация за нашия virtual host. Уверете се, че сте вътре в нашата WORKING_DIRи създайте Dockerfileвътре в nginxпапката:

cd ~/docker
touch nginx/Dockerfile

Сега поставете следното съдържание в това Dockerfile:

FROM nginx:1.13.8-alpine
COPY ./default.conf /etc/nginx/conf.d/default.conf

Ние използваме изображението по подразбиране на Nginx, базирано на Alpine. В този файл на Docker ние просто копираме конфигурационен файл в настройката на нашето приложение. Преди да създадете това изображение, създайте конфигурационен файл.

touch nginx/default.conf

Сега го попълнете с това съдържание.

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /app;
    index index.php;

    #server_name server_domain_or_IP;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Имайте предвид, че на fastcgi_pass php:9000реда препращаме PHP контейнера по неговото име в serviceблока на docker-compose.ymlконфигурационния файл. Вътрешно docker-composeсъздава мрежа и присвоява името на услугата като име на хост на всяка от дефинираните услуги. Вече можем да изградим изображението на Nginx.

docker build -t vultr-nginx nginx/

Актуализиране docker-compose.yml

Сега актуализирайте app/docker-compose.ymlфайла.

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app
  web:
    image: vultr-nginx
    volumes:
      - ./:/app
    depends_on:
      - php
    ports:
      - 80:80

Добавихме само нова услуга. Конфигурацията е почти същата, с изключение на следното.

depends_on:
  - php
ports:
  - 80:80

Once the Nginx container needs the PHP service to be fully initialized, we force this requirement in the depends_on option. The ports configuration key maps a host port to a container port, here we map the port 80 in the host to the port 80 in the container.

Now create a file called index.php inside the app folder and put the following in it.

<?php phpinfo();

Make sure the port 80 is accessible through your firewall and execute the following.

cd ~/docker/app
docker-compose up -d

Once again, double check that the service is up.

docker ps

Open a browser and access [vultr-instance-ip]. You may find out your Vultr instance IP address by running the following.

hostname -I

You will see the PHP info page.

Configuring the MySQL container

The official MySQL image allows you to configure the container through simple environment variables. This can be done with an environment option inside the service block definition. Update the ~/docker/app/docker-compose.yml file to the following.

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app
  web:
    image: vultr-nginx
    volumes:
      - ./:/app
    depends_on:
      - php
    ports:
      - 80:80
  mysql:
    image: mysql:5.7.21
    volumes:
      - ./:/app
      - dbdata:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=world
      - MYSQL_ROOT_PASSWORD=root
    working_dir: /app
volumes:
  dbdata:

Now we've defined a new service for the database. Notice the line dbdata:/var/lib/mysql. This mounts the path on the container /var/lib/mysql to a persistent volume managed by Docker, this way the database data persists after the container is removed. This volume needs to be defined in a top-level block as you can see in the end of the file.

Преди да организираме нашата нова конфигурация, нека изтеглим примерна база данни на MySQL. В официалната документация MySQL предоставя някои примерни бази данни. Ще използваме добре познатата световна база данни. Тази база данни предоставя списък на държави и градове. За да изтеглите тази проба, изпълнете следното в папката на нашето приложение.

curl -L http://downloads.mysql.com/docs/world.sql.gz -o world.sql.gz
gunzip world.sql.gz

Сега нека организираме нашите контейнери.

docker-compose up -d

Както може би вече сте забелязали, docker-compose upкомандата стартира само контейнерите, които все още не са стартирани. Той проверява за разликите между вашия docker-compose.ymlфайл и текущата конфигурация на работещи контейнери.

Още веднъж проверете дали MySQL контейнерът е стартиран.

docker ps

Сега попълнете световната база данни.

docker-compose exec -T mysql mysql -uroot -proot world < world.sql

Можете да проверите дали базата данни е попълнена, като изберете данни директно от базата данни. Първо влезте в подканата на MySQL вътре в контейнера.

docker-compose exec mysql mysql -uroot -proot world

В подканата на MySQL изпълнете следното.

select * from city limit 10;

Ще видите списък с градове. Сега излезте от подканата на MySQL.

mysql> exit

Изграждане на нашето приложение

Сега, когато всички необходими контейнери са готови и работят, можем да се съсредоточим върху нашето примерно приложение. Актуализирайте app/index.phpфайла до следното.

<?php

$pdo = new PDO('mysql:host=mysql;dbname=world;charset=utf8', 'root', 'root');

$stmt = $pdo->prepare("
    select city.Name, city.District, country.Name as Country, city.Population
    from city
    left join country on city.CountryCode = country.Code
    order by Population desc
    limit 10
");
$stmt->execute();
$cities = $stmt->fetchAll(PDO::FETCH_ASSOC);

?>

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Vultr Rocks!</title>
</head>
<body>
    <h2>Most Populous Cities In The World</h2>
    <table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Country</th>
            <th>District</th>
            <th>Population</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach($cities as $city): ?>
            <tr>
                <td><?=$city['Name']?></td>
                <td><?=$city['Country']?></td>
                <td><?=$city['District']?></td>
                <td><?=number_format($city['Population'], 0)?></td>
            </tr>
        <?php endforeach ?>
    </tbody>
    </table>
</body>
</html>

Ако влезете [vultr-instance-ip]в уеб браузър, ще видите списък с най-гъсто населените градове в света. Поздравления, разположихте напълно работещо PHP приложение с помощта на docker.

Заключение

В този урок демонстрирах стъпка по стъпка как да конфигурирате напълно работещо PHP приложение. Изградихме персонализирани изображения за PHP и Nginx и конфигурирахме docker-compose, за да организираме нашите контейнери. Въпреки че е много елементарна и проста, тази настройка отразява сценарий от реалния живот.

В това ръководство сме изградили и маркирали нашите изображения локално. За по-гъвкава настройка можете да изпратите тези изображения в регистъра на docker . Можете да натиснете към официалния регистър на докерите или дори да настроите свой собствен регистър на докерите. Във всеки случай това ще ви позволи да изградите вашите изображения на един хост и да ги използвате на друг.

За по-подробно използване на docker-compose, трябва да се обърнете към официалната документация .

В зависимост от изискванията на вашето приложение и PHP рамката, която използвате, може да искате да добавите още разширения. Това може лесно да се направи чрез модифициране на Dockerfileизползваното за изграждане на нашето персонализирано PHP изображение. Някои разширения обаче се нуждаят от допълнителни зависимости, за да бъдат инсталирани в контейнера. Трябва да се обърнете към списъка с разширения в официалната документация на PHP, за да прегледате основните изисквания за всяко разширение.


Ето как да проверите Hyper-V контейнерите в Windows 10 Insider

Ето как да проверите Hyper-V контейнерите в Windows 10 Insider

Microsoft обясни в нова публикация в блога как Windows Insiders могат да тестват Hyper-V контейнери на Windows 10, ново решение за виртуализация, което позволява на приложенията да работят, без да засягат останалата част от вашата операционна система.

Как да инсталирате Harbor на CentOS 7

Как да инсталирате Harbor на CentOS 7

Harbor е регистър на сървър от корпоративен клас с отворен код, който съхранява и разпространява изображения на Docker. Harbour разширява Docker Distribution с отворен код b

Инсталирайте Rancher OS чрез iPXE

Инсталирайте Rancher OS чрез iPXE

Rancher OS е много лека Linux дистрибуция, изградена около Docker. Самата ОС тежи около 20MB. Този урок ще ви накара да работите с него

На CoreOS настройте свой собствен регистър на Docker

На CoreOS настройте свой собствен регистър на Docker

Всички познаваме и обичаме Docker, платформа за създаване, управление и разпространение на контейнери за приложения на множество машини. Docker Inc. предоставя услуга t

Инсталиране на docker-compose на CoreOS

Инсталиране на docker-compose на CoreOS

Тази статия обяснява как да инсталирате docker-compose на CoreOS. В CoreOS папката /usr/ е неизменна, така че стандартният път /usr/local/bin е недостъпен за

Инсталирайте Rancher на CentOS 7

Инсталирайте Rancher на CentOS 7

Използване на различна система? Въведение Rancher е платформа с отворен код за управление на контейнери и изграждане на частна услуга за контейнери. Rancher е база

Инсталирайте Docker CE на Ubuntu 18.04

Инсталирайте Docker CE на Ubuntu 18.04

Въведение Docker е приложение, което ни позволява да разгръщаме програми, които се изпълняват като контейнери. Той е написан на популярния език за програмиране Go

Създайте Docker Swarm на Alpine Linux 3.9.0

Създайте Docker Swarm на Alpine Linux 3.9.0

Въведение Това ръководство ще ви покаже как да създадете и конфигурирате Docker рояк, използвайки множество Alpine Linux 3.9.0 сървъри и Portainer. Моля, имайте предвид, че

Разгръщане на PHP приложение с помощта на Docker-compose

Разгръщане на PHP приложение с помощта на Docker-compose

PHP приложенията обикновено се съставят от уеб сървър, система за релационна база данни и самия езиков интерпретатор. В този урок ще бъдем лостове

Баланс на натоварването с Docker

Баланс на натоварването с Docker

Когато изпълнявате уеб приложение, обикновено искате да извлечете максимума от ресурсите си, без да се налага да конвертирате софтуера си за използване на многонишков

Разгръщане на приложение Node.js с помощта на Docker

Разгръщане на приложение Node.js с помощта на Docker

Тази статия ще ви покаже как да разположите вашето приложение Node в Docker контейнер. Забележка: Този урок предполага, че имате инсталиран и прочетен Docker

Инсталиране на Docker CE на CentOS 7

Инсталиране на Docker CE на CentOS 7

Docker контейнерната технология ви позволява да стартирате приложения в специфична и изолирана среда. Docker Community Edition (CE) е новото име за fre

Внедряване на Kubernetes с Kubeadm на CentOS 7

Внедряване на Kubernetes с Kubeadm на CentOS 7

Общ преглед Тази статия има за цел да ви помогне да стартирате и стартирате Kubernetes клъстер с kubeadm за нула време. Това ръководство ще разгръща два сървъра на

Инсталиране на Docker на CentOS 7

Инсталиране на Docker на CentOS 7

Използване на разл��чна система? Docker е приложение, което позволява внедряване на софтуер във виртуални контейнери. Написано е в програмата Go

Инсталиране на Docker CE на Debian 9

Инсталиране на Docker CE на Debian 9

Използване на различна система? Въведение Docker е приложение, което позволява внедряване на софтуер във виртуални контейнери. Беше написано в Г

Започнете със SQL Server 2017 (MS-SQL) на CentOS 7 с Docker

Започнете със SQL Server 2017 (MS-SQL) на CentOS 7 с Docker

Предпоставки Docker engine 1.8+. Минимум 4GB дисково пространство. Минимум 4GB RAM. Стъпка 1. Инсталирайте Docker За да инсталирате SQL-Server, Docker трябва

Залепваща сесия с Docker Swarm (CE) на Debian 9

Залепваща сесия с Docker Swarm (CE) на Debian 9

Използване на различна система? Въведение Docker Swarm превръща вашите отделни сървъри в клъстер от компютри; улесняване на мащабирането, висока достъпност

Два инструмента за графично управление на Docker: DockerUI и корабостроителница

Два инструмента за графично управление на Docker: DockerUI и корабостроителница

С помощта на приложението Vultr Docker можете лесно да разположите Docker на вашия сървър на Vultr. Междувременно можете да улесните задачата за управление на Docker

Инсталирайте Rancher Server на RancherOS

Инсталирайте Rancher Server на RancherOS

Общ преглед RancherOS е невероятно лека операционна система (само около 60 MB), която изпълнява системен Docker демон като PID 0 за стартиране на системни услуги

Първи стъпки с Kubernetes на CentOS 7

Първи стъпки с Kubernetes на CentOS 7

Kubernetes е платформа с отворен код, разработена от Google за управление на контейнерни приложения в клъстер от сървъри. Тя се основава на едно десетилетие и

Възходът на машините: Реални приложения на AI

Възходът на машините: Реални приложения на AI

Изкуственият интелект не е в бъдещето, тук е точно в настоящето. В този блог Прочетете как приложенията за изкуствен интелект са повлияли на различни сектори.

DDOS атаки: кратък преглед

DDOS атаки: кратък преглед

Вие също сте жертва на DDOS атаки и сте объркани относно методите за превенция? Прочетете тази статия, за да разрешите вашите запитвания.

Чудили ли сте се как хакерите печелят пари?

Чудили ли сте се как хакерите печелят пари?

Може би сте чували, че хакерите печелят много пари, но чудили ли сте се някога как печелят такива пари? нека обсъдим.

Революционни изобретения на Google, които ще улеснят живота ви.

Революционни изобретения на Google, които ще улеснят живота ви.

Искате ли да видите революционни изобретения на Google и как тези изобретения промениха живота на всяко човешко същество днес? След това прочетете в блога, за да видите изобретенията на Google.

Friday Essential: Какво се случи с колите, задвижвани от изкуствен интелект?

Friday Essential: Какво се случи с колите, задвижвани от изкуствен интелект?

Концепцията за самоуправляващи се автомобили да тръгват по пътищата с помощта на изкуствен интелект е мечта, която имаме от известно време. Но въпреки няколкото обещания, те не се виждат никъде. Прочетете този блог, за да научите повече…

Технологична сингулярност: далечно бъдеще на човешката цивилизация?

Технологична сингулярност: далечно бъдеще на човешката цивилизация?

Тъй като науката се развива с бързи темпове, поемайки много от нашите усилия, рискът да се подложим на необяснима сингулярност също нараства. Прочетете какво може да означава сингулярността за нас.

Еволюция на съхранението на данни – инфографика

Еволюция на съхранението на данни – инфографика

Методите за съхранение на данните може да се развиват от раждането на данните. Този блог обхваща развитието на съхранението на данни на базата на инфографика.

Функционалности на референтните архитектурни слоеве за големи данни

Функционалности на референтните архитектурни слоеве за големи данни

Прочетете блога, за да разберете различни слоеве в архитектурата на големи данни и техните функционалности по най-простия начин.

6 невероятни предимства от наличието на интелигентни домашни устройства в живота ни

6 невероятни предимства от наличието на интелигентни домашни устройства в живота ни

В този дигитално задвижван свят устройствата за интелигентен дом се превърнаха в решаваща част от живота. Ето няколко невероятни предимства на интелигентните домашни устройства за това как те правят живота ни струващ и по-опростен.

Актуализацията на допълнението на macOS Catalina 10.15.4 причинява повече проблеми, отколкото решава

Актуализацията на допълнението на macOS Catalina 10.15.4 причинява повече проблеми, отколкото решава

Наскоро Apple пусна macOS Catalina 10.15.4 допълнителна актуализация за отстраняване на проблеми, но изглежда, че актуализацията причинява повече проблеми, водещи до блокиране на mac машини. Прочетете тази статия, за да научите повече