GNU/Linux >> Belajar Linux >  >> Ubuntu

Cara membuat tumpukan LAMP berbasis buruh pelabuhan menggunakan buruh pelabuhan di Ubuntu 20.04

Tumpukan LAMP

LAMP adalah tumpukan perangkat lunak yang mungkin digunakan sebagian besar situs web. Linux merupakan dasar dari tumpukan, dan implementasi tradisional termasuk Apache sebagai server web, database MySQL, dan PHP sebagai bahasa pemrograman sisi server. Namun, ada banyak kemungkinan variasi:MariaDB, misalnya, sering digunakan sebagai pengganti MySQL, yang merupakan fork, dan bahasa pemrograman lainnya, karena Python atau Perl dapat digunakan sebagai pengganti PHP. Dalam artikel ini kita akan melihat cara mengimplementasikan tumpukan LAMP dasar menggunakan docker dan utilitas docker-compose.

Dalam tutorial ini Anda akan mempelajari:

  • Cara menginstal docker dan docker-compose di Ubuntu 20.04
  • Cara mendefinisikan layanan dan volume menggunakan docker-compose
  • Cara memetakan port host ke port container di file konfigurasi docker-compose
  • Cara menggunakan bind mount dan volume bernama
  • Cara membangun proyek dengan docker-compose

Cara membuat tumpukan LAMP berbasis buruh pelabuhan menggunakan buruh pelabuhan di Ubuntu 20.04

Persyaratan dan Konvensi Perangkat Lunak yang Digunakan

