Docker-compose Kullanarak PHP Uygulaması Dağıtma

PHP uygulamaları genellikle bir web sunucusu, ilişkisel veritabanı sistemi ve dil yorumlayıcısının kendisinden oluşur. Bu derste, docker kullanarak tam bir PHP uygulama yığını kullanacağız. Bu, Nginx (web sunucusu), MySQL (veritabanı sistemi) ve PHP için kaplar oluşturacağımız ve düzenleyeceğimiz derinlemesine bir öğreticidir.

Bu öğretici uğruna, bir veritabanından şehirlerin listesini okuyan ve bir web sayfasında görüntüleyen basit bir uygulama yazacağız, bu şekilde temel, ancak çalışan bir PHP uygulaması göstereceğiz.

Bu kılavuzda, Docker-CE'nin önceden kurulu olduğu ve en azından asgari düzeyde docker bilgisi olduğu varsayılmaktadır. Bu konuda aşağıdaki eğiticileri inceleyebilirsiniz:

Çalışma ortamımızı yapılandırma

Gerçek bir docker tabanlı uygulama tipik olarak birkaç konteynırdan oluşur. Bunları manuel olarak yönetmek oldukça dağınık ve hantal olabilir. Docker-compose devreye giriyor. Basit bir yamlyapılandırma dosyası aracılığıyla birkaç kapsayıcıları yönetmenize yardımcı olur .

Docker-compose uygulamasını yükleyin.

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

Bu örneğin gerekli tüm dosyalarını tutmak için bir klasör oluşturun cd. Şu andan itibaren, bu bizim çalışma dizinimizdir ve her komut bu klasör içinde yürütülür ve her yola, ona göre başvurulur. Bu klasöre daha sonra olarak referans verilebilir WORKING_DIR.

mkdir ~/docker
cd ~/docker

Şimdi üç klasör daha oluşturun.

mkdir php nginx app

phpKlasör bizim özel PHP görüntüsünü inşa edecek nerede olduğu nginxklasörü bizim özel nginx görüntü için gerekli dosyaları yapacak ve appbizim örnek uygulamanın kaynak kodunu ve yapılandırmasını koyarak olacaktır nerede klasördür.

PHP kapsayıcısını yapılandırma

Bu örnekte, php-fpmNginx web sunucusuna bağlanmak için kullanacağız . Resmi PHP temel görüntüsünü kullanacağız. Ancak, veritabanına erişebilmemiz için bazı uzantıları da yüklememiz ve etkinleştirmemiz gerekir. phpKlasörün içinde bir dosya oluşturun Dockerfileve aşağıdaki içerikleri bu dosyaya yerleştirin.

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

Resmi PHP görüntüsünün Alpine sürümünü kullandığımızı unutmayın. Alpine, çok daha küçük ayak izleri sağlayarak konteynerlere yönelik çok küçük bir dağıtımdır. Ayrıca, komutun kullanılmasına dikkat edin, docker-php-ext-installresmi PHP görüntüsü, PHP uzantılarını yükleme ve yapılandırma işlemini kolaylaştırmak için bu komutu sağlar.

Şimdi, bu Docker görüntüsünü aşağıdakileri (bizim içimizde WORKING_DIR) yayınlayarak oluşturalım :

docker build -t vultr-php php/

docker-compose.ymldosya

Daha önce de belirtildiği gibi, docker-composebir dizi kapsayıcıyı basit bir yapılandırma dosyası aracılığıyla yönetmenizi sağlar. Bu yapılandırma dosyası genellikle adlandırılır docker-compose.yml. Bu dosyayı appklasörün içinde oluşturun .

touch app/docker-compose.yml

Şimdi aşağıdaki içeriği bu dosyaya yerleştirin.

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

Bu sözdizimini açıklayacağız. İlk olarak, ilk satırı not edin.

version: '2'

Bu, docker-compose.ymlkullanılan yapılandırma dosyasının sürümünü belirtir . Bir sonraki satır, sağlanacak hizmetleri veya başka bir deyişle kapsayıcıları belirtir.

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

