Run Docker In Production Part 2


Run Docker in Production

Membuat Virtual Machine

Untuk kali ini kita akan menyewa sebuah virtual machine dari linode, Linode adalah penyedia cloud yang menyediakan layanan Saas, SaaS merupakan singkatan dari “software as a service”. Istilah ini digunakan pada saat perusahaan memanfaatkan sistem cloud untuk mengirimkan software antarmuka ke user mereka, umumnya melalui web browser atau aplikasi mobile. Lanjut disini akan membuat server linode. Pertama create linode server

Lalu Pilih Image dari OS yang diinginkan kita aka menggunakan Ubuntu versi 20.04, Lalu Pilih region , disini saya akan menggunakan server yang ada di singapura, Lalu setelah itu kita akan memilih berapa CPU yang akan digunakan, dalam hal ini kita akan memilih yang nanode 1 GB. Dan setelah itu setting linode label dan root password, setelah itu tinggal create saja linode servernya

Setelah itu kita dialihkan kehalaman yand dimana tersedia informasi mengenai server linode yang telah dibuat


Access Virtual Machine melalui SSH

Apa itu SSH? Secure Socket Shell, suatu protokol yang bisa memberikan akses administrator. Saat menggunakan SSH, Anda bisa terhubung dengan komputer atau server yang berbeda lokasi dari lokasi Anda asalkan masih terhubung dalam satu buah jaringan internet. SSH digunakan untuk mengenkripsi sambungan yang terjadi antara perangkat Anda dengan server di lokasi lain.

Jika menggunakan sistem operasi Windows, Anda perlu melakukan instalasi aplikasi klien SSH. Ada beberapa pilihan aplikasi yang bisa digunakan, seperti PuTTY, Bitvise, KiTTY, dan lain sebagainya. PuTTY merupakan aplikasi yang paling popular. Namun kita akan menggunakan aplikasi bawaan dari windows. Cukup buka cmd dan untuk mengeceknya cukup jalankan command ssh

 

Lalu kita coba akses server melalui ssh, nanti kita tinggal masuka user host dan password yang telah dibuat sebelumnya , karena bawaah defaultnya usernya adalah user : root

Install Docker dan Docker Compose

Selanjutnya kita akan mencoba install docker pada server Ubuntu kita, untuk dokumentasi lengkapnya ada pada website docker,

Pertama kita jalankan

sudo apt-get update

Tunggu beberapa saat sampai prosesnya beres, lalu jalankan perintah selanjutnya

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

Lalu Tambahkan Docker’s official GPG key:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

 

echo \

  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \

  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

Lalu jalankan kembali update dan install docker

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

Apabila telah selesai lalu kita coba ceknya dengan menggunakan

docker –version

docker --help



Okay setelah docker engine terinstall selanjutnya kita akan install docker compose, untuk dokumentasi lengkapnya ada disini Docker Compose Install.

Pertama jalankan perintah ini pada server

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

lalu terapkan executeable permission untuk docker compose binary nya

sudo chmod +x /usr/local/bin/docker-compose

setelah itu test instalasi

docker-compose --version

Menjalankan Aplikasi Berbasis Docker

Pertama kita akan pull beberapa image diantaranya nginx dan mysql

Docker pull nginx

Lalu kita akan menjalankan nginx dan coba buka pada browser dan masukan ip sesuai dengan server



Instalasi Laravel pada Docker

Unduh Laravel dan Instal Dependensinya

Lalu kita akan coba install aplikasi laravel pada server, pertama kita akan instal git terlebih dahulu pada server

Sudo apt-get install git

Lalu setelah itu kita akan coba clone repository laravel pada git

git clone https://github.com/laravel/laravel.git laravel-web

masuk pada folder laravel-web

cd laravel-web

dan jalan kan perintah composer install pada laravel

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

Sekarang, kita perlu mengubah kepemilikan direktori web laravel menjadi pengguna non-root. Ini akan memungkinkan bekerja dengan kode aplikasi Anda sebagai pengguna non-root dan menjalankan proses di dalam Container pada langkah selanjutnya. Masukkan perintah berikut untuk mengubah kepemilikan:

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

Membuat Docker Compose

File Docker Compose adalah file YAML yang disimpan dengan ekstensi .yml. Harap dicatat bahwa lekukan yang tepat diperlukan untuk file Docker Compose yang valid. Masukkan perintah berikut untuk membuat dan membuka file dengan nano untuk diedit:

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

