Cara menggunakan docker-compose mysql

Deploy-Web-Menggunakan-Docker-Compose

Penugasan Oprec Camin Periode 2021 - Kelompok 1

Table of Contents

  • Deploy-Web-Menggunakan-Docker-Compose
  • Anggota Kelompok :
  • Breakdown Penugasan :
  • Tools / Requirement Yang Harus Disiapkan :
  • Langkah - Langkah :
  • Clone Repository Laravel kedalam Server Linux
  • Composer Install Menggunakan Docker
  • Membuat docker-compose.yml pada folder laravel
  • Membuat DockerFile
  • Konfigurasi PHP
  • Konfigurasi NGINX
  • Konfigurasi MySQL
  • Buatlah .env File pada Folder Laravel
  • Build Application Image
  • Run Docker Environment
  • Cache Laravel
  • Setting MySQL
  • Run Artisan Migrate di Folder Laravel

Anggota Kelompok :

  • Ishaq
  • Iqbal
  • Tauchid

Breakdown Penugasan :

  • Mount database mysql yang berada di container ke host
  • Web server menggunakan docker Nginx
  • PHP menggunakan docker PHP
  • Database menggunakan docker Mysql
  • Semua service yang ada (Nginx, PHP, dan Mysql) dijalankan bersama dalam docker-compose
  • Repository Laravel (https://gitlab.com/kuuhaku86/web-penugasan-individu)
  • Vhd Linux Server (https://drive.google.com/drive/folders/1W6en37tTDGLbh6o8pXOdY59EPtNHXG8G)
  • Sudah berhasil install Nginx, PHP, MySql, Composer dalam linux server
  • Sudah berhasil install docker dan docker-compose pada linux server

Langkah - Langkah :

Clone Repository Laravel kedalam Server Linux

Clone Repository Laravel sesuai kebutuhan dan tujuan masing-masing, dalam kasus ini kami clone dari repo laravel yang sudah tersedia dan menamakan foldernya dengan penugasan-kelompok (dalam kasus kami, repo disimpan didalam folder /var/www/)

git clone https://gitlab.com/kuuhaku86/web-penugasan-individu penugasan-kelompok

Composer Install Menggunakan Docker

Hal yang harus dilakukan adalah masuk kedalam folder repository laravel berada, kemudian jalankan perintah docker untuk execute composer install, dan set Permission pada directory repo laravel

cd /var/www/penugasan-kelompok
docker run --rm -v $(pwd):/app composer install
sudo chown -R $USER:$USER /var/www/penugasan-kelompok
sudo chmod -R 777 /var/www/penugasan-kelompok

Membuat docker-compose.yml pada folder laravel

Dalam file docker-compose.yml akan disimpan apasaja service yang akan dipakai didalam container docker nantinya, seperti PHP, MySQL, dan NGINX.

Untuk Service PHP :

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

Kami menamakan container untuk service php dengan nama "app", nama image penugasan-kelompok (ini biasanya nama repo), dockerfile mengikuti nama dockerfile nantinya yang akan dibuat untuk command instalasi tools yang dibutuhkan, working_dir untuk path ke repo laravel, untuk mount file dari container ke host kami menggunakan volumes.

Untuk Service Nginx :

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

Kami menggunakan nama container "webserver" untuk service nginx, kami disini menggunakan port 8001 sebagai tempat websitenya, mount file dari container ke host kami menggunakan volumes.

Untuk Service MySQL :

#MySQL Service
 db:
  image: mysql
  container_name: db
  restart: unless-stopped
  tty: true
  ports:
   - "3307:3306"
  environment:
   MYSQL_DATABASE: penugasan_kelompok
   MYSQL_ROOT_PASSWORD: penugasan
   MYSQL_USER: root
   MYSQL_PASSWORD: penugasan
   SERVICE_TAGS: dev
   SERVICE_NAME: mysql
  volumes:
   - dbdata:/var/lib/mysql/
   - ./mysql/my.cnf:/etc/mysql/my.cnf
   - ./mysql-files:/var/lib/mysql-files
  networks:
   - app-network

Kami menggunakan nama containernya "db" untuk service MySQL, untuk port kami menggunakan port 3307 untuk local yang nantinya akan di forward ke port 3306 didalam container docker sehingga untuk .env laravel nanti bisa menggunakan 3306 (kasus ini terjadi karena untuk port 3306 di local sudah terinstall MySQL untuk keperluan project lain), untuk environment sesuaikan dengan data masing-masing dan kebutuhan masing-masing (nantinya akan dipakai di .env laravel). MySQL pada container akan di bind-mount ke etc/mysql/my.cnf/ yang ada pada host.

Untuk Network dan Volumes :

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

#Volumes
volumes:
 dbdata:
  driver: local

Type network yang kami pakai adalah bridge.

*Untuk File Full dapat dilihat di repo github kami dengan file yang bernama docker-compose.yml

Membuat DockerFile

Fungsi DockerFile adalah custom image yang dimana bisa digunakan untuk install tools atau aplikasi yang dibutuhkan nantinya pada web yang ingin kita deploy.

cd /var/www/penugasan-kelompok
sudo nano DockerFile

*Note : Jangan lupa sesuaikan versi php dengan kebutuhan

*Untuk File Full dapat dilihat di repo github kami dengan file yang bernama DockerFile

Konfigurasi PHP

Buat folder PHP pada repo laravel

cd /var/www/penugasan-kelompok
mkdir php
sudo nano /php/local.ini

Isi File local.ini sesuai kebutuhan Aplikasi Web

upload_max_filesize=40M
post_max_size=40M

Konfigurasi NGINX

Buat folder NGINX pada repo laravel

cd /var/www/penugasan-kelompok
mkdir -p nginx/conf.d
sudo nano /nginx/conf.d/app.conf

Sesuaikan Isi file app.conf dengan kebutuhan Aplikasi Web dan Port sesuai yang sudah diatur sebelumnya

server {
	listen 8001;
	index index.php index.html;
	error_log /var/log/nginx/error.log;
	access_log /var/log/nginx/access.log;
	root /var/www/penugasan-kelompok/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;
	}
}

Konfigurasi MySQL

Buat folder mysql pada repo laravel

cd /var/www/penugasan-kelompok
mkdir mysql
sudo nano /mysql/my.cnf

Isi File my.cnf sesuai kebutuhan WebApp

[mysqld]
general_log = 1
general_log_file = /var/lib/mysql/general.log

Buatlah .env File pada Folder Laravel

Isi file .env sesuai kebutuhan dan aturan pada docker-compose.yml yang sudah dibuat pada step sebelumnya

PP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:CefiKV2BVIKUzcP+EPYoDnxaoWXifMlTFlySdpSSv6Y=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=penugasan_kelompok
DB_USERNAME=root
DB_PASSWORD=penugasan

BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync

Untuk APP_KEY dibuat dengan :

Untuk DB, CONNECTION menggunakan "mysql", HOST menggunakan nama container MySQL di docker yaitu dalam kasus kami "db", Untuk PORT, DATABASE, USERNAME, PASSWORD sesuaikan kondisi.

Build Application Image

Setelah semua step diatas sudah dilakukan dan tidak ada kendala maka, build App Image dengan command :

Run Docker Environment

Setelah build berhasil dilakukan, sekarang container bisa di run dengan command :

Untuk cek apakah service berhasil jalan semua atau tidak dengan menggunakan command

Cache Laravel

Untuk jaga-jaga jangan lupa melakukan cache ketika mengubah file Docker

cd /var/www/penugasan-kelompok
docker-compose exec app php artisan config:cache

Setting MySQL

Masuk kedalam MySQL Docker Container dengan cara :

docker-compose exec db /bin/bash

Kemudian masuk kedalam MySQL dengan perintah :

Berikan akses Database MySQL kepada user yang dipakai di laravel :

GRANT ALL ON * . * TO 'root'@'localhost' IDENTIFIED BY 'penugasan';

Flush Privileges untuk memberitahu perubahan pada MySQL

Jika sudah dapat keluar dengan command

Run Artisan Migrate di Folder Laravel

docker-compose exec app php artisan migrate

Jika migration berhasil maka Deploy selesai dilakukan.

Referensi

  • https://www.digitalocean.com/community/tutorials/how-to-set-up-laravel-nginx-and-mysql-with-docker-compose
  • https://www.digitalocean.com/community/tutorials/how-to-install-and-set-up-laravel-with-docker-compose-on-ubuntu-20-04

Apa itu Docker compose?

Inti dari docker compose adalah file YAML, yaitu docker-compose.yml. File tersebut merupakan file konfigurasi yang isinya adalah mendefinisikan image docker apa saja yang akan digunakan, port yang akan di publish, dan lain-lain.

Bagaimana Cara membuat image Docker?

# 1. Build image docker terlebih dahulu $ docker build -t my-image . # 2. Selanjutnya jalankan containernya $ docker run -d my-image Namun, apabila kita menggunakan docker compose, cukup dengan perintah docker-compose up, proses build dan run tersebut akan sekaligus dijalankan. Kita akan membuat REST API sederhana menggunakan go.

Bagaimana cara menghapus container dan Network yang terasosiasi dengan Docker compose?

Untuk menghapus container dan network yang terasosiasi dengan docker compose gunakan perintah docker-compose down (lebih lanjut docker-compose down) . Sebelum eksekusi perintah docker-compose, pastikan jika file docker-compose.yml berada di directory yang sama dimana perintah tersebut dieksekusi.