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 yamlstillingarskrá.
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 cdinn í þ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 phpmappa er þar sem við munum byggja sérsniðin PHP ímynd okkar, nginxmappa mun halda nauðsynlegar skrár til sérsniðna nginx ímynd okkar og appmappa 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-fpmtil 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 í phpmöppunni búðu til skrá sem heitir Dockerfileog 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.ymlskrá
Eins og áður hefur komið fram, docker-composegerir þér kleift að stjórna fjölda gáma í gegnum einfalda stillingarskrá. Þessi stillingarskrá heitir venjulega docker-compose.yml. Búðu til þessa skrá í appmö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.ymlstillingarskrá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 í servicesblokkinni. 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 í phpuppsetningunni 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-composetil um að kortleggja núverandi möppu ( ./) í /appmöppuna inni í ílátinu. Síðasta línan setur /appmö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 í appmöppunni getum við keyrt hvaða skipun sem er í skilgreindum þjónustuíláti með hjálp docker-composeskipunarinnar.
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_DIRog búðu til Dockerfileinni í nginxmö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:9000línuna erum við að vísa til PHP ílátsins með nafni hans inni í servicereitnum í docker-compose.ymlstillingarskránni. Innbyrðis docker-composeskapar 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.ymlskrá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 upbyrjar skipunin aðeins ílátin sem eru ekki þegar ræst. Það athugar muninn á docker-compose.ymlskrá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.phpskrá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 Dockerfilenotað 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.