Selanjutnya, Anda akan menentukan tiga layanan dalam file ini: app, server web, dan db. Bagian db mendefinisikan kredensial basis data untuk aplikasi Anda, jadi pastikan untuk memilih kata sandi mysql_root_password yang kuat dan ganti di bagian itu

version: '2.0'

services:

    app:

        build:

            context: .

            dockerfile: Dockerfile

        image: cloudsigma.com/php

        container_name: app

        restart: unless-stopped

        tty: true

        environment:

            SERVICE_NAME: app

            SERVICE_TAGS: dev

        working_dir: /var/www/html/

        volumes:

            - ./:/var/www/html/

            - ./php/laravel.ini:/usr/local/etc/php/conf.d/laravel.ini

        networks:

            - app-network  

        webserver:

        image: nginx:alpine

        container_name: webserver

        restart: unless-stopped

        tty: true

        ports:

            - "80:80"

            - "443:443"

        volumes:

            - ./:/var/www/html/

            - ./nginx/conf.d/:/etc/nginx/conf.d/

        networks:

            - app-network

    db:

        image: mysql:5.7.32

        container_name: db

        restart: unless-stopped

        tty: true

        ports:

            - "3306:3306"

        environment:

            MYSQL_DATABASE: laravel_web

            MYSQL_ROOT_PASSWORD: mysql_root_password

            SERVICE_TAGS: dev

            SERVICE_NAME: mysql

        volumes:

            - dbdata:/var/lib/mysql/

            - ./mysql/my.cnf:/etc/mysql/my.cnf

        networks:

            - app-network

networks:

    app-network:

        driver: bridge

volumes:

    dbdata:

        driver: local

Di bawah ini, ikuti penjelasan definisi layanan dari kode di atas:

app : Mendefinisikan aplikasi Laravel dan menjalankan image Docker kustom, cloudsigma.com/php, yang akan kita definisikan di Langkah 4 . Itu juga mengatur working_dir dalam Container ke /var/www/html.

webserver : Ini menarik gambar nginx:alpine dari Docker dan memperlihatkan port 80 dan 443 .

db : Ini menarik gambar mysql:5.7.32 dari Docker dan mendefinisikan beberapa Environment Variable. Ini termasuk database yang disebut laravel_web untuk aplikasi dan kata sandi root untuk database. Anda dapat mengganti nama database dengan nama pilihan Anda. Ingatlah untuk mengganti properti MYSQL_ROOT_PASSWORD dengan kata sandi yang kuat. Layanan ini juga memetakan port 3306 pada host ke port 3306 pada container.

Membuat Dockerfile

Dockerfile menyertakan instruksi yang dapat digunakan Docker untuk membuat image Docker kustom. Itu juga dapat menginstal perangkat lunak yang diperlukan dan mengonfigurasi pengaturan yang diperlukan untuk aplikasi Anda. Mereka menentukan lingkungan di dalam Container yang akan menampung kode aplikasi Anda. Anda dapat mendorong gambar yang Anda buat ke hub port untuk dibagikan atau menempatkannya di registri pribadi lainnya.

kita akan membuat Dockerfile yang akan menentukan instruksi untuk membangun gambar aplikasi Laravel. Gunakan nano untuk membuat Dockerfile di direktori ~/laravel-web:

nano ~/laravel-web/Dockerfile

Di editor yang terbuka, tambahkan kode berikut:

FROM php:7.4-fpm

# Copy composer.lock and composer.json into the working directory

COPY composer.lock composer.json /var/www/html/

 

# Set working directory

WORKDIR /var/www/html/

 

# Install dependencies for the operating system software

RUN apt-get update && apt-get install -y \

      build-essential \

      libpng-dev \

      libjpeg62-turbo-dev \

      libfreetype6-dev \

      locales \

      zip \

      jpegoptim optipng pngquant gifsicle \

      vim \

      libzip-dev \

      unzip \

      git \

      libonig-dev \

      curl

 

# Clear cache

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

 

# Install extensions for php

RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl

RUN docker-php-ext-configure gd --with-freetype --with-jpeg

RUN docker-php-ext-install gd

 

# Install composer (php package manager)

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

 

# Copy existing application directory contents to the working directory

COPY . /var/www/html

 

# Assign permissions of the working directory to the www-data user

RUN chown -R www-data:www-data \

      /var/www/html/storage \

      /var/www/html/bootstrap/cache

 

# Expose port 9000 and start php-fpm server (for FastCGI Process Manager)

