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
Persyaratan dan Konvensi Perangkat Lunak yang Digunakan
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 |
-
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, dandocker-compose
, yang merupakan utilitas yang memungkinkan kita mengatur aplikasi multi-kontainer dengan mudah menggunakanyaml
file konfigurasi. Kedua paket tersedia di repositori resmi Ubuntu. Kita dapat menginstalnya melaluiapt
:$ 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
-
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
pilihanmkdir
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 disebutdocker-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 .
-
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, versi3.7
adalah yang terbaru dan direkomendasikan. - 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 iniphp: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 port80
pada host ke port80
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 untukdocker-compose
memerintah. Dengan proyek dan berjalan, jika kita menavigasi kelocalhost
dengan browser kita, kita akan melihat halaman berikut:
halaman phpinfoUntuk 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 denganimage
instruksi yang kami tentukan, kami ingin menggunakan10.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 darivolumes
subbagian dari setiap layanan yang ditentukan. Dalam hal ini kami memanggil volume kamimariadb-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 menggunakanlinks
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 dengandb
name, oleh karena itu kita perlu membuat alias dengan nama yang sama untuk layanan mariadb kita. Inilah tepatnya yanglinks
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 port80
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 PhpMyAdminKami dapat masuk dengan kredensial yang kami tetapkan untuk layanan basis data kami, dan memverifikasi bahwa
testdb
database telah dibuat:
Beranda PhpMyAdminMenggunakan 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 definisiphp-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 menggunakancontext
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.