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 yaml
mää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 cd
siihen. 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
php
Kansio sinne me rakennamme mukautetun PHP kuvassa, nginx
kansio järjestää tarvittavat tiedostot asiakkaillemme nginx kuva ja app
kansio on, jos aiomme asettaa lähdekoodi ja kokoonpanon otoksemme sovelluksen.
PHP-säilön määrittäminen
Tässä esimerkissä aiomme käyttää php-fpm
yhteyden 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ä php
kansio luoda tiedoston nimeltä Dockerfile
ja 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.yml
tiedosto
Kuten jo mainittiin, docker-compose
voit hallita useita säilöjä yksinkertaisen määritystiedoston avulla. Tämä asetustiedosto on tavallisesti nimeltään docker-compose.yml
. Luo tämä tiedosto app
kansioon.
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.yml
kokoonpanotiedoston 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 services
lohkon sisällä . Tässä määritettyä nimeä käytetään viittaamaan tähän säilöön myöhemmin. Huomaa myös, että php
mää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-compose
yhdistämään nykyisen hakemiston ( ./
) /app
säilön sisällä olevaan hakemistoon. Viimeinen rivi asettaa /app
sä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 app
kansion sisällä voimme suorittaa minkä tahansa komennon määritetyn palvelusäiliön sisällä docker-compose
komennon 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_DIR
ja luoda Dockerfile
sisälle nginx
kansio:
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:9000
rivillä viittaamme PHP-säilöön sen nimellä määritystiedoston service
lohkossa docker-compose.yml
. docker-compose
Luo 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.yml
tiedosto.
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 up
komento käynnistää vain ne säilöt, joita ei ole vielä aloitettu. Se tarkistaa docker-compose.yml
tiedostosi 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.php
tiedosto 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 Dockerfile
kä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.