Deploy CodeIgniter 3 di Docker

Artikel ini diperbarui pada 30 November 2022.

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.

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

Post a Comment

Popular posts from this blog

Contoh Inheritance (Pewarisan) di Java

Contoh Penerapan Interface di Pemrograman Java