Deploy CodeIgniter 3 di Docker

Artikel ini diperbarui pada 27 September 2023.

PERINGATAN!!!
Tutorial ini sudah tidak bisa digunakan
Ada pembaca yang melaporkan error 'http://security.debian.org/debian-security stretch/updates Release' does not have a Release file.
Error tersebut karena image PHP 5.6 dibuat dari Debian Stretch (Debian versi lawas), yang repository softwarenya sudah tidak bisa diakses. Padahal ketika build image ada perintah apt-get install (perintah instalasi packages di Debian), akibatnya gagal melakukan install packages.

- - - - - -

Sebuah web app berbasis CodeIgniter 3 harus dideploy, masalahnya web app tersebut membutuhkan PHP versi 5.6 yang repot untuk saya install di Ubuntu 22.10. Oleh karena itu saya gunakan docker untuk deployment-nya.
Source code web app terdapat pada folder myweb, berikut ini adalah hal-hal yang saya lakukan untuk melakukan deploy CI3 di Docker.

Instalasi Docker

Silakan buka website Docker untuk melihat cara instalasi, misalnya untuk instalasi Docker di Ubuntu ada di halaman ini https://docs.docker.com/engine/install/ubuntu/

Docker Image

Saya gunakan dua buah docker container untuk PHP + web server dan database. Pertama saya unduh docker image mysql versi 5.7.40 melalui perintah CLI
sudo docker pull mysql:5.7.40
*supaya tidak perlu pakai sudo untuk mengeksekusi docker, caranya bisa dibaca di https://www.ardhi.web.id/2020/12/menjalankan-docker-tanpa-sudo-di-ubuntu.html

Kemudian yang kedua, saya buat custom docker image untuk PHP + web servernya. Saya gunakan PHP versi 5.6.38 dan Apache Httpd untuk web servernya. Buat file dengan nama Dockerfile untuk membangun custom image yang berisi PHP, web server Apache, dan sejumlah extension PHP lainnya. Isi dari Dockerfile adalah sebagai berikut
FROM php:5.6.38-apache
RUN apt-get update && apt-get install -y libpq-dev docker-php-ext-install pdo pdo_mysql mysql mysqli
RUN a2enmod rewrite
Script tersebut digunakan untuk membangun custom image yang berisi PHP 5.6.38 + web server Apache ditambah extension php-ext, pdo, pdo_mysql, mysql, dan mysqli.
Selanjutnya lakukan build image docker dari script Dockerfile yang sudah ditulis, melalui command line masuk ke direktori tempat Dockerfile berada selanjutnya eksekusi perintah berikut
sudo docker build -t php5 .
Perintah docker build tersebut setelah dieksekusi akan menghasilkan image dengan nama php5 yang isinya telah didefinisikan dalam Dockerfile.

Container

Langkah selanjutnya adalah membuat container, saya menggunakan docker compose untuk menuliskan konfigurasi container yang akan digunakan. Buat file docker-compose.yml dengan isi sebagai berikut
# versi script docker-compose
version: "3.8"
services:
  php-apache-environment:
    #nama container
    container_name: php-apache
    
    # image docker yang digunakan
    image: php5
    
    # port yang digunakan
    # port 80 di container, diakses melalui port 8080 di host OS
    ports:
      - "8080:80"
    
    # menghubungkan folder di host OS / laptop ke container
    # folder /var/www/html di sisi container
    # /home/linuxluv/myweb/ di host OS tempat menyimpan source code web
    volumes:
      - /home/linuxluv/myweb/:/var/www/html
  db:
    container_name: db
    image: mysql:5.7.40
    restart: always
    
    # user name dan password untuk mengakses mysql
    environment:
      MYSQL_ROOT_PASSWORD: 'pass'
      MYSQL_USER: 'admin'
      MYSQL_PASSWORD: 'pass'
    ports:
      - "3306:3306"
    
    # menghubungkan folder di host OS / laptop ke container
    # agar database tersimpan permanen
    # /var/lib/mysql di container dimapping ke /home/linuxluv/dbvol di laptop
    volumes:
      - /home/linuxluv/dbvol:/var/lib/mysql