Her hizmetin servicesblok içinde belirli bir anahtarı olduğunu unutmayın . Burada belirtilen ad, daha sonra bu özel kapsayı referans almak için kullanılacaktır. Ayrıca, phpyapılandırma içinde, kapsayıcıyı çalıştırmak için kullanılan görüntüyü tanımladığımızı unutmayın (bu daha önce oluşturduğumuz görüntüdür). Ayrıca bir hacim eşlemesi tanımlarız.

volumes:
  - ./:/app

Bu docker-compose, geçerli dizini ( ./) /appkabın içindeki dizine eşlemenizi söyler . Son satır /app, kapsayıcı içindeki klasörü çalışma dizini olarak ayarlar ; bu, kapsayıcı içindeki gelecekteki tüm komutların varsayılan olarak yürütüldüğü klasör olduğu anlamına gelir.

Artık konteynırlarımızı düzenleyebiliriz.

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

PHP kapsayıcısının yürütüldüğünden emin olmak için aşağıdaki komutu çalıştırabilirsiniz:

docker ps

Kapsayıcıların içindeki komutlar nasıl çalıştırılır

Hala appklasörün içindeyken, komutun yardımıyla tanımlı bir hizmet konteynerinin içindeki herhangi bir komutu çalıştırabiliriz docker-compose.

docker-compose exec [service] [command]

Yer [service]tutucu, hizmet anahtarını ifade eder. Bizim durumumuzda, bu oldu php. PHP sürümümüzü kontrol etmek için kap içinde bir komut çalıştıralım.

docker-compose exec php php -v

Aşağıdaki çıktıyı göreceksiniz.

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 kapsayıcısını yapılandırma

Tıpkı PHP konteyneri gibi, web sunucusu için özel bir resim oluşturmamız gerekiyor. Ancak bu durumda, bizim için bir yapılandırma sağlamalıyız virtual host. İçimizde bulunduğunuzdan ve klasörün içinde WORKING_DIRbir tane oluşturduğunuzdan emin olun :Dockerfilenginx

cd ~/docker
touch nginx/Dockerfile

Şimdi aşağıdaki içeriği buna ekleyin Dockerfile:

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

Alpine tabanlı varsayılan Nginx görüntüsünü kullanıyoruz. Bu Docker dosyasında bir yapılandırma dosyasını uygulama kurulumumuza kopyalarız. Bu resmi oluşturmadan önce bir yapılandırma dosyası oluşturun.

touch nginx/default.conf

Şimdi bu içerikle doldurun.

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

fastcgi_pass php:9000Satırda, PHP kapsayıcısına yapılandırma dosyası servicebloğunun içindeki adıyla atıfta bulunduğumuzu unutmayın docker-compose.yml. Dahili olarak docker-composebir ağ oluşturur ve tanımlanan hizmetlerin her birine ana makine adı olarak hizmet adını atar. Şimdi Nginx görüntüsünü oluşturabiliriz.

docker build -t vultr-nginx nginx/

Güncelleniyor docker-compose.yml

Şimdi app/docker-compose.ymldosyayı güncelleyin .

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

Yalnızca yeni bir hizmet ekledik. Yapılandırma aşağıdakiler dışında neredeyse aynıdır.

depends_on:
  - php
ports:
  - 80:80

Nginx konteynerinin tamamen başlatılması için PHP hizmetine ihtiyacı olduğunda, bu gereksinimi depends_onseçenekte zorlarız. portsYapılandırma anahtarı burada port map, bir konteyner limanına ev sahibi portu eşler 80noktasına konakta 80kapta.

Şimdi klasörün index.phpiçinde adlandırılan bir dosya oluşturun appve aşağıdakileri içine koyun.

<?php phpinfo();

Bağlantı noktasına 80güvenlik duvarınızdan erişilebilir olduğundan emin olun ve aşağıdakileri yürütün.

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

Bir kez daha, servisin çalışıp çalışmadığını bir kez daha kontrol edin.

docker ps

