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
sudoapt-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
sudoapt-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
sudocurl
-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
sudochmod +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
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.