Selanjutnya container dapat dijalankan melalui perintah
sudo docker-compose up

Import database

Database dapat diimport agar masuk ke container dengan cara login lewat bash ke container db
sudo docker exec -it db bash
db adalah nama container database yang dibuat di docker-compose.yml, setelah berhasil login lanjutkan dengan mengcreate database dan dilanjutkan dengan import db (file .sql)

membuat database baru di docker
import database dari file SQL

config.php

Ubah base_url di konfigurasi CI dengan mengedit file application/config/config.php. Ubah host dan port, misal di sini saya menggunakan port 8080 di localhost
$config['base_url'] = 'http://localhost:8080/myweb

.htaccess

Selanjutnya edit file .htaccess di dalam folder myweb (source code web app) untuk mengakfitkan rewrite engine PHP
Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
Buka web browser dan ketik localhost:8080 untuk mengakses web app

Comments

  1. databasenya gimana pak?

    ReplyDelete
    Replies
    1. masih di server terpisah, belum didocker-kan

      Delete
    2. Sudah saya update, database juga dibuat docker imagenya.

      Delete
  2. Bisa di docker juga om. Cuma pas running di tambahi -- link .
    Atau bisa juga connect pake docker network..

    ReplyDelete
  3. dockerfile nya disimpan diluar project atau di dalam projek ?

    ReplyDelete
    Replies
    1. Di luar project. FYI : cara yang saya tulis ini masih kurang bagus, akan saya update nanti.

      Delete
  4. ijin bertanya bang. Di saya, hanya $route['default_controller'] = 'home' saja yg bisa dijalankan. Begitu mengakses controller lain selain yg default_controller muncul pesan "The requested URL was not found on this server"

    ReplyDelete
    Replies
    1. masukin ke route supaya bisa diakses, atau pake autoroute

      Delete
  5. Ijin bertanya bang, kok hanya default_controller yg di route sj yg bisa diakses. Jika mengakses controller lain muncul pesan "The requested URL was not found on this server." Padahal di php-apache nya sdh diset volumes:
    - ./public:/var/www/html

    ReplyDelete
    Replies
    1. masukin ke route supaya bisa diakses, atau pake autoroute

      Delete
  6. Forbidden
    You don't have permission to access / on this server.

    itu knp ya mas? saya docker nya install di vm ubuntu 22.04

    ReplyDelete
  7. kak knp pas di akses http://localhost:8080 >> Forbidden
    You don't have permission to access / on this server.

    kira kira knp ya kak? syntax compose dll sudah benar

    ReplyDelete
  8. hallo om, kalau webserver, php sama mysql di host itu docker filenya gmn ya?

    ReplyDelete
  9. kalau webserver, php sma mysql di host itu gimana ya dockerfile nya

    ReplyDelete
  10. Saya coba jalankan dockerfile nya dan dapat: W: The repository 'http://security.debian.org/debian-security stretch/updates Release' does not have a Release file.
    Itu kenapa ya? Apa imagenya gak ada?

    ReplyDelete
    Replies
    1. Ini karena image php based on linux Debian versi lawas, nah repository software Debian lawas ini udah ga bisa diakses sedangkan ketika build image ada perintah apt-get install (perintah install packages linux).
      Akibat repository softwarenya udah ga bisa diakses, instalasi packages gagal. Masih saya cari tahu gimana mengatasinya, kalau tidak bisa berarti jangan pakai PHP 5, gunakan PHP yang versi lebih baru.

      Delete

Post a Comment

Popular posts from this blog

Contoh Inheritance (Pewarisan) di Java

Contoh Penerapan Interface di Pemrograman Java

Review Singkat Pilihan Transportasi Umum Rute Solo - Wonosobo