Bir tarayıcı açın ve erişin [vultr-instance-ip]. Aşağıdakileri çalıştırarak Vultr örneği IP adresinizi öğrenebilirsiniz.

hostname -I

PHP bilgi sayfasını göreceksiniz.

MySQL kapsayıcısını yapılandırma

Resmi MySQL görüntüsü, kapsayıcıyı basit ortam değişkenleri aracılığıyla yapılandırmanıza olanak tanır. Bu environment, servis bloğu tanımının içindeki bir seçenekle yapılabilir . ~/docker/app/docker-compose.ymlDosyayı aşağıdaki şekilde güncelleyin .

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:

Şimdi veritabanı için yeni bir hizmet tanımladık. Çizgiye dikkat edin dbdata:/var/lib/mysql. Bu, kaptaki yolu /var/lib/mysqlDocker tarafından yönetilen kalıcı bir birime bağlar, böylece kapsayıcı kaldırıldıktan sonra veritabanı verileri devam eder. Dosyanın sonunda görebileceğiniz gibi, bu birimin üst düzey bir blokta tanımlanması gerekir.

Yeni yapılandırmamızı düzenlemeden önce örnek bir MySQL veritabanı indirelim. Resmi MySQL belgelerine bazı örnek veritabanlarını sağlar. Tanınmış dünya veritabanını kullanacağız. Bu veritabanı, ülkelerin ve şehirlerin bir listesini sağlar. Bu örneği indirmek için uygulama klasörümüzde aşağıdakileri yürütün.

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

Şimdi konteynırlarımızı düzenleyelim.

docker-compose up -d

Daha önce fark etmiş olabileceğiniz gibi, docker-compose upkomut yalnızca henüz başlatılmamış kapları başlatır. docker-compose.ymlDosyanızla çalışan kapsayıcıların geçerli yapılandırması arasındaki farkları denetler .

Bir kez daha, MySQL konteynerinin başlatıldığını kontrol edin.

docker ps

Şimdi dünya veritabanını doldurun.

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

Doğrudan veritabanından veri seçerek veritabanının doldurulduğunu doğrulayabilirsiniz. Önce kabın içindeki MySQL komut istemine erişin.

docker-compose exec mysql mysql -uroot -proot world

MySQL komut isteminde aşağıdakileri çalıştırın.

select * from city limit 10;

Şehirlerin bir listesini göreceksiniz. Şimdi MySQL komut isteminden çıkın.

mysql> exit

Uygulamamızı oluşturma

Artık tüm gerekli konteynerler çalışıyor ve çalışıyor, örnek uygulamamıza odaklanabiliriz. app/index.phpDosyayı aşağıdaki şekilde güncelleyin .

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

[vultr-instance-ip]Bir web tarayıcısına erişirseniz , dünyanın en kalabalık şehirlerinin bir listesini görürsünüz. Tebrikler, docker kullanarak tamamen çalışan bir PHP uygulaması dağıttınız.

Sonuç

Bu derste, tam olarak çalışan bir PHP uygulamasını nasıl yapılandıracağımı adım adım gösterdim. PHP ve Nginx için özel görüntüler oluşturduk ve docker-compose'u konteynerlerimizi düzenlemek için yapılandırdık. Çok basit ve basit olmasına rağmen, bu kurulum gerçek bir yaşam senaryosunu yansıtır.

Bu kılavuzda, görüntülerimizi yerel olarak oluşturduk ve etiketledik. Daha esnek bir kurulum için, bu görüntüleri bir docker kayıt defterine gönderebilirsiniz . Resmi liman işçisi kayıt defterine geçebilir, hatta kendi liman işçisi kayıt defterinizi bile oluşturabilirsiniz. Her durumda, bu, görüntülerinizi bir ana bilgisayarda oluşturmanıza ve başka bir bilgisayarda kullanmanıza olanak tanır.

Ürününün daha ayrıntılı kullanımı docker-composeiçin resmi belgelere başvurmalısınız .

