Wdróż aplikację PHP za pomocą Docker-compose

Aplikacje PHP zwykle składają się z serwera WWW, systemu relacyjnej bazy danych i samego tłumacza języka. W tym samouczku wykorzystamy pełny stos aplikacji PHP za pomocą okna dokowanego. To jest dogłębny samouczek, w którym zamierzamy budować i koordynować kontenery dla Nginx (serwer WWW), MySQL (system bazy danych) i PHP.

Na potrzeby tego samouczka napiszemy prostą aplikację, która odczyta listę miast z bazy danych i wyświetli ją na stronie internetowej, w ten sposób zademonstrujemy prostą, ale działającą aplikację PHP.

W tym przewodniku założono, że masz już zainstalowany Docker-CE i przynajmniej minimalna praktyczna znajomość dokera. W tym celu możesz przejrzeć następujące samouczki:

Konfigurowanie naszego środowiska pracy

Rzeczywista aplikacja oparta na dokerze zwykle składa się z kilku kontenerów. Ręczne zarządzanie nimi może stać się dość nieporządne i kłopotliwe. Tam właśnie wkracza kompozycja dokująca. Pomaga zarządzać wieloma kontenerami za pomocą prostego yamlpliku konfiguracyjnego.

Zainstaluj komponent dokujący.

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

Utwórz folder do przechowywania wszystkich niezbędnych plików z tego przykładu, a następnie cddo niego. Od teraz jest to nasz katalog roboczy i każde polecenie będzie wykonywane w tym folderze, a każda ścieżka będzie do niego wskazywana. Do tego folderu można się później odwołać jako WORKING_DIR.

mkdir ~/docker
cd ~/docker

Teraz utwórz jeszcze trzy foldery.

mkdir php nginx app

phpFolder jest gdzie będziemy budować nasz zwyczaj PHP obrazu, nginxfolder będzie posiadać niezbędne pliki na nasz zwyczaj nginx obrazu i appfolder jest gdzie będziemy wprowadzenie kodu źródłowego i konfigurację naszej przykładowej aplikacji.

Konfigurowanie kontenera PHP

W tym przykładzie użyjemy php-fpmdo połączenia z serwerem internetowym Nginx. Będziemy używać oficjalnego podstawowego obrazu PHP. Jednak musimy również zainstalować i włączyć niektóre rozszerzenia, abyśmy mogli uzyskać dostęp do bazy danych. Wewnątrz phpfolderu utwórz plik o nazwie Dockerfilei umieść w nim następującą zawartość.

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

Pamiętaj, że korzystamy z alpejskiej wersji oficjalnego obrazu PHP. Alpine to bardzo niewielka dystrybucja ukierunkowana na kontenery, ponieważ zapewnia znacznie mniejsze ślady. Zwróć też uwagę na użycie polecenia docker-php-ext-install, oficjalny obraz PHP udostępnia to polecenie, aby ułatwić proces instalowania i konfigurowania rozszerzeń PHP.

Teraz zbudujmy ten obraz Dockera, wydając następujące (w naszym WORKING_DIR):

docker build -t vultr-php php/

docker-compose.ymlplik

Jak już wspomniano, docker-composeumożliwia zarządzanie wieloma kontenerami za pomocą prostego pliku konfiguracyjnego. Ten plik konfiguracyjny ma zwykle nazwę docker-compose.yml. Utwórz ten plik w appfolderze.

touch app/docker-compose.yml

Teraz włóż następującą zawartość do tego pliku.

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

Wyjaśnimy tę składnię. Najpierw zwróć uwagę na pierwszą linię.

version: '2'

Określa wersję docker-compose.ymlużywanego pliku konfiguracyjnego. Kolejny wiersz określa usługi lub, innymi słowy, pojemniki, które mają zostać udostępnione.

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

Pamiętaj, że każda usługa ma określony klucz w servicesbloku. Podana tutaj nazwa zostanie później użyta do odwołania się do tego konkretnego kontenera. Pamiętaj również, że w phpkonfiguracji definiujemy obraz używany do uruchomienia kontenera (jest to obraz, który zbudowaliśmy wcześniej). Definiujemy również mapowanie woluminów.

volumes:
  - ./:/app

