Membuat Docker Compose untuk CodeIgniter 4 dengan Apache, PostgreSQL, dan pgAdmin

Docker telah menjadi solusi populer dalam pengembangan aplikasi karena kemampuannya dalam mengelola lingkungan secara konsisten. Dalam artikel ini, kita akan membahas cara membuat Docker Compose untuk menjalankan CodeIgniter 4 dengan Apache, PostgreSQL, dan pgAdmin. Konfigurasi ini juga akan mengaktifkan ekstensi PHP intl, pgsql, dan mod_rewrite menggunakan Dockerfile untuk pengaturan yang lebih fleksibel

Struktur Folder

pastikan struktur proye seperti berikut

/project-root
├── docker-compose.yml
├── Dockerfile

Setiap layanan memiliki folder dan Dockerfile sendiri agar dapat dikustomisasi secara modular.

Konfigurasi Dockerfile untuk Codeigniter 4

Buat file app/Dockerfile untuk PHP dengan Apache, mengaktifkan ekstensi yang dibutuhkan seperti pgsql, intl, dan mengaktifkan mod_rewrite:

# Menggunakan image dasar PHP dengan Apache
FROM php:8.2-apache

# Perbarui package manager dan install ekstensi yang diperlukan
RUN apt-get update && apt-get install -y \
    libicu-dev \
    libpq-dev \
    unzip

# Aktifkan ekstensi PHP Intl dan PostgreSQL
RUN docker-php-ext-install intl pgsql

# Aktifkan mod_rewrite Apache
RUN a2enmod rewrite

# Restart Apache agar perubahan berlaku
RUN service apache2 restart

EXPOSE 80
CMD ["apache2-foreground"]

Konfigurasi Docker Compose

Buat file docker-compose.yml untuk menghubungkan semua layanan:

version: '3.8'

services:
  app:
    build: .
    container_name: codeigniter4_app
    restart: always
    volumes:
      - ./html:/var/www/html
    ports:
      - "8080:80"
    depends_on:
      - db
    environment:
      - CI_ENV=development
    networks:
      - ci_network

  db:
    image: postgres:15
    container_name: ci4_postgres
    restart: always
    environment:
      POSTGRES_USER: ci4_user
      POSTGRES_PASSWORD: ci4_password
      POSTGRES_DB: ci4_database
    volumes:
      - ./postgresql/data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    networks:
      - ci_network

  pgadmin:
    image: dpage/pgadmin4
    container_name: pgadmin_ci4
    restart: always
    environment:
      PGADMIN_DEFAULT_EMAIL: [email protected]
      PGADMIN_DEFAULT_PASSWORD: adminpassword
    ports:
      - "5050:80"
    depends_on:
      - db
    networks:
      - ci_network

networks:
  ci_network:
    driver: bridge

Menjalankan Docker Compose

Setelah semua konfigurasi selesai, jalankan perintah berikut untuk membangun semua layanan:

docker-compose up --build -d

Install IoT Stack dengan Docker Compose

Terbaru, saya sedang ada project untuk membuat IoT Stack. Stack ini terdiri dari mqtt broker yang menerima data dari sensor, kemudian ada nodered sebagai penghubung antara broker dengan database. Untuk database saya pakai influxdb. Dan, yang terakhir yaitu Grafana untuk menampilkan data yang sudah disimpan dalam database.

Berikut contoh docker composenya:

version: '3.9'

services:
  mqtt:
    image: eclipse-mosquitto
    container_name: mqtt
    user: "0"
    ports:
      - "1883:1883"
      - "9001:9001"
    volumes:
      - ./mosquitto/config:/mosquitto/config
      - ./mosquitto/data:/mosquitto/data
      - ./mosquitto/log:/mosquitto/log

  nodered:
    image: nodered/node-red
    container_name: nodered
    user: "0"
    ports:
      - "1880:1880"
    dns:
      - "8.8.8.8"
      - "1.1.1.1"
    volumes:
      - ./nodered/data:/data

  influxdb:
    image: influxdb:latest
    container_name: influxdb
    user: "0"
    ports:
      - "8086:8086"
    volumes:
      - ./influxdb/data/influxdb2:/var/lib/influxdb2
      - ./influxdb/data/etc:/etc/influxdb2
    environment:
      - INFLUXDB_ADMIN_USER=admin
      - INFLUXDB_ADMIN_PASSWORD=adminpassword
      - INFLUXDB_DB=mydatabase

  grafana:
    image: grafana/grafana
    container_name: grafana
    user: "0"
    ports:
      - "3000:3000"
    volumes:
      - ./grafana/data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=adminpassword

Docker compose diatas menggunakan persisten data yang disimpan dalam directory host-nya.

Pengalaman sebelumnya ada kendala soal persisten data untuk influxdb. Sehingga data yang tersimpan hilang saat container dibuat ulang atau dihapus, padahal settingan volume sudah diset dengan benar.

Ketika di-cek di portainer, ada volume yang di-create oleh container influxdb ini, jadi tidak memakai mount directory yang sudah disetting di docker compose.

Ada dua volume yang di-create oleh container. dari dua volume itu akhirnya saya buatkan directory mount nya. Saya coba-coba lagi docker compose down and up lagi dan lagi, akhirnya tidak ter-create volume lagi, dan berhasil mount directory host.