Setup Laravel, Nginx, dan MySQL dengan Docker

Write by Iman Sugirman
Setup Laravel, Nginx, dan MySQL dengan Docker

Selama beberapa tahun terakhir, Docker telah menjadi solusi yang sering digunakan untuk menyebarkan aplikasi berkat caranya menyederhanakan menjalankan dan menyebarkan aplikasi dalam wadah singkat. Ketika menggunakan tumpukan aplikasi LEMP, misalnya, dengan PHP, Nginx, MySQL dan kerangka Laravel, Docker dapat secara signifikan merampingkan proses pengaturan.

Docker Compose telah lebih menyederhanakan proses pengembangan dengan memungkinkan pengembang untuk menentukan infrastruktur mereka, termasuk layanan aplikasi, jaringan, dan volume, dalam satu file. Docker Compose menawarkan alternatif yang efisien untuk menjalankan beberapa kontainer galangan buat dan perintah menjalankan kontainer docker.

Dalam tutorial ini, Anda akan membangun aplikasi web menggunakan kerangka Laravel, dengan Nginx sebagai server web dan MySQL sebagai database, semua dalam kontainer Docker. Anda akan menentukan seluruh konfigurasi stack di file docker-compose, bersama dengan file-file konfigurasi untuk PHP, MySQL, dan Nginx.

Prasyarat

Sebelum memulai, Anda akan membutuhkan:

  • Satu server Ubuntu 18.04, dan pengguna non-root dengan hak akses sudo. Ikuti Pengaturan
  • Server Awal dengan tutorial Ubuntu 18.04 untuk menyiapkan ini.
  • Docker diinstal, mengikuti Langkah 1 dan 2 Cara Menginstal dan Menggunakan Docker di Ubuntu 18.04.
  • Docker Compose diinstal, mengikuti Langkah 1 Cara Menginstal Docker Tulis di Ubuntu 18.04.

Langkah 1 - Mengunduh Laravel dan Memasang Dependensi

Sebagai langkah pertama, kami akan mendapatkan Laravel versi terbaru dan menginstal dependensi untuk proyek, termasuk Composer, manajer paket level aplikasi untuk PHP. Kami akan menginstal dependensi ini dengan Docker untuk menghindari keharusan menginstal Composer secara global.

Pertama, periksa apakah Anda ada di direktori home Anda dan klon rilis Laravel terbaru ke direktori bernama laravel-app:

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

Pindah ke direktori laravel-app:

cd ~/laravel-app

Selanjutnya, gunakan Composer Docker untuk memasang direktori yang Anda perlukan untuk proyek Laravel Anda dan hindari overhead menginstal Composer secara global:

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

Menggunakan flag -v dan --rm dengan docker run menciptakan wadah singkat yang akan di-bind-mount ke direktori Anda saat ini sebelum dihapus. Ini akan menyalin isi direktori ~/laravel-app Anda ke wadah dan juga memastikan bahwa folder vendor Composer yang dibuat di dalam wadah disalin ke direktori Anda saat ini.

Sebagai langkah terakhir, atur izin pada direktori proyek sehingga dimiliki oleh pengguna non-root Anda:

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

Ini akan menjadi penting ketika Anda menulis Dockerfile untuk gambar aplikasi Anda di Langkah 4, karena ini akan memungkinkan Anda untuk bekerja dengan kode aplikasi Anda dan menjalankan proses dalam wadah Anda sebagai pengguna non-root.

Dengan kode aplikasi Anda di tempat, Anda dapat melanjutkan untuk menentukan layanan Anda dengan Docker Tulis.

Langkah 2 - Membuat Docker Tulis File

Membangun aplikasi Anda dengan Docker Compose menyederhanakan proses pengaturan dan pembuatan versi infrastruktur Anda. Untuk mengatur aplikasi Laravel kami, kami akan menulis file docker-compose yang mendefinisikan server web kami, database, dan layanan aplikasi.

Buka file:

nano ~/laravel-app/docker-compose.yml

Di file doker-compose, Anda akan menentukan tiga layanan: app, webserver, dan db. Tambahkan kode berikut ke file, pastikan untuk mengganti kata sandi root untuk MYSQL_ROOT_PASSWORD, didefinisikan sebagai variabel lingkungan di bawah layanan db, dengan kata sandi yang kuat pilihan Anda:

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

Layanan yang didefinisikan di sini meliputi:

  • app: Definisi layanan ini berisi aplikasi Laravel dan menjalankan gambar Docker khusus, digitalocean.com/php, yang akan Anda tetapkan pada Langkah 4. Ini juga menetapkan working_dir dalam penampung ke /var/www.
  • webserver: Definisi layanan ini menarik nginx:alpine dari Docker dan mengekspos port 80 dan 443.
  • db: Definisi layanan ini menarik mysql:5.7.22 image dari Docker dan mendefinisikan beberapa variabel lingkungan, termasuk database yang disebut laravel untuk aplikasi Anda dan kata sandi root untuk database. Anda bebas untuk memberi nama database apa pun yang Anda inginkan, dan Anda harus mengganti your_mysql_root_password dengan kata sandi Anda sendiri yang kuat. Definisi layanan ini juga memetakan port 3306 pada host ke port 3306 pada penampung.

Setiap properti container_name mendefinisikan nama untuk penampung, yang sesuai dengan nama layanan. Jika Anda tidak mendefinisikan properti ini, Docker akan memberikan nama ke setiap penampung dengan menggabungkan nama orang yang terkenal secara historis dan kata acak dipisahkan dengan garis bawah.

Untuk memfasilitasi komunikasi antar kontainer, layanan terhubung ke jaringan jembatan yang disebut app-network. Sebuah jaringan jembatan menggunakan jembatan perangkat lunak yang memungkinkan kontainer terhubung ke jaringan jembatan yang sama untuk berkomunikasi satu sama lain. Driver bridge secara otomatis menginstal aturan di mesin host sehingga kontainer di jaringan jembatan yang berbeda tidak dapat berkomunikasi secara langsung satu sama lain. Ini menciptakan tingkat keamanan yang lebih tinggi untuk aplikasi, memastikan bahwa hanya layanan terkait yang dapat berkomunikasi satu sama lain. Ini juga berarti bahwa Anda dapat menentukan beberapa jaringan dan layanan yang terhubung ke fungsi terkait: layanan aplikasi front-end dapat menggunakan jaringan frontend, misalnya, dan layanan back-end dapat menggunakan jaringan backend.

Mari kita lihat cara menambahkan volume dan mengikat tunggangan ke definisi layanan Anda untuk mempertahankan data aplikasi Anda.

Iman Sugirman
Iman Sugirman Web Designer & Developer was 4 years experience in Web Development. Have Secret Sauce Recipe for Create Awesome Website
comments powered by Disqus