To mówi docker-composeo zamapowaniu bieżącego katalogu ( ./) na /appkatalog wewnątrz kontenera. Ostatni wiersz ustawia /appfolder wewnątrz kontenera jako katalog roboczy, co oznacza, że ​​jest to folder, z którego domyślnie wykonywane są wszystkie przyszłe polecenia w kontenerze.

Możemy teraz koordynować nasze kontenery.

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

Możesz uruchomić następujące polecenie, aby upewnić się, że kontener PHP został wykonany:

docker ps

Jak wykonywać polecenia w kontenerach

Nadal w appfolderze możemy za pomocą polecenia uruchomić dowolne polecenie w określonym kontenerze usług docker-compose.

docker-compose exec [service] [command]

Symbol [service]zastępczy odnosi się do klucza usługi. W naszym przypadku tak było php. Uruchommy polecenie w kontenerze, aby sprawdzić naszą wersję PHP.

docker-compose exec php php -v

Zobaczysz następujące dane wyjściowe.

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

Konfigurowanie kontenera Nginx

Podobnie jak kontener PHP, musimy stworzyć niestandardowy obraz dla serwera WWW. Ale w tym przypadku musimy tylko podać konfigurację dla naszego virtual host. Upewnij się, że jesteś w naszym WORKING_DIRi utwórz folder Dockerfilewewnątrz nginx:

cd ~/docker
touch nginx/Dockerfile

Teraz włóż w to następującą zawartość Dockerfile:

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

Używamy domyślnego obrazu Nginx opartego na Alpine. W tym pliku Docker po prostu kopiujemy plik konfiguracyjny do naszej konfiguracji aplikacji. Przed zbudowaniem tego obrazu utwórz plik konfiguracyjny.

touch nginx/default.conf

Teraz wypełnij go tą zawartością.

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;
    }
}

Zauważ, że w fastcgi_pass php:9000wierszu odwołujemy się do kontenera PHP według jego nazwy w servicebloku docker-compose.ymlpliku konfiguracyjnego. Wewnętrznie docker-composetworzy sieć i przypisuje nazwę usługi jako nazwę hosta do każdej ze zdefiniowanych usług. Możemy teraz zbudować obraz Nginx.

docker build -t vultr-nginx nginx/

Aktualizacja docker-compose.yml

Teraz zaktualizuj app/docker-compose.ymlplik.

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

Dodaliśmy tylko nową usługę. Konfiguracja jest prawie taka sama, z wyjątkiem poniższych.

depends_on:
  - php
ports:
  - 80:80

Gdy kontener Nginx wymaga pełnej inicjalizacji usługi PHP, wymuszamy to wymaganie w depends_onopcji. portsKlucz konfiguracja mapuje port hosta do portu kontenerowego, tutaj mamy map portu 80w przyjmującym do portu 80w pojemniku.

Teraz utwórz plik o nazwie index.phpwewnątrz appfolderu i umieść w nim następujące elementy.

<?php phpinfo();

Upewnij się, że port 80jest dostępny przez zaporę ogniową i wykonaj następujące czynności.

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

Ponownie sprawdź, czy usługa jest uruchomiona.

docker ps

Otwórz przeglądarkę i uzyskaj dostęp [vultr-instance-ip]. Możesz znaleźć swój adres IP instancji Vultr, uruchamiając następujące polecenie.

hostname -I

Zobaczysz stronę informacyjną PHP.

Konfigurowanie kontenera MySQL

Oficjalny obraz MySQL pozwala skonfigurować kontener za pomocą prostych zmiennych środowiskowych. Można to zrobić za pomocą environmentopcji w definicji bloku serwisowego. Zaktualizuj ~/docker/app/docker-compose.ymlplik do następującego.

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:

Teraz zdefiniowaliśmy nową usługę dla bazy danych. Zwróć uwagę na linię dbdata:/var/lib/mysql. Spowoduje to zamontowanie ścieżki w kontenerze /var/lib/mysqldo trwałego woluminu zarządzanego przez Docker, w ten sposób dane bazy danych pozostaną po usunięciu kontenera. Ten wolumin należy zdefiniować w bloku najwyższego poziomu, jak widać na końcu pliku.

