Menyebarkan Aplikasi PHP Menggunakan Docker-compose

Aplikasi PHP biasanya disusun oleh server web, sistem basis data relasional dan juru bahasa itu sendiri. Dalam tutorial ini kita akan memanfaatkan tumpukan aplikasi PHP lengkap menggunakan buruh pelabuhan. Ini adalah tutorial mendalam di mana kita akan membangun dan mengatur wadah untuk Nginx (server web), MySQL (sistem basis data) dan PHP.

Demi tutorial ini, kami akan menulis aplikasi sederhana yang membaca daftar kota dari database dan menampilkannya di halaman web, dengan cara ini kami akan mendemonstrasikan aplikasi PHP yang dasar namun berfungsi.

Panduan ini mengasumsikan bahwa Anda memiliki Docker-CE yang sudah diinstal dan setidaknya pengetahuan tentang buruh pelabuhan yang minimal. Untuk itu, Anda dapat meninjau tutorial berikut:

Mengonfigurasi lingkungan kerja kami

Aplikasi berbasis buruh pelabuhan kehidupan nyata biasanya akan terdiri dari beberapa kontainer. Mengelola ini secara manual dapat dengan mudah menjadi sangat berantakan dan rumit. Di situlah komposisi buruh pelabuhan berperan. Ini membantu Anda untuk mengelola sejumlah kontainer melalui yamlfile konfigurasi sederhana .

Instal komposisi buruh pelabuhan.

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

Buat folder untuk menampung semua file yang diperlukan dari contoh ini dan kemudian cdke dalamnya. Mulai sekarang, ini adalah direktori kerja kami dan setiap perintah akan dieksekusi di dalam folder ini dan setiap jalur akan dirujuk relatif terhadapnya. Folder ini dapat direferensikan nanti sebagai WORKING_DIR.

mkdir ~/docker
cd ~/docker

Sekarang buat tiga folder lagi.

mkdir php nginx app

The phpfolder di mana kita akan membangun gambar kustom PHP kita, nginxfolder akan memegang file yang diperlukan untuk gambar nginx kebiasaan kami dan appfolder adalah di mana kita akan menempatkan kode sumber dan konfigurasi aplikasi sampel kami.

Mengkonfigurasi wadah PHP

Dalam contoh ini, kita akan gunakan php-fpmuntuk terhubung ke server web Nginx. Kami akan menggunakan gambar dasar PHP resmi. Namun, kami juga perlu menginstal dan mengaktifkan beberapa ekstensi agar kami dapat mengakses database. Di dalam phpfolder, buat file bernama Dockerfiledan masukkan konten berikut ke dalamnya.

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

Perhatikan bahwa kami menggunakan versi Alpine dari gambar PHP resmi. Alpine adalah distribusi yang sangat kecil yang ditargetkan ke kontainer dengan memberikan jejak kaki yang jauh lebih kecil. Juga, perhatikan penggunaan perintah docker-php-ext-install, gambar PHP resmi menyediakan perintah ini untuk memudahkan proses menginstal dan mengkonfigurasi ekstensi PHP.

Sekarang, mari kita buat gambar Docker ini dengan mengeluarkan yang berikut (di dalam kita WORKING_DIR):

docker build -t vultr-php php/

The docker-compose.ymlfile

Seperti yang telah disebutkan, docker-composememungkinkan Anda untuk mengelola sejumlah kontainer melalui file konfigurasi sederhana. File konfigurasi ini biasanya dinamai docker-compose.yml. Buat file ini di dalam appfolder.

touch app/docker-compose.yml

Sekarang masukkan konten berikut ke dalam file ini.

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

Kami akan menjelaskan sintaks ini. Pertama, perhatikan baris pertama.

version: '2'

Ini menentukan versi docker-compose.ymlfile konfigurasi yang digunakan. Baris berikutnya menentukan layanan, atau dengan kata lain, wadah yang akan disediakan.

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