EXPOSE 9000

CMD ["php-fpm"]

 

Dockerfile pertama-tama membuat gambar berdasarkan gambar Docker php:7.4-fpm . Ini adalah gambar berbasis Debian dengan implementasi PHP FastCGI ( PHP-FPM diinstal. Agar Laravel berjalan dengan baik, diperlukan ekstensi php lain seperti mcrypt, pdo_mysql, mbstring, dan imagick agar tersedia, yang diinstal skrip. Kemudian menginstal komposer manajer paket php. Container akan menggunakannya untuk menginstal dependensi php Laravel.

Anda dapat menggunakan direktif RUN untuk menentukan perintah seperti menginstal, memperbarui, dan mengonfigurasi pengaturan di dalam Container. Itu juga memberikan izin pengguna. Arahan WORKDIR menentukan direktori kerja, /var/www/html dalam kasus ini. Script menjalankan perintah CHOWN untuk menetapkan izin direktori /var/www/html ke pengguna www-data.

Sebelum akhirnya membangun image, port harus diekspos untuk memungkinkan akses ke aplikasi yang berjalan di dalam container. Perintah EXPOSE memperlihatkan port, 9000, untuk server php-fpm. Perintah terakhir untuk dijalankan adalah direktif CMD. Ini menjalankan php-fpm untuk memulai server.

Anda sekarang dapat menekan Ctrl + O untuk menyimpan file. Kemudian, tekan Ctrl + X untuk keluar dari editor.

Konfigurasikan PHP

Pada langkah ini, kita akan mengkonfigurasi layanan php untuk memproses permintaan yang masuk dari Nginx. Anda akan membuat file laravel.ini di dalam direktori php. File ini akan menampung konfigurasi PHP. Ini adalah file yang telah Anda ikat ke /usr/local/etc/php/conf.d/laravel.ini dalam container . Konfigurasi dalam file ini menimpa file php.ini default yang biasanya dibaca oleh PHP saat dimulai. Masukkan perintah berikut untuk membuat direktori php:

mkdir ~/laravel-web/php

Buat dan buka file laravel.ini di dalam direktori php dengan memasukkan perintah berikut:

nano ~/laravel-web/php/laravel.ini

File php.ini default memiliki batas unggahan yang dikonfigurasi Sebagai contoh untuk menyesuaikan dan mengatur konfigurasi php dengan mengubah nilai batas unggah yang diizinkan, jika Anda ingin mengunggah file yang lebih besar. Masukkan baris kode berikut di dalam file:

upload_max_filesize=80M

post_max_size=80M

Ini menetapkan batas unggah dan Anda dapat mengunggah file dengan ukuran total tidak lebih dari 80MB. Anda dapat menambahkan konfigurasi php lain di dalam file laravel.ini untuk mengganti konfigurasi default php. Sekarang, simpan dan tutup file.

Konfigurasi Nginx

Pada langkah ini, kita akan mengkonfigurasi Nginx untuk menggunakan layanan php yang telah kita definisikan sebelumnya. Ini akan menggunakan PHP-FPM sebagai server FastCGI untuk menyajikan konten dinamis. Server FastCGI adalah perangkat lunak yang memungkinkan program interaktif untuk berinteraksi dengan server web. Seperti yang telah kita definisikan di file docker-compose , kita akan membuat file konfigurasi Nginx app.conf di dalam direktori ~/laravel-web/nginx/conf.d/. Pertama, masukkan perintah berikut untuk membuat direktori:

mkdir -p ~/laravel-web/nginx/conf.d

Selanjutnya, buat dan buka file app.conf menggunakan nano dengan memasukkan perintah berikut:

nano ~/laravel-web/nginx/conf.d/app.conf

Tambahkan sintak seperti dibawah ini

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/html/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;

    }

}

Nginx membaca file konfigurasi yang disebut blok server untuk mengetahui direktori apa yang harus disajikan kepada pengunjung situs web berdasarkan URL. Untuk mempelajari lebih lanjut, baca tentang menyiapkan blok server di tutorial kami tentang menginstal Nginx di Ubuntu 18 .04 . Arahan yang didefinisikan melayani tujuan berikut:

·         listen – Mendefinisikan port di mana server akan mendengarkan permintaan masuk, yang biasanya port 80.

·         error_log & access_log – Mendefinisikan file untuk menulis log aplikasi.

·         root – Menentukan jalur webroot, direktori yang akan melayani permintaan apa pun yang dibuat ke server dari internet.