Przed zaaranżowaniem naszej nowej konfiguracji pobierzmy przykładową bazę danych MySQL. Oficjalna dokumentacja MySQL zawiera kilka przykładowych baz danych. Będziemy korzystać ze znanej światowej bazy danych. Ta baza danych zawiera listę krajów i miast. Aby pobrać tę próbkę, wykonaj następujące czynności w naszym folderze aplikacji.

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

Teraz pozwala organizować nasze kontenery.

docker-compose up -d

Jak zapewne zauważyłeś, docker-compose uppolecenie uruchamia tylko te kontenery, które nie zostały jeszcze uruchomione. Sprawdza różnice między docker-compose.ymlplikiem a bieżącą konfiguracją działających kontenerów.

Jeszcze raz sprawdź, czy kontener MySQL został uruchomiony.

docker ps

Teraz zapełnij światową bazę danych.

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

Możesz sprawdzić, czy baza danych została zapełniona, wybierając dane bezpośrednio z bazy danych. Najpierw uzyskaj dostęp do monitu MySQL w kontenerze.

docker-compose exec mysql mysql -uroot -proot world

W wierszu MySQL uruchom następujące polecenie.

select * from city limit 10;

Zobaczysz listę miast. Teraz zamknij monit MySQL.

mysql> exit

Budowanie naszej aplikacji

Teraz, gdy wszystkie niezbędne pojemniki są już uruchomione, możemy skupić się na naszej przykładowej aplikacji. Zaktualizuj app/index.phpplik do następującego.

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

Jeśli uzyskasz dostęp [vultr-instance-ip]w przeglądarce internetowej, zobaczysz listę najbardziej zaludnionych miast na świecie. Gratulacje, wdrożyłeś w pełni działającą aplikację PHP za pomocą dokera.

Wniosek

W tym samouczku pokazałem krok po kroku, jak skonfigurować w pełni działającą aplikację PHP. Zbudowaliśmy niestandardowe obrazy dla PHP i Nginx, a także skonfigurowaliśmy kompozycję dokującą do aranżacji naszych kontenerów. Mimo że jest bardzo prosty i prosty, ta konfiguracja odzwierciedla prawdziwy scenariusz z życia.

W tym przewodniku zbudowaliśmy i oznaczyliśmy nasze obrazy lokalnie. Aby uzyskać bardziej elastyczną konfigurację, możesz przesłać te obrazy do rejestru dokera . Możesz przejść do oficjalnego rejestru dokerów, a nawet skonfigurować własny rejestr dokerów. W każdym razie pozwoli ci to zbudować obrazy na jednym hoście i użyć ich na innym.

Aby uzyskać bardziej szczegółowe informacje na temat korzystania docker-compose, należy zapoznać się z oficjalną dokumentacją .

W zależności od wymagań aplikacji i używanego środowiska PHP możesz chcieć dodać więcej rozszerzeń. Można to łatwo zrobić, modyfikując Dockerfileużywany do budowy naszego niestandardowego obrazu PHP. Jednak niektóre rozszerzenia wymagają dodatkowych zależności do zainstalowania w kontenerze. Należy zapoznać się z listą rozszerzeń w oficjalnej dokumentacji PHP, aby przejrzeć podstawowe wymagania każdego rozszerzenia.



Leave a Comment

Wdróż Kubernetes za pomocą Kubeadm na CentOS 7

Wdróż Kubernetes za pomocą Kubeadm na CentOS 7

Omówienie Ten artykuł ma na celu pomóc ci w szybkim uruchomieniu klastra Kubernetes z kubeadm. W tym przewodniku zostaną wdrożone dwa serwery

Zainstaluj Docker CE na Ubuntu 18.04

Zainstaluj Docker CE na Ubuntu 18.04

Wprowadzenie Docker to aplikacja, która pozwala nam wdrażać programy działające jako kontenery. Został napisany w popularnym języku programowania Go

Instalowanie Dockera na CentOS 7

Instalowanie Dockera na CentOS 7

Używasz innego systemu? Docker to aplikacja umożliwiająca wdrażanie oprogramowania w wirtualnych kontenerach. Został napisany w programie Go

Zainstaluj Rancher na Ubuntu 16.04

Zainstaluj Rancher na Ubuntu 16.04

Używasz innego systemu? Wprowadzenie Rancher to platforma typu open source do uruchamiania kontenerów i budowania prywatnej usługi kontenerowej. Ranczer jest podstawą