Perhatikan bahwa setiap layanan memiliki kunci spesifik di dalam servicesblok. Nama yang ditentukan di sini akan digunakan untuk referensi wadah khusus ini nanti. Perhatikan juga bahwa di dalam phpkonfigurasi, kami mendefinisikan gambar yang digunakan untuk menjalankan wadah (ini adalah gambar yang kami buat sebelumnya). Kami juga mendefinisikan pemetaan volume.

volumes:
  - ./:/app

Ini memberitahu docker-composeuntuk memetakan direktori saat ini ( ./) ke /appdirektori di dalam wadah. Baris terakhir menetapkan /appfolder di dalam wadah sebagai direktori kerja, yang berarti bahwa ini adalah folder di mana semua perintah di masa depan di dalam wadah secara default dijalankan.

Kita sekarang dapat mengatur wadah kita.

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

Anda dapat menjalankan perintah berikut untuk memastikan bahwa wadah PHP dieksekusi:

docker ps

Cara menjalankan perintah di dalam wadah

Masih di dalam appfolder, kita dapat menjalankan perintah apa pun di dalam wadah layanan yang ditentukan dengan bantuan docker-composeperintah.

docker-compose exec [service] [command]

The [service]placeholder mengacu pada kunci layanan. Dalam kasus kami, ini php. Mari kita jalankan perintah di dalam container untuk memeriksa versi PHP kita.

docker-compose exec php php -v

Anda akan melihat output berikut.

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

Mengkonfigurasi wadah Nginx

Sama seperti wadah PHP, kita perlu membuat gambar khusus untuk server web. Tetapi dalam hal ini, kita hanya perlu menyediakan konfigurasi untuk kita virtual host. Pastikan Anda ada di dalam kami WORKING_DIRdan buat Dockerfiledi dalam nginxfolder:

cd ~/docker
touch nginx/Dockerfile

Sekarang masukkan konten berikut ke dalam ini Dockerfile:

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

Kami menggunakan gambar Nginx default berdasarkan Alpine. Pada file Docker ini kita cukup menyalin file konfigurasi ke pengaturan aplikasi kita. Sebelum membangun gambar ini, buat file konfigurasi.

touch nginx/default.conf

Sekarang isi dengan konten ini.

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

Perhatikan bahwa pada fastcgi_pass php:9000baris ini kita merujuk wadah PHP dengan namanya di dalam serviceblok docker-compose.ymlfile konfigurasi. Secara internal docker-composemembuat jaringan dan menetapkan nama layanan sebagai nama host untuk setiap layanan yang ditentukan. Kita sekarang dapat membangun gambar Nginx.

docker build -t vultr-nginx nginx/

Memperbarui docker-compose.yml

Sekarang perbarui app/docker-compose.ymlfile.

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

Kami hanya menambahkan layanan baru. Konfigurasi hampir sama, kecuali untuk yang berikut.

depends_on:
  - php
ports:
  - 80:80

Setelah wadah Nginx membutuhkan layanan PHP sepenuhnya diinisialisasi, kami memaksakan persyaratan ini dalam depends_onopsi. The portskunci konfigurasi memetakan sebuah port host ke port kontainer, di sini kita memetakan pelabuhan 80di host ke port 80dalam wadah.

Sekarang buat file bernama index.phpdi dalam appfolder dan letakkan yang berikut di dalamnya.

<?php phpinfo();

Pastikan port 80dapat diakses melalui firewall Anda dan jalankan yang berikut ini.

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

Sekali lagi, periksa kembali apakah layanan sudah habis.

docker ps

Buka browser dan akses [vultr-instance-ip]. Anda dapat mengetahui alamat IP instance Vultr Anda dengan menjalankan yang berikut ini.

hostname -I

Anda akan melihat halaman info PHP.

Mengkonfigurasi wadah MySQL