Persyaratan Perangkat Lunak dan Konvensi Baris Perintah Linux
Kategori Persyaratan, Konvensi, atau Versi Perangkat Lunak yang Digunakan
Sistem Instal Ubuntu 20.04 atau Upgrade Ubuntu ke 20.04 Focal Fossa
Perangkat Lunak docker, komposisi buruh pelabuhan
Lainnya Izin root untuk membuat container buruh pelabuhan dan meluncurkan layanan buruh pelabuhan
Konvensi # – membutuhkan perintah linux yang diberikan untuk dieksekusi dengan hak akses root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah
$ – membutuhkan perintah linux yang diberikan untuk dieksekusi sebagai pengguna biasa yang tidak memiliki hak istimewa
  1. Menginstal paket dan memulai layanan buruh pelabuhan

    Untuk membuat tumpukan LAMP berbasis Docker di Ubuntu 20.04 Focal Fossa, hal pertama yang harus kita lakukan adalah menginstal perangkat lunak yang kita butuhkan:docker sendiri, dan docker-compose , yang merupakan utilitas yang memungkinkan kita mengatur aplikasi multi-kontainer dengan mudah menggunakan yaml file konfigurasi. Kedua paket tersedia di repositori resmi Ubuntu. Kita dapat menginstalnya melalui apt :

    $ sudo apt install docker docker-compose
    

    Setelah instalasi selesai kita harus memulai docker service dan aktifkan saat boot. Kita dapat melakukan kedua operasi dengan satu perintah tunggal:

    $ systemctl enable --now docker
    
  2. Penyiapan proyek

    Langkah pertama dalam perjalanan kita terdiri dari pembuatan direktori yang akan kita gunakan sebagai root dari proyek kita. Demi artikel ini kami akan menyebutnya linuxconfig . Di dalam direktori ini kita akan membuat satu lagi, DocumentRoot , yang akan menghosting file situs web kami. Kita dapat membuat kedua direktori sekaligus menggunakan -p pilihan mkdir perintah:

    $ mkdir -p linuxconfig/DocumentRoot
    

    Di dalam linuxconfig direktori, kami mendefinisikan konfigurasi docker-compose untuk proyek kami di dalam file yaml, yang secara default harus disebut docker-compose.yml . Ada tiga bait utama yang dapat kita gunakan dalam file konfigurasi:services , volume dan jaringan .

    Setiap bagian digunakan untuk mengonfigurasi aspek proyek yang sesuai. Dalam tutorial ini kita hanya akan menggunakan dua yang pertama. Kami akan mengimplementasikan komponen tumpukan LAMP sebagai layanan di dalam wadah terpisah mereka sendiri.

    Wadah yang dibuat dengan docker-compose akan menjadi anggota jaringan yang sama dan oleh karena itu akan dapat berbicara satu sama lain secara default. Dalam jaringan, setiap wadah akan dapat merujuk yang lain dengan nama host yang identik dengan namanya, atau dengan nama yang digunakan untuk mendefinisikan layanan yang diterapkan oleh wadah.

    Secara default container akan diberi nama menggunakan nama direktori yang berisi file konfigurasi sebagai awalan. Dalam hal ini, misalnya, wadah yang digunakan untuk layanan yang disebut php-httpd , akan diberi nama linuxconfig_php-httpd_1 .

  3. Mendefinisikan layanan php + httpd

    Layanan pertama yang akan kita definisikan dalam file konfigurasi akan menyertakan PHP sebagai modul server web Apache. Kami akan menggunakan salah satu gambar PHP resmi yang tersedia di dockerhub sebagai basis untuk container kita, khususnya container dengan -apache akhiran, yang menyediakan pengaturan yang kami sebutkan di atas. Mari kita mulai menulis konfigurasi kita:

    version: '3.7'
    
    services:
        php-httpd:
            image: php:7.3-apache
            ports:
                - 80:80
            volumes:
                - "./DocumentRoot:/var/www/html"
    
    

    Hal pertama yang kami tentukan dalam file konfigurasi adalah version . Dengan instruksi ini kami mendeklarasikan versi spesifik dari file penulisan yang akan kami gunakan. Pada saat penulisan, versi 3.7 adalah yang terbaru dan direkomendasikan.

  4. Setelah mendeklarasikan versi file penulisan, kami mulai menulis layanan bait; di dalamnya kami mendefinisikan layanan yang akan menyusun tumpukan LAMP kami. Kami memanggil layanan pertama php-httpd . Nama layanan benar-benar arbitrer, tetapi selalu merupakan kebiasaan yang baik untuk menggunakan yang bermakna dalam konteks proyek.

    image instruksi digunakan untuk menentukan pada gambar mana wadah harus didasarkan, dalam hal ini php:7.3-apache .

    ports instruksi digunakan untuk mengekspos port pada container, dan untuk membuat peta antara port host dan port container. Peta tersebut didefinisikan dengan memisahkan port dengan : . Di sisi kiri kami menentukan port host, dan di sebelah kanan, port di dalam wadah itu harus dipetakan. Dalam hal ini kami memetakan port 80 pada host ke port 80 pada container, karena ini adalah port default yang digunakan oleh server web Apache.

    Instruksi terakhir yang kami gunakan adalah volumes :dengan itu kita dapat menentukan pemetaan antara volume bernama atau jalur (relatif atau absolut) pada sistem host ke jalur pada wadah, di mana ia akan dipasang.

    Dalam pengaturan kami, ./DocumentRoot direktori akan meng-host file situs:itu akan dipasang di /var/www/html direktori di dalam wadah, karena yang terakhir adalah root dokumen yang digunakan oleh Apache VirtualHost default. Pengaturan seperti itu disebut bind mount dan sangat berguna selama pengembangan karena perubahan yang kami buat pada file proyek, segera tercermin di dalam wadah. Kelemahan dari konfigurasi ini adalah membuat ketergantungan antara wadah dan struktur file mesin host, mengurangi salah satu keuntungan utama menggunakan Docker:portabilitas.

    Direktori yang akan dipasang di dalam container akan dibuat secara otomatis jika tidak ada saat docker-compose up perintah diluncurkan:dalam hal ini akan dimiliki oleh root jika tidak ditentukan lain.

    Di dalam DocumentRoot direktori kami sekarang dapat membuat file indeks, dan mencoba membangun proyek kami untuk memverifikasi bahwa pengaturan berfungsi:

    $ echo "<?php phpinfo();" > DocumentRoot/index.php
    $ sudo docker-compose up -d
    

    Setelah menjalankan perintah, gambar buruh pelabuhan yang diperlukan akan diunduh dari dockerhub dan wadah yang kita buat dengan pengaturan yang kita sediakan dan jalankan di latar belakang (tidak akan memblokir terminal), karena -d opsi yang kami sediakan untuk docker-compose memerintah. Dengan proyek dan berjalan, jika kita menavigasi ke localhost dengan browser kita, kita akan melihat halaman berikut:



    halaman phpinfo

    Untuk menghentikan proyek, dari direktori yang menghosting docker-compose.yml file, kita dapat menjalankan:

    $ sudo docker-compose stop
    

    Mendefinisikan layanan MariaDB

    Bagian penting dari tumpukan LAMP adalah lapisan database. Dalam konfigurasi kami, kami akan menggunakan MariaDB dan gambar buruh pelabuhan resminya tersedia di buruh pelabuhan:

    version: '3.7'
    
    services:
        php-httpd:
            image: php:7.3-apache
            ports:
                - 80:80
            volumes:
                - "./DocumentRoot:/var/www/html"
    
        mariadb:
            image: mariadb:10.5.2
            volumes:
                - mariadb-volume:/var/lib/mysql
            environment:
                TZ: "Europe/Rome"
                MYSQL_ALLOW_EMPTY_PASSWORD: "no"
                MYSQL_ROOT_PASSWORD: "rootpwd"
                MYSQL_USER: 'testuser'
                MYSQL_PASSWORD: 'testpassword'
                MYSQL_DATABASE: 'testdb'
    
    volumes:
        mariadb-volume:
    

    Di dalam layanan bait, kami mendefinisikan layanan lain dan menyebutnya mariadb dan dengan image instruksi yang kami tentukan, kami ingin menggunakan 10.5.2 versi gambar resmi.

    Dalam definisi layanan sebelumnya, kami menggunakan bind mount. Kali ini, sebagai gantinya, kami menggunakan buruh pelabuhan yang tepat volume bernama , untuk dipasang di /var/lib/mysql di dalam wadah (ini adalah direktori data default yang digunakan oleh MariaDB). Tidak seperti mount bind, volume bernama tidak membuat dependensi wadah pada struktur sistem file host. Dikelola sepenuhnya oleh Docker, ini adalah metode yang direkomendasikan untuk menyimpan data yang jika tidak, akan hilang saat kontainer dihancurkan.

    Volume bernama dapat ditentukan dalam volumes utama bait dari file konfigurasi dan dapat dirujuk dari volumes subbagian dari setiap layanan yang ditentukan. Dalam hal ini kami memanggil volume kami mariadb-volume .

    Sebagai langkah selanjutnya, kami mendefinisikan nilai dari beberapa variabel lingkungan digunakan untuk mempengaruhi perilaku kontainer. Variabel lingkungan didefinisikan dalam environment bagian dari definisi layanan. Variabel yang kami definisikan dalam kasus ini memiliki efek berikut:

    Variabel Efek
    TZ Setel zona waktu yang digunakan oleh server MariaDB
    MYSQL_ALLOW_EMPTY_PASSWORD Mengaktifkan atau menonaktifkan penggunaan sandi kosong untuk pengguna root db
    MYSQL_ROOT_PASSWORD Ini adalah variabel wajib dan digunakan untuk mengatur kata sandi pengguna root db
    MYSQL_DATABASE Opsional digunakan untuk menentukan nama database yang akan dibuat pada startup gambar
    MYSQL_USER Opsional digunakan untuk menentukan nama pengguna yang akan dibuat dengan izin pengguna super untuk database yang ditentukan dengan MYSQL_DATABASE
    MYSQL_PASSWORD Digunakan untuk menentukan sandi untuk pengguna yang dibuat dengan nama yang diberikan oleh MYSQL_USER

    Pada titik ini kita harus memiliki server web yang berfungsi yang dapat bekerja dengan PHP, dan database untuk menyimpan data kita.

    Bonus – phpMyAdmin

    Tumpukan LAMP dasar kami sekarang harus lengkap. Sebagai bonus, kami mungkin ingin menambahkan phpMyAdmin untuk itu, untuk mengontrol database MariaDB kami dengan mudah dari antarmuka web yang ramah pengguna. Mari tambahkan definisi layanan terkait ke konfigurasi komposisi buruh pelabuhan kami:

    version: '3.7'
    
    services:
        php-httpd:
            image: php:7.3-apache
            ports:
                - 80:80
            volumes:
                - "./DocumentRoot:/var/www/html"
    
        mariadb:
            image: mariadb:10.5.2
            volumes:
                - mariadb-volume:/var/lib/mysql
            environment:
                TZ: "Europe/Rome"
                MYSQL_ALLOW_EMPTY_PASSWORD: "no"
                MYSQL_ROOT_PASSWORD: "rootpwd"
                MYSQL_USER: 'testuser'
                MYSQL_PASSWORD: 'testpassword'
                MYSQL_DATABASE: 'testdb'
    
        phpmyadmin:
            image: phpmyadmin/phpmyadmin
            links:
                - 'mariadb:db'
            ports:
                - 8081:80
    
    volumes:
        mariadb-volume:
    

    Kami menamai layanan kami phpmyadmin dan mengonfigurasinya untuk menggunakan phpmyadmin/phpmyadmin gambar dari dockerhub. Kami juga menggunakan links kata kunci untuk pertama kalinya; untuk apa ini? Seperti yang telah kita ketahui, secara default, dan tanpa memerlukan konfigurasi khusus, semua container yang dibuat dalam konfigurasi docker-compose yang sama dapat saling berbicara. Gambar phpMyAdmin dikonfigurasi untuk mereferensikan wadah database yang sedang berjalan dengan db name, oleh karena itu kita perlu membuat alias dengan nama yang sama untuk layanan mariadb kita. Inilah tepatnya yang links digunakan untuk:mendefinisikan alias tambahan untuk menjangkau layanan dari layanan lain.

    Di dalam definisi layanan kami juga memetakan port 8081 dari mesin host kami, ke port 80 di dalam wadah (port 80 sudah dipetakan ke port yang sama di dalam wadah php-httpd). Oleh karena itu, antarmuka phpMyAdmin akan dapat dijangkau di localhost:8081 alamat. Mari kita membangun kembali proyek kita dan memverifikasinya:

    $ sudo docker-compose up -d --build
    


    Halaman login PhpMyAdmin

    Kami dapat masuk dengan kredensial yang kami tetapkan untuk layanan basis data kami, dan memverifikasi bahwa testdb database telah dibuat:



    Beranda PhpMyAdmin

    Menggunakan gambar khusus untuk layanan

    Dalam contoh di atas, kami selalu menggunakan gambar vanilla dalam definisi layanan kami. Ada kasus di mana kami mungkin ingin menggunakan gambar buruh pelabuhan khusus berdasarkan gambar tersebut. Misalnya, kita ingin membangun layanan php-httpd, tetapi menyertakan ekstensi php tambahan:bagaimana kita bisa melakukannya? Di root proyek, kami mendefinisikan direktori baru, dan untuk memudahkan memberi nama setelah layanan:

    $ mkdir php-httpd
    

    Di dalam direktori ini kami membuat Dockerfile, yang digunakan untuk memperluas gambar dasar, dengan konten berikut:

    FROM php:7.3-apache
    LABEL maintainer="[email protected]"
    
    RUN apt-get update && apt-get install -y libmcrypt-dev \
        && pecl install mcrypt-1.0.2 \
        && docker-php-ext-enable mcrypt
    

    Kembali ke docker-compose.yml our kami file, kami memodifikasi definisi php-httpd melayani. Kami tidak dapat mereferensikan gambar secara langsung seperti yang kami lakukan sebelumnya. Sebagai gantinya, kami menentukan direktori yang berisi Dockerfile khusus kami sebagai konteks build:

    version: '3.7'
    
    services:
        php-httpd:
            build:
                context: ./php-httpd
            ports:
                - 80:80
            volumes:
                - "./DocumentRoot:/var/www/html"
    [...]
    

    Dalam build bagian kami mendefinisikan konfigurasi yang diterapkan pada waktu pembuatan. Dalam hal ini, kami menggunakan context untuk mereferensikan direktori yang berisi Dockerfile:direktori tersebut digunakan sebagai konteks build, dan kontennya dikirim ke daemon Docker saat container dibuat. Untuk menerapkan modifikasi, kita harus membangun kembali proyek.

    Omong-omong, untuk mengetahui lebih lanjut tentang ekstensi tambahan di gambar buruh pelabuhan php, Anda dapat melihat dokumentasi resmi, dan khususnya ekstensi PECL bagian.

    Kesimpulan

    Dalam tutorial ini kita melihat bagaimana membangun tumpukan LAMP dasar menggunakan teknologi container dengan Docker dan docker-compose. Kami melihat cara mendefinisikan berbagai layanan di dalam file konfigurasi docker-compose.yml, dan cara mengonfigurasi bind mount, volume bernama, dan pemetaan port host-container. Kami juga melihat cara menggunakan gambar khusus. Anda dapat melihat referensi docker-compose untuk daftar detail instruksi yang dapat digunakan di dalam file konfigurasi docker-compose.


Ubuntu
  1. Cara Memasang LAMP Stack di Ubuntu 18.04

  2. Cara Menggunakan Modul Wayang untuk Membuat Tumpukan LAMP di Ubuntu 20.04

  3. Cara membuat array RAID menggunakan MDADM di Ubuntu

  1. Cara membuat VPN di Ubuntu 20.04 menggunakan Wireguard

  2. Cara menginstal Docker di Ubuntu 22.04

  3. Cara Menginstal WordPress di Ubuntu 18.04 Menggunakan LAMP Stack

  1. Cara Menginstal Wiki Basis Pengetahuan Garis Besar di Ubuntu menggunakan Docker

  2. Cara Mengelola Kontainer Docker menggunakan Portainer di Ubuntu

  3. Cara membuat VPC menggunakan Python Boto3 di Ubuntu