Instalowanie docker-compose na CoreOS

Instalowanie docker-compose na CoreOS

W tym artykule wyjaśniono, jak zainstalować program dokujący-komponuj w CoreOS. W CoreOS folder / usr / jest niezmienny, więc standardowa ścieżka / usr / local / bin jest niedostępna

W systemie CoreOS skonfiguruj własny rejestr Docker

W systemie CoreOS skonfiguruj własny rejestr Docker

Wszyscy znamy i kochamy Docker, platformę do tworzenia, zarządzania i dystrybucji kontenerów aplikacji na wielu komputerach. Docker Inc. świadczy usługę t

Zainstaluj Rancher na CentOS 7

Zainstaluj Rancher na CentOS 7

Używasz innego systemu? Wprowadzenie Rancher to platforma typu open source do uruchamiania kontenerów i budowania prywatnej usługi kontenerowej. Ranczer jest podstawą

Sentry konfiguracji przez Docker na Ubuntu 16.04

Sentry konfiguracji przez Docker na Ubuntu 16.04

Używasz innego systemu? Wprowadzenie Sentry to rozwiązanie typu open source do śledzenia błędów. Sentry śledzi wyjątki i inne przydatne wiadomości

Jak zainstalować Harbour na CentOS 7

Jak zainstalować Harbour na CentOS 7

Harbor to serwer rejestru klasy korporacyjnej typu open source, który przechowuje i dystrybuuje obrazy Docker. Harbor rozszerza dystrybucję Docker typu open source b

Sticky Session With Docker Swarm (CE) na CentOS 7

Sticky Session With Docker Swarm (CE) na CentOS 7

Używasz innego systemu? Wprowadzenie Docker Swarm zamienia poszczególne serwery w klaster komputerów, ułatwiając skalowanie, wysoką dostępność i

Dwa graficzne narzędzia do zarządzania Docker: DockerUI i Shipyard

Dwa graficzne narzędzia do zarządzania Docker: DockerUI i Shipyard

Za pomocą aplikacji Vultr Docker można łatwo wdrożyć Docker na instancji serwera Vultr. W międzyczasie możesz ułatwić zadanie zarządzania Docker

Zainstaluj Rancher Server na RancherOS

Zainstaluj Rancher Server na RancherOS

Przegląd RancherOS to niezwykle lekki system operacyjny (tylko około 60 MB), który uruchamia demona Docker systemowego jako PID 0 do uruchamiania usług systemowych

Bezpiecznie wdrażaj i zarządzaj kontenerami LXC na Ubuntu 14.04

Bezpiecznie wdrażaj i zarządzaj kontenerami LXC na Ubuntu 14.04

Kontenery LXC (kontenery Linux) to funkcja systemu operacyjnego w systemie Linux, której można używać do uruchamiania wielu izolowanych systemów Linux na jednym hoście. Thes

Rozpoczęcie pracy z Kubernetes na CentOS 7

Rozpoczęcie pracy z Kubernetes na CentOS 7

Kubernetes to platforma open source opracowana przez Google do zarządzania aplikacjami kontenerowymi w klastrze serwerów. Opiera się na dekadzie i

Jak korzystać z Docker: Tworzenie pierwszego kontenera Docker

Jak korzystać z Docker: Tworzenie pierwszego kontenera Docker

W tym samouczku wyjaśniono podstawy rozpoczęcia korzystania z Docker. Zakładam, że masz już zainstalowany Docker. Kroki w tym samouczku będą działać na

Bilans obciążenia z dokerem

Bilans obciążenia z dokerem

Podczas uruchamiania aplikacji sieciowej zwykle chcesz maksymalnie wykorzystać zasoby bez konieczności konwertowania oprogramowania na wielowątkowość

Rozpocznij pracę z SQL Server 2017 (MS-SQL) na CentOS 7 With Docker

Rozpocznij pracę z SQL Server 2017 (MS-SQL) na CentOS 7 With Docker

Wymagania wstępne Silnik Docker 1.8+. Minimum 4 GB miejsca na dysku. Minimum 4 GB pamięci RAM. Krok 1. Zainstaluj Docker Aby zainstalować SQL-Server, Docker mus