Gambar MySQL resmi memungkinkan Anda untuk mengkonfigurasi wadah melalui variabel lingkungan sederhana. Ini dapat dilakukan dengan environmentopsi di dalam definisi blok layanan. Perbarui ~/docker/app/docker-compose.ymlfile sebagai berikut.

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:

Sekarang kami telah menetapkan layanan baru untuk basis data. Perhatikan garisnya dbdata:/var/lib/mysql. Ini memasang jalur pada wadah /var/lib/mysqlke volume persisten yang dikelola oleh Docker, dengan cara ini data database tetap ada setelah wadah dihapus. Volume ini perlu didefinisikan dalam blok tingkat atas seperti yang dapat Anda lihat di akhir file.

Sebelum mengatur konfigurasi baru kami, mari kita unduh contoh database MySQL. The dokumentasi MySQL resmi menyediakan beberapa database sampel. Kami akan menggunakan basis data dunia yang terkenal. Basis data ini menyediakan daftar negara dan kota. Untuk mengunduh sampel ini, jalankan yang berikut di dalam folder aplikasi kami.

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

Sekarang mari kita mengatur wadah kami.

docker-compose up -d

Seperti yang mungkin sudah Anda perhatikan, docker-compose upperintah mulai hanya wadah yang belum dimulai. Ini memeriksa perbedaan antara docker-compose.ymlfile Anda dan konfigurasi wadah yang sedang berjalan.

Sekali lagi, periksa apakah wadah MySQL sudah dimulai.

docker ps

Sekarang isi database dunia.

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

Anda dapat memverifikasi bahwa basis data diisi dengan memilih data langsung dari basis data. Pertama, akses prompt MySQL di dalam wadah.

docker-compose exec mysql mysql -uroot -proot world

Di prompt MySQL, jalankan yang berikut ini.

select * from city limit 10;

Anda akan melihat daftar kota. Sekarang keluar dari prompt MySQL.

mysql> exit

Membangun aplikasi kita

Sekarang semua wadah yang diperlukan sudah aktif dan berjalan, kita dapat fokus pada aplikasi sampel kami. Perbarui app/index.phpfile sebagai berikut.

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

Jika Anda mengakses [vultr-instance-ip]di browser web, Anda akan melihat daftar kota terpadat di dunia. Selamat, Anda telah menggunakan aplikasi PHP yang berfungsi penuh menggunakan buruh pelabuhan.

Kesimpulan

Dalam tutorial ini, saya telah menunjukkan langkah demi langkah cara mengkonfigurasi aplikasi PHP yang berfungsi penuh. Kami membuat gambar khusus untuk PHP dan Nginx, dan mengkonfigurasikan komposisi buruh pelabuhan untuk mengatur wadah kami. Meskipun sangat mendasar dan sederhana, pengaturan ini mencerminkan skenario kehidupan nyata.

Dalam panduan ini, kami telah membuat dan menandai gambar kami secara lokal. Untuk pengaturan yang lebih fleksibel, Anda dapat mendorong gambar-gambar ini ke register buruh pelabuhan . Anda dapat mendorong ke register buruh pelabuhan resmi atau bahkan mengatur registri buruh pelabuhan Anda sendiri. Bagaimanapun, ini akan memungkinkan Anda untuk membangun gambar Anda di satu host dan menggunakannya di yang lain.

Untuk penggunaan yang lebih rinci docker-compose, Anda harus merujuk ke dokumentasi resmi .

Bergantung pada persyaratan aplikasi Anda dan kerangka kerja PHP yang Anda gunakan, Anda mungkin ingin menambahkan lebih banyak ekstensi. Ini dapat dengan mudah dilakukan dengan memodifikasi yang Dockerfiledigunakan untuk membangun gambar PHP khusus kami. Namun, beberapa ekstensi memerlukan dependensi tambahan untuk dipasang di wadah. Anda harus merujuk ke daftar ekstensi dalam dokumentasi resmi PHP untuk meninjau persyaratan dasar setiap ekstensi.

