author Ahmad Muhardian

Cara Menjalankan Project Codeigniter 3 di Docker


Cara menjalankan project Codeigniter3 di Docker

Saya tau, Codeigniter 3 udah jadul.

Tapi masih ada kok project yang pakai Codeiginter 3.

Lalu, kita diminta untuk menjalankan project tersbut di environment yang serba baru. Anggaplah, di komputer saya sekarang terinstall PHP 8.

Apa Codeigniter 3 bisa jalan di PHP 8?

Kalau baca-baca dari dokumentasinya, Codeigniter 3 memang sudah compatible dengan PHP 8. Tetapi ada beberapa fitur dan library yang gak bisa bekerja, seperti pagination.

Codeigniter 3, seharusnya dijalankan dengan PHP 5 atau PHP 7. Namun, versi PHP ini sudah tidak didukung lagi di sistem operasi terbaru saat ini.

Mau tidak mau, kita harus downgrade sistem operasi. Buat bisa pakai PHP 7.

Eh, tapi ini tidak perlu dilakukan kalau kita paham cara running project Codeigniter 3 di Docker.

Jadi, dengan Docker.. kita akan membangun environtment yang terisolasi dan di dalamnya kita akan install PHP 7, MySQL, PHPmyadmin, dan sebagainya untuk menjalankan project ini.

Oke, gimana caranya?

Silahkan ikuti langkah-langkah berikut.

Menjalankan Proyek CodeIgniter 3 di Docker

Sebelumnya, pastikan kamu sudah menginstal Docker.

Silahkan baca caranya, kalau belum:

Oke, seletah itu, mari kita lanjut:

1. Buat Proyek Codeigniter 3

Pertama, buat dulu project Codeigniter 3 dengan mendownload CodeIgniter dari website resminya. Di tutorial ini, kita akan menggunakan Codeigniter v3.1.13.

Setelah itu ekstrak isi file zip codeigniter, lalu ubah saja nama foldernya yang dari bcit-ci-CodeIgniter-bcb17eb menjadi codeigniter-3.1.13-docker atau kamu juga bisa menggunakan nama folder sesuai dengan projectmu.

Yang penting, kamu bisa paham giamana cara menambahkan docker di project Codeigniter.

Oke, lanjtu!

Sekarang kita sudah punya proyeknya. Berikutnya kita akan menambahkan docker di sini. Biar gampang, silahkan buka projectnya dengan Visual Studio Code.

Folder project codeigniter untuk docker

Setelah itu, kita akan mulai setup Docker di dalam project ini.

Oke, Silahkan lanjutkan:

2. Buat File docker-compose.yml

Buat file docker-compose.yml di dalam folder codeigniter-docker dengan isi sebagai berikut:

version: '3.7'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: codeigniter_app
    working_dir: /var/www/html
    volumes:
      - .:/var/www/html
    networks:
      - ci_network

  webserver:
    image: nginx:alpine
    container_name: codeigniter_webserver
    volumes:
      - .:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "8000:80"
    networks:
      - ci_network
    depends_on:
      - app

  db:
    image: mysql:5.7
    container_name: codeigniter_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: codeigniter
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    volumes:
      - db_data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - ci_network

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: codeigniter_phpmyadmin
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "8080:80"
    depends_on:
      - db
    networks:
      - ci_network

networks:
  ci_network:

volumes:
  db_data:

File docker-compose.yml adalah file konfigurasi Docker untuk menentukan service apa saja yang mau kita jalankan di dalam container Docker.

Pada konfigurasi ini, kita akan menjalankan tiga service, yakni:

  1. app service untuk menjalankan aplikasi Codeigniter
  2. webserver service untuk mejalankan webservice Nginx
  3. db adalah service untuk menjalankan server MySQL
  4. phpmyadmin adalah service untuk menjalankan aplikasi PhpMyadmin

Mari kita bahas satu-per-satu, maksud dari konfigurasi di tiap service.

Service app

Pada Service app, kita menentukan konfigurasi seperti ini:

  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: codeigniter_app
    working_dir: /var/www/html
    volumes:
      - .:/var/www/html
    networks:
      - ci_network

Perhatikan!

Pada bagian build, ini adalah bagian untuk menentukan perintah yang akan dijalankan saat container dibuat. Di sini kita menentukan untuk menjalankan Dockerfile, file ini belum kita buat. Tenang saja, nanti kita buat setelah ini.

Lalu perhatikan lagi di sana ada working_dir untuk menentukan folder/path yang akan dipakai untuk menjalankan service ini. Pada kasus ini kita akan pakai /var/www/html, jadi nantinya aplikasi Codeigniter kita akan ditaruh di sana.

Lalu perhatikan lagi di bagian volumes, ini berfungsi untuk mounting folder/path pada sistem operasi Host ke dalam docker container. Pada konfigurasi ini kita mount . (current directory di host) ke /var/www/html (di Docker).