sekarang dapat menekan Ctrl + O untuk menyimpan file, lalu tekan Ctrl + X untuk keluar dari editor. Perubahan yang dibuat di direktori nginx/conf.d/ akan secara otomatis tercermin dalam Container server web berkat pengikatan yang Anda tambahkan di file Docker Compose

Konfigurasi MySQ

Setelah kita mengonfigurasi Nginx untuk bekerja dengan PHP, sekarang kita dapat mengonfigurasi MySQL untuk menyimpan dan menyajikan data dinamis ke PHP. Kami telah mengatur file Docker Compose untuk menginstal ekstensi yang diperlukan untuk komunikasi PHP dan MySQL. Kami akan membuat file konfigurasi MySQL my.cnf di dalam folder mysql, yang akan di-bind-mount ke /etc/mysql/my.cnf seperti yang telah kami definisikan di bagian layanan db dari Docker Compose

Pengaturan dan perubahan konfigurasi MySQL dapat dilakukan ke file my.cnf kapan pun Anda mau. Mereka harus segera mencerminkan di dalam Container. Pertama, buat direktori dengan memasukkan perintah berikut:

mkdir ~/laravel-web/mysql

Selanjutnya, buat dan buka nano dengan memasukkan perintah berikut:

nano ~/laravel-web/mysql/my.cnf

Masukkan kode berikut untuk mengaktifkan log kueri dan menentukan lokasi file log kueri:

[mysqld]

general_log = 1

general_log_file = /var/lib/mysql/general.log

Dengan mendefinisikan properti general_log sebagai 1, Anda mengizinkan log umum. Properti general_log_file menentukan lokasi file log. Tekan Ctrl + O untuk menyimpan file, lalu tekan Ctrl + X untuk keluar dari editor.

Menerapkan Environment Variable Laravel

Hingga saat ini, semua layanan dan pengaturan konfigurasi telah selesai. Dengan demikian, kami dapat menyebarkan Container kami. Namun, ada langkah penting yang harus diselesaikan sebelum aplikasi web kita benar-benar dapat digunakan – Environment Variable. Kerangka kerja Laravel mengharapkan file bernama .env yang digunakan untuk mendefinisikan lingkungannya. Secara default, Laravel hadir dengan .env.example yang dapat Anda salin ke .env, lalu ubah variabel dengan detail Anda yang sebenarnya. Masukkan perintah berikut untuk menyalin file:

cp .env.example .env

Setelah disalin, buka file menggunakan nano untuk memodifikasi:

nano .env

Berikut adalah dari apa yang mungkin terlihat seperti file:

 


Dalam file tersebut, langkah selanjutnya adalah memodifikasi variabel di bawah blok DB_CONNECTION seperti yang telah Anda atur pada konfigurasi sebelumnya yang telah kita lakukan sejauh ini. Perbarui sebagai berikut: 

·         DB_HOST adalah Container basis data db .

·         DB_DATABASE adalah laravel_web .

·         DB_USERNAME adalah nama pengguna untuk database. Pilih nama pilihan Anda, tetapi demi tutorial ini, mari kita gunakan laraveldocker .

·         DB_PASSWORD adalah kata sandi yang kuat yang akan digunakan pengguna Anda di atas untuk masuk ke database, jadi pilihlah kata sandi yang kuat.

Jalankan Container Docker

Pada tahap ini, semua layanan dan konfigurasi Anda ditentukan dalam file Docker Compose. Hanya satu perintah yang diperlukan untuk memulai semua container, membuat volume, menghubungkan jaringan, dan menyiapkan serta membangun aplikasi Anda. Jalankan perintah dibawah ini

docker-compose up -d


Masukkan perintah berikut di terminal Anda untuk mendaftar semua Container yang sedang berjalan:

docker ps

·         ID Container – Pengidentifikasi unik untuk setiap Container.

·         Names – Nama layanan yang terkait dengan setiap container, seperti yang didefinisikan dalam file Docker Compose. (Anda dapat menggunakan id Container atau nama untuk mengakses Container).

·         Image – Nama gambar untuk setiap Container.

·         Status – Menampilkan informasi tentang status container (bisa dihentikan, dijalankan, atau dimulai ulang).

·         Ports – Ini menunjukkan port yang diekspos oleh container.

Docker Compose menyediakan perintah yang disebut exec yang dapat Anda gunakan untuk menjalankan perintah terminal atau mengakses baris perintah di dalam Container. Pertama-tama kita ingin menjalankan beberapa perintah di dalam Container aplikasi, yang merupakan Container yang menjalankan aplikasi Laravel.

 