Instalowanie Docker CE na Debianie 9

Instalowanie Docker CE na Debianie 9

Używasz innego systemu? Wprowadzenie Docker to aplikacja umożliwiająca wdrażanie oprogramowania w wirtualnych kontenerach. Został napisany w G

Instalowanie Dockera na Ubuntu 14.04

Instalowanie Dockera na Ubuntu 14.04

Używasz innego systemu? Docker to aplikacja umożliwiająca wdrażanie programów uruchamianych jako kontenery. Został napisany w popularnym programie Go

Funkcjonalności warstw architektury referencyjnej Big Data

Funkcjonalności warstw architektury referencyjnej Big Data

Przeczytaj blog, aby w najprostszy sposób poznać różne warstwy w architekturze Big Data i ich funkcjonalności.

Rewolucyjne wynalazki Google, które ułatwią Twoje życie.

Rewolucyjne wynalazki Google, które ułatwią Twoje życie.

Chcesz zobaczyć rewolucyjne wynalazki Google i jak te wynalazki zmieniły życie każdego człowieka dzisiaj? Następnie czytaj na blogu, aby zobaczyć wynalazki Google.

13 komercyjnych narzędzi do ekstrakcji danych z Big Data

13 komercyjnych narzędzi do ekstrakcji danych z Big Data

13 komercyjnych narzędzi do ekstrakcji danych z Big Data

Pozostań w kontakcie dzięki aplikacji WhatsApp na komputer 24*7

Pozostań w kontakcie dzięki aplikacji WhatsApp na komputer 24*7

Whatsapp w końcu uruchomił aplikację Desktop dla użytkowników komputerów Mac i Windows. Teraz możesz łatwo uzyskać dostęp do Whatsapp z systemu Windows lub Mac. Dostępne dla Windows 8+ i Mac OS 10.9+

5 przykładów, które dowodzą, że energetyka jądrowa nie zawsze jest zła

5 przykładów, które dowodzą, że energetyka jądrowa nie zawsze jest zła

Energia jądrowa jest zawsze pogardzana, nigdy jej nie szanujemy z powodu przeszłych wydarzeń, ale nie zawsze jest zła. Przeczytaj post, aby dowiedzieć się więcej na ten temat.

Friday Essential: Co się stało z samochodami sterowanymi przez sztuczną inteligencję?

Friday Essential: Co się stało z samochodami sterowanymi przez sztuczną inteligencję?

Koncepcja autonomicznych samochodów, które wyjadą na drogi za pomocą sztucznej inteligencji, to marzenie, które mamy już od jakiegoś czasu. Ale pomimo kilku obietnic nigdzie ich nie widać. Przeczytaj ten blog, aby dowiedzieć się więcej…

Czy AI może walczyć z rosnącą liczbą ataków ransomware?

Czy AI może walczyć z rosnącą liczbą ataków ransomware?

Wzrasta liczba ataków ransomware, ale czy sztuczna inteligencja może pomóc w radzeniu sobie z najnowszym wirusem komputerowym? Czy AI jest odpowiedzią? Przeczytaj tutaj, wiedz, że sztuczna inteligencja jest zmorą lub zgubą

5 przydatnych narzędzi sztucznej inteligencji, które uproszczą Twoje życie

5 przydatnych narzędzi sztucznej inteligencji, które uproszczą Twoje życie

Sztuczna inteligencja nie jest dla ludzi nową nazwą. Ponieważ sztuczna inteligencja jest włączona do każdego strumienia, jednym z nich jest opracowywanie narzędzi zwiększających ludzką wydajność i dokładność. Skorzystaj z tych niesamowitych narzędzi uczenia maszynowego i uprość swoje codzienne zadania.

Wgląd w 26 technik analizy Big Data: część 2

Wgląd w 26 technik analizy Big Data: część 2

Zawsze potrzebujemy Big Data Analytics do efektywnego zarządzania danymi. W tym artykule omówiliśmy kilka technik analizy Big Data. Sprawdź ten artykuł.

Ataki DDOS: krótki przegląd

Ataki DDOS: krótki przegląd

Czy jesteś również ofiarą ataków DDOS i nie masz pewności co do metod zapobiegania? Przeczytaj ten artykuł, aby rozwiązać swoje pytania.