Að stilla vinnuumhverfi okkar
Að stilla PHP ílátið
Stillir Nginx ílátið
Að stilla MySQL ílátið
Byggja umsókn okkar
Niðurstaða
PHP forrit eru venjulega samsett af vefþjóni, venslagagnagrunnskerfi og tungumálatúlknum sjálfum. Í þessari kennslu munum við nýta fullan PHP forritsstafla með því að nota docker. Þetta er ítarlegt kennsluefni þar sem við ætlum að smíða og skipuleggja gáma fyrir Nginx (vefþjóninn), MySQL (gagnagrunnskerfið) og PHP.
Fyrir sakir þessarar kennslu munum við skrifa einfalt forrit sem les lista yfir borgir úr gagnagrunni og birtir það á vefsíðu, þannig munum við sýna grunn, en virka, PHP forrit.
Þessi handbók gerir ráð fyrir að þú hafir Docker-CE þegar uppsettan og að minnsta kosti lágmarks þekkingu á Docker. Fyrir það mál geturðu skoðað eftirfarandi kennsluefni:
Að stilla vinnuumhverfi okkar
Raunverulegt forrit sem byggir á bryggju mun venjulega vera samsett úr nokkrum ílátum. Að stjórna þessu handvirkt getur auðveldlega orðið frekar sóðalegt og fyrirferðarmikið. Það er þar sem docker-compose kemur við sögu. Það hjálpar þér að stjórna fjölda gáma í gegnum einfalda yaml
stillingarskrá.
Settu upp 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
Búðu til möppu til að geyma allar nauðsynlegar skrár af þessu dæmi og síðan cd
inn í það. Héðan í frá er þetta vinnuskráin okkar og hver skipun verður keyrð inni í þessari möppu og vísað verður í hverja slóð miðað við hana. Hægt er að vísa í þessa möppu síðar sem WORKING_DIR
.
mkdir ~/docker
cd ~/docker
Búðu til þrjár möppur í viðbót.
mkdir php nginx app
The php
mappa er þar sem við munum byggja sérsniðin PHP ímynd okkar, nginx
mappa mun halda nauðsynlegar skrár til sérsniðna nginx ímynd okkar og app
mappa er þar sem við munum vera að setja kóðann og uppsetningu sýnishorn umsókn okkar.
Að stilla PHP ílátið
Í þessu dæmi ætlum við að nota php-fpm
til að tengjast Nginx vefþjóninum. Við munum nota opinberu PHP grunnmyndina. Hins vegar þurfum við líka að setja upp og virkja nokkrar viðbætur svo við getum fengið aðgang að gagnagrunninum. Inni í php
möppunni búðu til skrá sem heitir Dockerfile
og settu eftirfarandi innihald í hana.
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
Athugaðu að við erum að nota Alpine útgáfuna af opinberu PHP myndinni. Alpine er mjög pínulítil dreifing sem miðar að gámum með því að gefa mun minni fótspor. Athugaðu líka notkun skipunarinnar docker-php-ext-install
, opinbera PHP myndin veitir þessa skipun til að auðvelda uppsetningu og stillingu PHP viðbóta.
Nú skulum við byggja þessa Docker mynd með því að gefa út eftirfarandi (inni í okkar WORKING_DIR
):
docker build -t vultr-php php/
The docker-compose.yml
skrá
Eins og áður hefur komið fram, docker-compose
gerir þér kleift að stjórna fjölda gáma í gegnum einfalda stillingarskrá. Þessi stillingarskrá heitir venjulega docker-compose.yml
. Búðu til þessa skrá í app
möppunni.
touch app/docker-compose.yml
Settu nú eftirfarandi innihald í þessa skrá.
version: '2'
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
Við munum útskýra þessa setningafræði. Fyrst skaltu athuga fyrstu línuna.
version: '2'
Þetta tilgreinir útgáfu af docker-compose.yml
stillingarskránni sem notuð er. Næsta lína tilgreinir þjónustuna, eða með öðrum orðum, gámana sem á að útvega.
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
Athugaðu að hver þjónusta hefur sérstakan lykil inni í services
blokkinni. Nafnið sem tilgreint er hér verður notað til að vísa til þessa tiltekna íláts síðar. Athugaðu líka að inni í php
uppsetningunni skilgreinum við myndina sem notuð er til að keyra ílátið (þetta er myndin sem við byggðum áður). Við skilgreinum einnig magnkortlagningu.
volumes:
- ./:/app
Þetta segir docker-compose
til um að kortleggja núverandi möppu ( ./
) í /app
möppuna inni í ílátinu. Síðasta línan setur /app
möppuna inni í gámnum sem vinnuskrá, sem þýðir að þetta er mappan þar sem allar framtíðarskipanir inni í gámi eru sjálfgefið keyrðar úr.
Við getum nú skipulagt gámana okkar.
cd ~/docker/app
docker-compose up -d
Þú getur keyrt eftirfarandi skipun til að ganga úr skugga um að PHP ílátið hafi verið keyrt:
docker ps
Hvernig á að framkvæma skipanir inni í gámunum
Enn inni í app
möppunni getum við keyrt hvaða skipun sem er í skilgreindum þjónustuíláti með hjálp docker-compose
skipunarinnar.
docker-compose exec [service] [command]
The [service]
staðgengill vísar til þjónustu lykill. Í okkar tilviki var þetta php
. Við skulum keyra skipun inni í ílátinu til að athuga PHP útgáfuna okkar.
docker-compose exec php php -v
Þú munt sjá eftirfarandi úttak.
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
Stillir Nginx ílátið
Rétt eins og PHP ílátið þurfum við að búa til sérsniðna mynd fyrir vefþjóninn. En í þessu tilfelli þurfum við bara að gefa upp stillingar fyrir virtual host
. Gakktu úr skugga um að þú sért inni hjá okkur WORKING_DIR
og búðu til Dockerfile
inni í nginx
möppunni:
cd ~/docker
touch nginx/Dockerfile
Settu nú eftirfarandi innihald í þetta Dockerfile
:
FROM nginx:1.13.8-alpine
COPY ./default.conf /etc/nginx/conf.d/default.conf
Við erum að nota sjálfgefna Nginx mynd byggða á Alpine. Í þessari Docker skrá afritum við einfaldlega stillingarskrá inn í forritauppsetninguna okkar. Áður en þú byggir þessa mynd skaltu búa til stillingarskrá.
touch nginx/default.conf
Fylltu það nú með þessu efni.
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;
}
}
Athugaðu að við fastcgi_pass php:9000
línuna erum við að vísa til PHP ílátsins með nafni hans inni í service
reitnum í docker-compose.yml
stillingarskránni. Innbyrðis docker-compose
skapar net og gefur nafnið þjónustu sem gestgjafi nafn til hvers sem skilgreind. Við getum nú smíðað Nginx myndina.
docker build -t vultr-nginx nginx/
Uppfærsla docker-compose.yml
Uppfærðu nú app/docker-compose.yml
skrána.
version: '2'
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
web:
image: vultr-nginx
volumes:
- ./:/app
depends_on:
- php
ports:
- 80:80
Við höfum aðeins bætt við nýrri þjónustu. Uppsetningin er næstum sú sama, nema eftirfarandi.
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.
Áður en við skipuleggjum nýju uppsetninguna okkar skulum við hlaða niður sýnishorni af MySQL gagnagrunni. The opinber MySQL gögnum
gefur nokkur sýnishorn gagnagrunna. Við munum nota hinn þekkta heimsgagnagrunn. Þessi gagnagrunnur veitir lista yfir lönd og borgir. Til að hlaða niður þessu sýnishorni skaltu framkvæma eftirfarandi í appmöppunni okkar.
curl -L http://downloads.mysql.com/docs/world.sql.gz -o world.sql.gz
gunzip world.sql.gz
Nú skulum við skipuleggja gámana okkar.
docker-compose up -d
Eins og þú hefur kannski þegar tekið eftir, þá docker-compose up
byrjar skipunin aðeins ílátin sem eru ekki þegar ræst. Það athugar muninn á docker-compose.yml
skránni þinni og núverandi uppsetningu hlaupandi gáma.
Einu sinni enn, athugaðu hvort MySQL ílátið hafi verið ræst.
docker ps
Fylltu nú heimsgagnagrunninn.
docker-compose exec -T mysql mysql -uroot -proot world < world.sql
Þú getur staðfest að gagnagrunnurinn hafi verið fylltur með því að velja gögn beint úr gagnagrunninum. Fáðu fyrst aðgang að MySQL kvaðningu inni í ílátinu.
docker-compose exec mysql mysql -uroot -proot world
Í MySQL hvetjunni skaltu keyra eftirfarandi.
select * from city limit 10;
Þú munt sjá lista yfir borgir. Hættu nú MySQL hvetjunni.
mysql> exit
Byggja umsókn okkar
Nú þegar allir nauðsynlegir gámar eru komnir í gang getum við einbeitt okkur að sýnishornsforritinu okkar. Uppfærðu
app/index.php
skrána í eftirfarandi.
<?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>
Ef þú opnar [vultr-instance-ip]
í vafra muntu sjá lista yfir fjölmennustu borgir í heimi. Til hamingju, þú hefur sett upp fullvirkt PHP forrit með því að nota docker.
Niðurstaða
Í þessari kennslu hef ég sýnt skref fyrir skref hvernig á að stilla fullvirkt PHP forrit. Við smíðuðum sérsniðnar myndir fyrir PHP og Nginx og stilltum docker-compose til að skipuleggja ílátin okkar. Þrátt fyrir að vera mjög einföld og einföld endurspeglar þessi uppsetning raunveruleikaatburðarás.
Í þessari handbók höfum við smíðað og merkt myndirnar okkar á staðnum. Til að fá sveigjanlegri uppsetningu geturðu ýtt þessum myndum í tengikví . Þú getur ýtt á opinberu bryggjuskrána eða jafnvel sett upp þína eigin bryggjuskrá. Í öllum tilvikum mun þetta gera þér kleift að byggja myndirnar þínar á einum gestgjafa og nota þær á öðrum.
Til að fá ítarlegri notkun á docker-compose
, ættir þú að vísa til opinberu skjala .
Það fer eftir umsóknarkröfum þínum og PHP ramma sem þú notar, þú gætir viljað bæta við fleiri viðbótum. Þetta er auðveldlega hægt að gera með því að breyta því sem er Dockerfile
notað til að byggja upp sérsniðna PHP mynd okkar. Hins vegar þurfa sumar viðbætur auka ósjálfstæði til að vera sett upp í ílátinu. Þú ættir að vísa til lista yfir viðbætur í
PHP opinberu skjölunum til að fara yfir grunnkröfur hverrar viðbyggingar.