Uygulama gereksinimlerinize ve kullandığınız PHP çerçevesine bağlı olarak, daha fazla uzantı eklemek isteyebilirsiniz. Bu, Dockerfileözel PHP imajımızı oluşturmak için kullanılanı değiştirerek kolayca yapılabilir . Ancak, bazı uzantıların kapsayıcıya yüklenmesi için ek bağımlılıklara gereksinimi vardır. Her bir uzantının temel gereksinimlerini gözden geçirmek için PHP resmi belgelerindeki uzantı listesine başvurmalısınız .

Yorum bırak

CentOS 7de LibreNMS Kullanarak Cihazlarınızı İzleyin

CentOS 7de LibreNMS Kullanarak Cihazlarınızı İzleyin

CentOS 7 üzerinde LibreNMS kullanarak ağ cihazlarınızı etkili bir şekilde izleyin. Ağ izleme için gerekli adımları ve yapılandırmaları öğrenin.

Counter-Strike: Global Offensive Server Nasıl Kurulur?

Counter-Strike: Global Offensive Server Nasıl Kurulur?

Counter-Strike: Global Offensive sunucusu kurmak için gerekli adımlar. Gerekli araçlar ve yükleme süreci hakkında bilgi.

Ubuntu 16.04 LTS Üzerinde OpenNMS Kurulumu

Ubuntu 16.04 LTS Üzerinde OpenNMS Kurulumu

OpenNMS, çok sayıda cihazı izlemek ve yönetmek için kullanılabilen bir açık kaynak ağ yönetim platformudur. Ubuntu 16.04 LTS üzerinde OpenNMS kurulumu için tüm adımları keşfedin.

Ubuntu 16.04te LibreNMS Kullanarak Cihazlarınızı İzleyin

Ubuntu 16.04te LibreNMS Kullanarak Cihazlarınızı İzleyin

Farklı Bir Sistem mi Kullanıyorsunuz? LibreNMS tam özellikli bir açık kaynak ağ izleme sistemidir.

26 Büyük Veri Analitik Tekniğine Bir Bakış: 1. Bölüm

26 Büyük Veri Analitik Tekniğine Bir Bakış: 1. Bölüm

26 Büyük Veri Analitik Tekniğine Bir Bakış: 1. Bölüm

Büyük Veri Referans Mimarisi Katmanlarının İşlevleri

Büyük Veri Referans Mimarisi Katmanlarının İşlevleri

Büyük Veri Mimarisindeki farklı katmanları ve işlevlerini en basit şekilde öğrenmek için blogu okuyun.

Nintendo Switch Hakkında Son Derece Çılgın 6 Şey

Nintendo Switch Hakkında Son Derece Çılgın 6 Şey

Birçoğunuz Switch'in Mart 2017'de çıkacağını ve yeni özelliklerini biliyorsunuz. Bilmeyenler için, 'Switch'i 'olmazsa olmaz bir gadget' yapan özelliklerin bir listesini hazırladık.

Hala Teslim Edilmeyen Teknoloji Sözleri

Hala Teslim Edilmeyen Teknoloji Sözleri

Teknoloji devlerinin sözlerini yerine getirmesini mi bekliyorsunuz? teslim edilmeyenleri kontrol edin.

Yapay Zeka Süreç Otomasyonunu Nasıl Bir Sonraki Seviyeye Taşıyabilir?

Yapay Zeka Süreç Otomasyonunu Nasıl Bir Sonraki Seviyeye Taşıyabilir?

Yapay Zekanın küçük ölçekli şirketler arasında nasıl popüler hale geldiğini ve onları büyütme ve rakiplerine üstünlük sağlama olasılıklarını nasıl artırdığını öğrenmek için bunu okuyun.

Teknolojik Tekillik: İnsan Uygarlığının Uzak Bir Geleceği mi?

Teknolojik Tekillik: İnsan Uygarlığının Uzak Bir Geleceği mi?

Bilim hızla gelişip birçok çabamızı üstlendikçe, kendimizi açıklanamaz bir Tekilliğe maruz bırakmanın riskleri de artıyor. Okuyun, tekillik bizim için ne anlama gelebilir.