Loading...

Deploy Laravel, Nginx, MySQL Menggunakan Docker Compose

 

Framework PHP merupakan kerangka kerja PHP dengan menggunakan konsep MVC (Model-View-Conteller). Sebagai langkah pertama kita akan mencoba membuat projek baru dengan menggunakan laravel terbaru, termaksud juga composer pengelola paket untuk PHP.

Silahkan instal docker engine dan docker compose terlebih dahulu

Pertama masuk ke directori home menggunakan terminal dan salin perintah di bawah ini.

$ cd ~
$ git clone https://github.com/laravel/laravel.git laravel-app

Pindah ke laravel-app directori.

$ cd ~/laravel-app

Selanjutnya gunakan docker compose untuk memasang directori yang kamu butuhkan untuk project laravel.

$ docker run --rm -v $(pwd):/app composer install

Degan menggunakan flag -v dan --rm dengan docker run akan membuat container ephemeral yang akan di-bind-mount ke direktori Anda saat ini sebelum dihapus. Ini akan menyalin konten direktori ~/laravel-app Anda ke wadah dan juga memastikan bahwa folder vendor yang dibuat Composer di dalam wadah disalin ke direktori Anda saat ini.

Sebagai langkah terakhir, tetapkan izin pada direktori proyek agar dimiliki oleh pengguna non-root Anda.

$ sudo chown -R $USER:$USER ~/laravel-app

Dengan menggunakan perintah proses di atas, kamu bisa menjalankannya tanpa perlu menggunakan user root. Gunakan teks editor dan buat file bernama docker-compose.yml di dalam direktori larevel-app.

version: '3'
services:

#PHP Service
app:
build:
context: .
dockerfile: Dockerfile
image: digitalocean.com/php
container_name: app
restart: unless-stopped
tty: true
environment:
SERVICE_NAME: app
SERVICE_TAGS: dev
working_dir: /var/www
networks:
- app-network

#Nginx Service
webserver:
image: nginx:alpine
container_name: webserver
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
networks:
- app-network

#MySQL Service
db:
image: mysql:5.7.22
container_name: db
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: laravel
MYSQL_ROOT_PASSWORD: your_mysql_root_password
SERVICE_TAGS: dev
SERVICE_NAME: mysql
networks:
- app-network

#Docker Networks
networks:
app-network:
driver: bridge

  • app: Definisi layanan ini berisi aplikasi Laravel dan menjalankan image Docker kustom, digitalocean.com/php, yang akan Anda tentukan di Langkah 4. Ini juga menyetel working_dir di container ke /var/www. server 
  • web: Definisi layanan ini menarik gambar nginx:alpine dari Docker dan memperlihatkan port 80 dan 443. 
  • db: Definisi layanan ini menarik gambar mysql:5.7.22 dari Docker dan menentukan beberapa variabel lingkungan, termasuk database bernama laravel untuk aplikasi Anda dan kata sandi root untuk database. Anda bebas memberi nama database apa pun yang Anda inginkan, dan Anda harus mengganti your_mysql_root_password dengan kata sandi kuat Anda sendiri. Definisi layanan ini juga memetakan port 3306 di host ke port 3306 di container.
Setiap container_name properti akan menentukan nama container yang sesuai dengan nama layanan. Jika kamu tidak menentukannya maka docker akan menetapkan nama untuk setiap container dan menggabungkannya.

Di dalam docker_compose file tersebut masukan reseourch di bawah ini ke dalamnya.
...
#MySQL Service
db:
...
volumes:
- dbdata:/var/lib/mysql
networks:
- app-network
...
Di bagian bawah file, tambahkan defenisi s volume.
dbdata
...
#Volumes
volumes:
dbdata:
driver: local
Untuk lebih jelasnya kamu bisa langasung saling kode di bawah ini dan masukan ke dalam docker_compose
version: '3'
services:

#PHP Service
app:
build:
context: .
dockerfile: Dockerfile
image: digitalocean.com/php
container_name: app
restart: unless-stopped
tty: true
environment:
SERVICE_NAME: app
SERVICE_TAGS: dev
working_dir: /var/www
volumes:
- ./:/var/www
- ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
networks:
- app-network

#Nginx Service
webserver:
image: nginx:alpine
container_name: webserver
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www
- ./nginx/conf.d/:/etc/nginx/conf.d/
networks:
- app-network

#MySQL Service
db:
image: mysql:5.7.22
container_name: db
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: laravel
MYSQL_ROOT_PASSWORD: your_mysql_root_password
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
- dbdata:/var/lib/mysql/
- ./mysql/my.cnf:/etc/mysql/my.cnf
networks:
- app-network

#Docker Networks
networks:
app-network:
driver: bridge
#Volumes
volumes:
dbdata:
driver: local
Save file dan keluar dari terminal, kemudian di dalam ~/laravel-app buatlah file dengan nama dockerfile.
$ nano ~/laravel-app/Dockerfile
dockerfile akan mengatur image dasar dan menentukan perintah dan instruksi yang diperlukan untuk membangun image aplikasi Laravel. Tambahkan kode berikut ke file:
FROM php:7.2-fpm

# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/

# Set working directory
WORKDIR /var/www

# Install dependencies
RUN apt-get update && apt-get install -y \
build-essential \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
locales \
zip \
jpegoptim optipng pngquant gifsicle \
vim \
unzip \
git \
curl

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install extensions
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
RUN docker-php-ext-install gd

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www

# Copy existing application directory contents
COPY . /var/www

# Copy existing application directory permissions
COPY --chown=www:www . /var/www

# Change current user to www
USER www

# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]
Langkah berikutnya ialah melakukan konfigurasi php, peritah yang di gunakan untuk melakukan konfigurasi php seperti di bawah ini.
$ mkdir ~/laravel-app/php
Di dalam folder php buat file dengan nama local.ini dengan perintah berikut.
$ nano ~/laravel-app/php/local.ini
Untuk mendemonstrasikan cara mengonfigurasi PHP, ktambahkan kode berikut untuk menetapkan batasan ukuran untuk file yang diunggah ke dalam file local.ini.
upload_max_filesize=40M
post_max_size=40M
Jika sudah save dan keluar dari editor. Langkah berikutnya ialah melakukan konfigurasi nginx, untuk konfigurasinya silahkan buat file app.conf di dalam file $ ~/laravel-app/nginx/conf.d/.

Pertama buat dulu file direktori nginx/conf.d/.
$ mkdir -p ~/laravel-app/nginx/conf.d
lalu buat app.conf file configurasi.
$ nano ~/laravel-app/nginx/conf.d/app.conf
dan tambahkan code di bawah ini ke dalam app.conf untuk menentukan configurasi nginx.
server {
listen 80;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/public;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}
Setelah berhasil melakukan konfigurasi PHP dan nginx, kamu udah bisa mengaktifkan MySQL sebagai database pada aplikasi, pertama buat directori mysql.
$ mkdir ~/laravel-app/mysql
Jika sudah buat file my.cnf ke dalam directori mysql.
$ nano ~/laravel-app/mysql/my.cnf
Dalam file, tambahkan kode berikut untuk mengaktifkan log kueri dan menyetel lokasi file log:
[mysqld]
general_log = 1
general_log_file = /var/lib/mysql/general.log
Selanjutnya menentukan semua layanan Anda di docker-composefile Anda dan membuat file konfigurasi untuk layanan ini, Anda dapat memulai wadah. Namun, sebagai langkah terakhir, kami akan membuat salinan .env.example file yang disertakan Laravel secara default dan menamai copy .env, yang merupakan file yang diharapkan Laravel untuk mendefinisikan lingkungannya:
$ cp .env.example .env
Kemudian memodifikasi .env file pada app penampung untuk memasukkan detail spesifik penyiapan.
$ nano .env
Temukan blok yang ditentukan DB_CONNECTION dan perbarui.
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=your_laravel_db_password
Simpan perubahan Anda dan keluar dari editor, setelah itu masukan perintah berikut.
$ docker-compose up -d
Saat kamu menjalankan docker-compose up untuk pertama kali, itu akan mengunduh semua gambar Docker yang diperlukan, yang mungkin memerlukan waktu cukup lama. Setelah gambar diunduh dan disimpan di mesin lokal Anda, Compose akan membuat wadah Anda. Bendera -d melakukan daemonisasi proses, menjalankan wadah Anda di latar belakang.

Setelah proses selesai, gunakan perintah berikut untuk mendaftar semua wadah yang sedang berjalan:
$ docker ps
Kamu  akan melihat output berikut dengan detail tentang app, webserver, dan dbcontainer Anda:
Output
CONTAINER ID NAMES IMAGE STATUS PORTS
c31b7b3251e0 db mysql:5.7.22 Up 2 seconds 0.0.0.0:3306->3306/tcp
ed5a69704580 app digitalocean.com/php Up 2 seconds 9000/tcp
5ce4ee31d7c0 webserver nginx:alpine Up 2 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
Gunakan  docker-compose exec untuk mengatur kunci aplikasi untuk aplikasi Laravel. Perintah docker-compose exec memungkinkan Anda untuk menjalankan perintah tertentu dalam wadah.

Perintah berikut akan membuat kunci dan menyalinnya ke .env file Anda, memastikan bahwa sesi pengguna dan data terenkripsi Anda tetap aman:
$ docker-compose exec app php artisan key:generate
Sekarang kamu memiliki pengaturan lingkungan yang diperlukan untuk menjalankan aplikasi Anda. Untuk meng-cache pengaturan ini ke dalam file, yang akan meningkatkan kecepatan memuat aplikasi Anda, jalankan:
$ docker-compose exec app php artisan config:cache
Sebagai langkah terakhir, kunjungi di browser. Anda akan melihat halaman beranda berikut untuk aplikasi Laravel Anda: http://your_server_ip

Untuk membuat pengguna baru MySQL, jalankan bash shell interaktif pada db wadah dengan docker-compose exec:
$ docker-compose exec db bash
Di dalam container, masuk ke akun administratif root MySQL:
$ mysql -u root -p
Kamu akan dimintai kata sandi yang tetapkan untuk akun root docker-compose MySQL selama instalasi di file Anda. Untuk melihat data MySQL gunakan perintah berikut.s
$ show databases;
Kamu akan melihat laravel database yang tercantum dalam output:
Output
+--------------------+
| Database |
+--------------------+
| information_schema |
| laravel |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
Selanjutnya, buat akun pengguna yang akan diizinkan untuk mengakses database ini. Nama pengguna kami adalah pintaurusnet, meskipun Anda dapat mengganti ini dengan nama lain jika Anda mau. Pastikan nama pengguna dan kata sandi Anda di sini cocok dengan detail yang Anda atur di .env file Anda pada langkah sebelumnya:
mysql > GRANT ALL ON laravel.* TO 'pintaurusnet'@'%' IDENTIFIED BY 'your_laravel_db_password';
mysql > FLUSH PRIVILEGES;
mysql > exit
Terakhir keluar dari container.
IT Enthusiast

إرسال تعليق