Docker menyediakan perintah untuk mengakses baris perintah dari sebuah Container. Sintaksnya adalah sebagai berikut: docker-compose exec container_name bash. Untuk mengakses baris perintah Container aplikasi, masukkan perintah berikut:

docker-compose exec app bash

Setelah berada di baris perintah container, Anda dapat menjalankan beberapa perintah konfigurasi Laravel Artisan . Masukkan perintah berikut untuk menghasilkan kunci laravel dan simpan ke file .env:

php artisan key:generate

Dengan set kunci lingkungan, Anda dapat menjalankan perintah berikut untuk men-cache pengaturan konfigurasi:

php artisan config:cache

Konfigurasi disimpan pada file /var/www/html/bootstrap/cache/config.php di dalam container. Anda dapat menekan Ctrl + D untuk keluar dari terminal Container.

Untuk mengonfirmasi bahwa aplikasi Laravel telah di-deploy dan sedang berjalan, kunjungi IP publik server Anda di dalam browser Anda (http:// your_server_public_ip ). Anda akan melihat halaman selamat datang untuk instalasi Laravel baru:

Konfigurasikan pengguna MySQL

Pada langkah ini, kita akan membuat user database untuk database MySQL laravel web yang kita tentukan di file docker-compose. Saat Anda menjalankan perintah pembuatan Container MySQL telah diinstal, tetapi hanya membuat akun administratif root default, yang kebetulan memiliki hak tak terbatas pada database. Untuk menghindari penggunaan pengguna root, kami akan membuat pengguna khusus, laraveldocker, untuk digunakan dalam aplikasi. Ini adalah pengguna yang Anda tentukan dalam Environment Variable. Akses baris perintah di dalam terminal dengan memasukkan perintah berikut:

docker-compose exec db bash

Setelah berada di dalam container, masuk ke MySQL dengan memasukkan perintah berikut:

mysql -u root -p

Di prompt kata sandi, masukkan kata sandi yang Anda atur di layanan db di file docker-compose

Setelah Anda masuk ke prompt MySQL, periksa apakah Anda dapat melihat database yang Anda tentukan di file docker-compose dengan memasukkan perintah SQL berikut:

Show databases;

Selanjutnya, kita membuat user dan password untuk database laravel_web. Ini harus sama dengan detail yang Anda tentukan di file .env . Masukkan perintah berikut untuk membuat pengguna dan kata sandi, dan berikan semua hak istimewa kepada pengguna ini:

GRANT ALL ON laravel_web.* TO 'laraveldocker'@'%' IDENTIFIED BY 'passwordmysql;

Agar perubahan segera berlaku, masukkan perintah berikut untuk menghapus hak istimewa:

FLUSH PRIVILEGES;

Uji Komunikasi antara Kode Aplikasi Laravel dan Database MySQL

Sampai dengan langkah ini, semuanya telah bekerja dengan baik. Namun, kami ingin mengonfirmasi bahwa Kode Laravel di container app dapat berkomunikasi dengan database MySQL di container db. Pertama, akses terminal container app  dengan memasukkan perintah berikut:

docker-compose exec app bash

Selanjutnya adalah menjalankan perintah migrasi laravel yang membuat tabel:

php artisan migrate

Selanjutnya, kita akan menguji apakah kita dapat mengakses database dari Laravel. Laravel hadir dengan Tinker secara default, yang memungkinkan Anda untuk berinteraksi dengan seluruh aplikasi dari baris perintah, termasuk mengakses database, menjalankan pekerjaan, ORM yang fasih , dan banyak lagi. Kita bisa menggunakan Tinker untuk melihat data di tabel migrasi. Masukkan perintah berikut untuk mengakses Tinker:

php artisan tinker

Setelah di prompt Tinker, Anda dapat membuat daftar tabel yang dibuat oleh perintah migrasi dengan memasukkan yang berikut ini:

\DB::select('show tables');



Dari output di atas, aplikasi Laravel Anda sudah terkonfigurasi dengan baik dan dapat berkomunikasi dengan database. Anda dapat bereksperimen dengan lebih banyak perintah seperti membuat model, menjalankan pekerjaan, dan banyak lagi. Anda dapat keluar dari perintah Tinker dengan menekan Ctrl+D.

 


Next Post Previous Post
No Comment
Add Comment
comment url