Tinggalkan Komentar

Cara Memasang Panel Kontrol Hosting Mudah di Ubuntu 16.04

Cara Memasang Panel Kontrol Hosting Mudah di Ubuntu 16.04

Pelajari langkah-langkah untuk memasang Panel Kontrol Hosting Mudah (EHCP) di Ubuntu 16.04 dengan panduan ini.

Wawasan tentang 26 Teknik Analisis Data Besar: Bagian 1

Wawasan tentang 26 Teknik Analisis Data Besar: Bagian 1

Wawasan tentang 26 Teknik Analisis Data Besar: Bagian 1

Fungsionalitas Lapisan Arsitektur Referensi Big Data

Fungsionalitas Lapisan Arsitektur Referensi Big Data

Baca blog untuk mengetahui berbagai lapisan dalam Arsitektur Big Data dan fungsinya dengan cara yang paling sederhana.

6 Hal yang Sangat Menggila dari Nintendo Switch

6 Hal yang Sangat Menggila dari Nintendo Switch

Banyak dari Anda tahu Switch keluar pada Maret 2017 dan fitur-fitur barunya. Bagi yang belum tahu, kami sudah menyiapkan daftar fitur yang membuat 'Switch' menjadi 'gadget yang wajib dimiliki'.

Janji Teknologi Yang Masih Belum Ditepati

Janji Teknologi Yang Masih Belum Ditepati

Apakah Anda menunggu raksasa teknologi untuk memenuhi janji mereka? periksa apa yang belum terkirim.

Bagaimana AI Dapat Membawa Otomatisasi Proses ke Tingkat Selanjutnya?

Bagaimana AI Dapat Membawa Otomatisasi Proses ke Tingkat Selanjutnya?

Baca ini untuk mengetahui bagaimana Kecerdasan Buatan menjadi populer di antara perusahaan skala kecil dan bagaimana hal itu meningkatkan kemungkinan untuk membuat mereka tumbuh dan memberi keunggulan pada pesaing mereka.

Singularitas Teknologi: Masa Depan Peradaban Manusia yang Jauh?

Singularitas Teknologi: Masa Depan Peradaban Manusia yang Jauh?

Saat Sains Berkembang dengan kecepatan tinggi, mengambil alih banyak upaya kita, risiko menundukkan diri kita pada Singularitas yang tidak dapat dijelaskan juga meningkat. Baca, apa arti singularitas bagi kita.

CAPTCHA: Berapa Lama Itu Bisa Tetap Menjadi Teknik yang Layak Untuk Perbedaan Human-AI?

CAPTCHA: Berapa Lama Itu Bisa Tetap Menjadi Teknik yang Layak Untuk Perbedaan Human-AI?

CAPTCHA telah berkembang cukup sulit bagi pengguna untuk dipecahkan dalam beberapa tahun terakhir. Apakah itu akan tetap efektif dalam deteksi spam dan bot di masa mendatang?

Telemedicine Dan Perawatan Kesehatan Jarak Jauh: Masa Depan Ada Di Sini

Telemedicine Dan Perawatan Kesehatan Jarak Jauh: Masa Depan Ada Di Sini

Apa itu telemedicine, perawatan kesehatan jarak jauh dan dampaknya terhadap generasi mendatang? Apakah itu tempat yang bagus atau tidak dalam situasi pandemi? Baca blog untuk menemukan tampilan!

Pernahkah Anda Bertanya-tanya Bagaimana Hacker Menghasilkan Uang?

Pernahkah Anda Bertanya-tanya Bagaimana Hacker Menghasilkan Uang?

Anda mungkin pernah mendengar bahwa peretas menghasilkan banyak uang, tetapi pernahkah Anda bertanya-tanya bagaimana cara mereka mendapatkan uang sebanyak itu? mari berdiskusi.