Työympäristömme konfigurointi
PHP-säilön määrittäminen
Nginx-säilön määrittäminen
MySQL-säilön määrittäminen
Sovelluksemme rakentaminen
Johtopäätös
PHP-sovellukset koostuvat yleensä verkkopalvelimesta, relaatiotietokantajärjestelmästä ja itse kielitulkista. Tässä opetusohjelmassa hyödynnämme täyttä PHP-sovelluspinoa Dockerin avulla. Tämä on syvällinen opetusohjelma, jossa aiomme rakentaa ja organisoida säilöjä Nginxille (verkkopalvelin), MySQL:lle (tietokantajärjestelmä) ja PHP:lle.
Tätä opetusohjelmaa varten kirjoitamme yksinkertaisen sovelluksen, joka lukee luettelon kaupungeista tietokannasta ja näyttää sen web-sivulla. Tällä tavalla esittelemme perus, mutta toimivan PHP-sovelluksen.
Tässä oppaassa oletetaan, että sinulla on jo asennettuna Docker-CE ja sinulla on vähintään minimaaliset telakointitaidot. Tätä varten voit tarkastella seuraavia opetusohjelmia:
Työympäristömme konfigurointi
Tosielämän docker-pohjainen sovellus koostuu tyypillisesti useista konteista. Näiden manuaalinen hallinta voi helposti tulla melko sotkuiseksi ja hankalaksi. Siellä docker-säveltäminen tulee peliin. Se auttaa hallitsemaan useita säilöjä yksinkertaisen yamlmääritystiedoston avulla.
Asenna 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
Luo kansio, jossa on kaikki tämän esimerkin tarvittavat tiedostot ja sitten cdsiihen. Tästä eteenpäin tämä on työhakemistomme ja jokainen komento suoritetaan tässä kansiossa ja jokaiseen polkuun viitataan suhteessa siihen. Tähän kansioon voidaan viitata myöhemmin nimellä WORKING_DIR.
mkdir ~/docker
cd ~/docker
Luo nyt vielä kolme kansiota.
mkdir php nginx app
phpKansio sinne me rakennamme mukautetun PHP kuvassa, nginxkansio järjestää tarvittavat tiedostot asiakkaillemme nginx kuva ja appkansio on, jos aiomme asettaa lähdekoodi ja kokoonpanon otoksemme sovelluksen.
PHP-säilön määrittäminen
Tässä esimerkissä aiomme käyttää php-fpmyhteyden muodostamiseen Nginx-verkkopalvelimeen. Käytämme virallista PHP-peruskuvaa. Meidän on kuitenkin myös asennettava ja otettava käyttöön joitain laajennuksia, jotta voimme käyttää tietokantaa. Sisällä phpkansio luoda tiedoston nimeltä Dockerfileja laita seuraava sisältö siihen.
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
Huomaa, että käytämme virallisen PHP-kuvan Alpine-versiota. Alpine on hyvin pieni jakelu, joka on suunnattu konteille tarjoamalla paljon pienempiä jalanjälkiä. Huomaa myös komennon käyttö docker-php-ext-install, virallinen PHP-kuva tarjoaa tämän komennon helpottaakseen PHP-laajennusten asennusta ja määrittämistä.
Rakennetaan nyt tämä Docker-kuva julkaisemalla seuraava (sisällämme WORKING_DIR):
docker build -t vultr-php php/
docker-compose.ymltiedosto
Kuten jo mainittiin, docker-composevoit hallita useita säilöjä yksinkertaisen määritystiedoston avulla. Tämä asetustiedosto on tavallisesti nimeltään docker-compose.yml. Luo tämä tiedosto appkansioon.
touch app/docker-compose.yml
Laita seuraava sisältö tähän tiedostoon.
version: '2'
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
Selitämme tämän syntaksin. Huomioi ensin ensimmäinen rivi.
version: '2'
Tämä määrittää käytetyn docker-compose.ymlkokoonpanotiedoston version . Seuraavalla rivillä määritellään palvelut tai toisin sanoen varattavat kontit.
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
Huomaa, että jokaisella palvelulla on erityinen avain serviceslohkon sisällä . Tässä määritettyä nimeä käytetään viittaamaan tähän säilöön myöhemmin. Huomaa myös, että phpmääritämme kokoonpanon sisällä säilön suorittamiseen käytettävän kuvan (tämä on aiemmin luomamme kuva). Määrittelemme myös tilavuuskartoituksen.
volumes:
- ./:/app
Tämä käskee docker-composeyhdistämään nykyisen hakemiston ( ./) /appsäilön sisällä olevaan hakemistoon. Viimeinen rivi asettaa /appsäilön sisällä olevan kansion työhakemistoksi, mikä tarkoittaa, että tämä on kansio, josta kaikki tulevat säilön sisällä olevat komennot suoritetaan oletusarvoisesti.
Voimme nyt järjestää konttimme.
cd ~/docker/app
docker-compose up -d
Voit suorittaa seuraavan komennon varmistaaksesi, että PHP-säilö suoritettiin:
docker ps
Kuinka suorittaa komentoja säilöjen sisällä
Edelleen appkansion sisällä voimme suorittaa minkä tahansa komennon määritetyn palvelusäiliön sisällä docker-composekomennon avulla.
docker-compose exec [service] [command]
[service]Paikkamerkki viittaa Service Key. Meidän tapauksessamme tämä oli php. Suoritetaan komento säilön sisällä tarkistaaksemme PHP-versiomme.
docker-compose exec php php -v
Näet seuraavan tulosteen.
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-säilön määrittäminen
Aivan kuten PHP-säilössä, meidän on luotava mukautettu kuva verkkopalvelimelle. Mutta tässä tapauksessa meidän on vain annettava kokoonpano virtual host. Varmista, että olet sisällä meidän WORKING_DIRja luoda Dockerfilesisälle nginxkansio:
cd ~/docker
touch nginx/Dockerfile
Laita tähän nyt seuraava sisältö Dockerfile:
FROM nginx:1.13.8-alpine
COPY ./default.conf /etc/nginx/conf.d/default.conf
Käytämme Alpine-pohjaista oletusarvoista Nginx-kuvaa. Kopioimme tässä Docker-tiedostossa määritystiedoston sovelluksemme asetuksiin. Luo määritystiedosto ennen tämän kuvan rakentamista.
touch nginx/default.conf
Täytä se nyt tällä sisällöllä.
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;
}
}
Huomaa, että fastcgi_pass php:9000rivillä viittaamme PHP-säilöön sen nimellä määritystiedoston servicelohkossa docker-compose.yml. docker-composeLuo sisäisesti verkon ja määrittää palvelun nimen isäntänimeksi jokaiselle määritetylle palvelulle. Voimme nyt rakentaa Nginx-kuvan.
docker build -t vultr-nginx nginx/
Päivitetään docker-compose.yml
Päivitä nyt app/docker-compose.ymltiedosto.
version: '2'
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
web:
image: vultr-nginx
volumes:
- ./:/app
depends_on:
- php
ports:
- 80:80
Olemme vain lisänneet uuden palvelun. Kokoonpano on lähes sama, lukuun ottamatta seuraavia.
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.
Ennen kuin suunnittelemme uuden kokoonpanomme, ladataan esimerkki MySQL-tietokannasta. Viralliset MySQL asiakirjat
esitetään joitakin Mallitietokannat. Käytämme tunnettua maailmantietokantaa. Tämä tietokanta tarjoaa luettelon maista ja kaupungeista. Lataa tämä esimerkki suorittamalla seuraava sovelluskansiossamme.
curl -L http://downloads.mysql.com/docs/world.sql.gz -o world.sql.gz
gunzip world.sql.gz
Nyt orkestroidaan konttimme.
docker-compose up -d
Kuten olet ehkä jo huomannut, docker-compose upkomento käynnistää vain ne säilöt, joita ei ole vielä aloitettu. Se tarkistaa docker-compose.ymltiedostosi ja käynnissä olevien säilöjen nykyisen kokoonpanon väliset erot .
Tarkista vielä kerran, että MySQL-säilö käynnistettiin.
docker ps
Täytä nyt maailman tietokanta.
docker-compose exec -T mysql mysql -uroot -proot world < world.sql
Voit varmistaa, että tietokanta on täytetty, valitsemalla tiedot suoraan tietokannasta. Avaa ensin säilön sisällä oleva MySQL-kehote.
docker-compose exec mysql mysql -uroot -proot world
Suorita MySQL-kehotteessa seuraava.
select * from city limit 10;
Näet luettelon kaupungeista. Sulje nyt MySQL-kehote.
mysql> exit
Sovelluksemme rakentaminen
Nyt kun kaikki tarvittavat säiliöt ovat käytössä, voimme keskittyä esimerkkisovellukseemme. Päivitä
app/index.phptiedosto seuraavaan.
<?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>
Jos käytät [vultr-instance-ip]verkkoselainta, näet luettelon maailman väkirikkaimmista kaupungeista. Onnittelut, olet ottanut käyttöön täysin toimivan PHP-sovelluksen Dockerin avulla.
Johtopäätös
Tässä opetusohjelmassa olen näyttänyt vaihe vaiheelta, kuinka täysin toimiva PHP-sovellus konfiguroidaan. Rakensimme räätälöityjä kuvia PHP:lle ja Nginxille ja määritimme Docker-Composen ohjaamaan säiliöitämme. Huolimatta siitä, että tämä asetus on hyvin yksinkertainen ja yksinkertainen, se kuvastaa tosielämän skenaariota.
Tässä oppaassa olemme rakentaneet ja merkinneet kuvat paikallisesti. Jos haluat joustavamman asennuksen, voit siirtää nämä kuvat telakointiaseman rekisteriin . Voit siirtyä viralliseen Docker-rekisteriin tai jopa määrittää oman telakointiaseman rekisterin. Joka tapauksessa tämän avulla voit rakentaa kuvasi yhdelle isännälle ja käyttää niitä toisessa.
Jos haluat lisätietoja sovelluksen käytöstä docker-compose, katso virallinen dokumentaatio .
Riippuen sovellusvaatimuksistasi ja käyttämästäsi PHP-kehyksestä, saatat haluta lisätä laajennuksia. Tämä voidaan tehdä helposti muokkaamalla Dockerfilekäytettyä mukautetun PHP-kuvamme luomiseen. Jotkut laajennukset tarvitsevat kuitenkin lisäriippuvuuksia, jotta ne voidaan asentaa säilöön. Sinun tulee tutustua PHP:n virallisen dokumentaation laajennusluetteloon
tarkistaaksesi kunkin laajennuksen perusvaatimukset.