Lalu terakhir di bagian networks kita menentukan akan menggunakan jaringan apa. Jaringan ini juga belum kita buat. Jaringan ini berfungsi untuk menghubungkan antar service.

Service webserver

Service ini bertugas untuk menjalankan webserver Nginx.

  webserver:
    image: nginx:alpine
    container_name: codeigniter_webserver
    volumes:
      - .:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "8000:80"
    networks:
      - ci_network
    depends_on:
      - app

Pada konfigurasi ini kita menentukan image yang akan digunakan untuk menalankan service ini, yakni dari nginx:alpine.

Lalu di bagian volumes, kita menentukan file apa aja yang akan kita mounting ke dalam container.

  • . –> /var/www/html (folder project)
  • ./nginx.conf –> /etc/nginx/conf.d/default.conf (file konfigurasi nginx)

Lalu, kita akan forward port 80 di container ke 8000 pada host.

Service db

Service ini berfungsi untuk menjalankan server MySQL. Berikut ini konfigurasi pada docker-compose.yml.

  db:
    image: mysql:5.7
    container_name: codeigniter_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: codeigniter
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    volumes:
      - db_data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - ci_network

Pada konfigurasi ini, kamu perlu perhatikan di bagian environment. Di sini kita bisa menentukan username, password, dan nama database yang akan digunakan.

Pada contoh di atas, saya menentukan:

  • MYSQL_ROOT_PASSWORD: root adalah password untuk root user MySQL, yakni root. Kamu bisa ubah ini jika mau.
  • MYSQL_DATABASE: codeigniter adalah nama database, yakni codeigniter. Kamu bisa ubah ini jika mau.
  • MYSQL_USER: user adalah nama user untuk dipakai di aplikasi Codeiginter, yakni user
  • MYSQL_PASSWORD: password adalah password dari user. Kamu bisa ubah ini jika mau.

Kita bebas menentukan sesuai kebutuhan dan nanti pastikan juga untuk menyesuaikan dengan konfigurasi ini di aplikasi Codeigniter-nya.

Service phpmyadmin

Service terakhir yakni phpmyadmin berfungsi untuk menjalankan aplikasi PHPmyadmin. Service ini sebenarnya opsional, kamu bisa tambahkan.. bisa juga tidak.

Tapi, kalau kamu butuh PHPmyadmin.. tambahkan saja dengan konfigurasi seperti ini.

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: codeigniter_phpmyadmin
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "8080:80"
    depends_on:
      - db
    networks:
      - ci_network

Dua hal yang perlu diperhatikan dalam konfigurasi ini adalah di bagian environment dan ports.

Pada environment, pastikan kamu menentukan nama host server MYSQL yang akan dipakai dan passwordnya.

Pada contoh di atas kita menggunakan nama db dan root password adalah root.

Mengapa demikian?

Ini karena kita menentukan konfigurasi pada service db seperti itu.

Mengapa nama hostnya bukan localhost?

Kalau kita isi dengan localhost dia akan konek ke server MYSQL yang ada di localhost di Host sistem operasi, bukan konek ke MYSQL server yang ada di dalam docker container.

Okee, jika kamu sudah paham dengan konfigurasi ini..

Silahkan lanjutkan ke langkah berikutnya:

3. Buat File Dockerfile untuk PHP

Buat file baru di dalam folder project dengan nama Dockerfile dengan isi sebagai berikut:

FROM php:5.6-fpm

# Install mysqli extension
RUN docker-php-ext-install mysqli

WORKDIR /var/www/html

Docker file ini, nanti akan dijalankan saat service app dibuat. Di sini kita bisa menentukan perintah apa saja yang perlu kita jalankan.

Pada konfigurasi di atas, kita akan menjalankan perintah:

RUN docker-php-ext-install mysqli

Perintah ini untuk menginstall extensi mysql untuk PHP. Kalau kita nggak install ini, maka si PHP atau aplikasi codeigniter tidak akan bisa konek dengan MySQL.

Oke, setelah itu lanjutkan:

4. Membuat File Konfigurasi Nginx

Buat file baru dengan nama nginx.conf di direktori proyek dengan isi sebagai berikut:

server {
    listen 80;
    server_name localhost;

    root /var/www/html;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

File konfigurasi ini akan kita mount ke dalam docker, sehingga bisa dipakai oleh Nginx.

File ini berfungsi untuk mengatur konfigurasi Nginx. Pada konfigurasi ini, kita membuat sebuah server di port 80 dengan nama localhost.

  listen 80;
  server_name localhost;

Perhatikan, jika kamu menggunakan di production, biasanya akan menggunakan port 443 dan disertai dengan sertifikat SSL agar bisa dibuka melalui HTTPS. Sementara port 80 jarang sekali dipakai di production, karena kurang aman. Biasanya dipakai untuk internal saja.

Okee..

Lalu kita tentukan root folder untuk server ini berada di /var/www/html yang folder ini adalah lokasi aplikasi Codeigniter kita di dalam Docker. Lalu kita juga menentukan index file yang akan dipakai, yakni file dengan nama index.php, index.html, dan index.htm. Kita bisa tentukan nama file lainnya misalnya: home.php, tapi yang umum dipakai adalah index.php jadi pakai itu aja.

  root /var/www/html;
  index index.php index.html index.htm;

Selanjutnya, kita melakukan mapping path / (root) agar membuka fie /index.php yang ada di apikasi Codeigniter. Jadi setiap kai web dibuka dengan path / maka request itu akan di arahkan/diteruskan untuk membuka index.php.

location / {
  try_files $uri $uri/ /index.php?$query_string;
}

Berikutnya, kita melakukan mapping request URL yang ada .php agar menjalankan Fast CGI ke app:9000, ini adalah service aplikasi codeigniter yang dijalankan di dalam Docker.

location ~ \.php$ {
  fastcgi_pass app:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  include fastcgi_params;
}

Terakhir kita akan menolak request URL yang mengandung .ht, misalnya .htaccess.

location ~ /\.ht {
  deny all;
}

Ini penting untuk keamanan.

Berikutnya, kita perlu konfigurasi database pada Codeigniter:

5. Konfigurasi Database

Semua yang kita butuhkan sudah siap di Docker, berikutnya kita perlu konfigurasi aplikasi Codeigniter kita supaya bisa terhubung dengan database yang ada di Docker.

Caranya:

Buka file applications/config/database.php, kemudian ubah konfigurasinya menjadi seperti ini:

$db['default'] = array(
	'dsn'	=> '',
	'hostname' => 'db',
	'username' => 'user',
	'password' => 'password',
	'database' => 'codeigniter',
	'dbdriver' => 'mysqli',
	'dbprefix' => '',
	'pconnect' => FALSE,
	'db_debug' => (ENVIRONMENT !== 'production'),
	'cache_on' => FALSE,
	'cachedir' => '',
	'char_set' => 'utf8',
	'dbcollat' => 'utf8_general_ci',
	'swap_pre' => '',
	'encrypt' => FALSE,
	'compress' => FALSE,
	'stricton' => FALSE,
	'failover' => array(),
	'save_queries' => TRUE
);

Perhatikan!

Di dalam konfigurasi ini kita mengisi hostname dengan db. Ini adalah hostname dari service database yang ada di Docker.

Mengapa tidak isi dengan localhost atau 127.0.0.1 aja bang?

Karena aplikasi kita berada dalam satu jaringan di dalam docker, jari hostname db sudah aktif di sana. Kalau kita isi localhost bisa jadi nanti aplikasinya akan konek ke database yang ada di host atau luar docker.

Lalu sisanya untuk username, password, dan nama database silahkan sesuaikan saja dengan konfigurasi di docker-compose.yml yang sudah kita buat.

Oke, selanjutnya kita bisa coba jalankan Docker containernya.

6. Menjalankan Docker Container

Kita harus menjalankan docker container yang berisi service yang sudah kita siapkan di docker-compose.yml.

Gunakan perinah ini untuk menjalankannya:

docker compose up -d

Pada perintah ini kita memberikan flag -d untuk menjalankan secara background (deamon).

Jika kamu ingin menghentikan container, gunakan perintah ini:

docker compose down

Tapi biarkan saja dulu berjalan, karena kita mau coba jalankan project-nya di sana. Nanti kalau sudah selesai baru jalankan perintah untuk menghentikan container.

Oke lanjut ke tahap berikutnya.

7. Mengakses Aplikasi

Setelah kita menjalankan docker container, kita bisa mencoba mengakses aplikasi dari browser dengan membuka alamat http://localhost:8000.

Tampilan aplikasi codeigniter running dengan docker

Dan untuk membuka Phpmyadmin buka alamat http://localhost:8080

tampilan PHPmyadmin running dengan docker

Dengan begini, aplikasi Codeigniter kita sudah bisa berjalan dengan Docker.

Apa Selanjutnya?

Nah, dengan mengikuti tutorial ini, sekarang kamu bisa jalanin proyek CodeIgniter 3 di Docker dengan konfigurasi yang kita buat tadi. Docker bikin hidup lebih mudah dengan konsistensi lingkungan, isolasi, portabilitas, dan kemudahan pengelolaan.

Kalau ada pertanyaan atau masalah yang kamu hadapi, jangan ragu buat tanya di kolom komentar ya! Selamat bereksperimen dengan Docker dan CodeIgniter 3! 🙌