Local Development with Docker, MySQL, and GitHub Automation β
π³ Apa Itu Docker? β
Docker adalah platform open-source yang digunakan untuk mengembangkan, menjalankan, dan mendistribusikan aplikasi dalam bentuk container. Singkatnya, Docker adalah alat yang memungkinkan kamu untuk membuat, menjalankan, dan membagi aplikasi dalam lingkungan terisolasi yang disebut container, tanpa khawatir tentang perbedaan konfigurasi di komputer berbeda.
Container adalah unit ringan dan mandiri yang berisi segala sesuatu yang dibutuhkan agar aplikasi bisa berjalan:
- Kode aplikasi
- Library (pustaka)
- Runtime
- Pengaturan (dependencies)
Container pada docker mirip dengan mesin virtual (VM), tapi jauh lebih ringan karena tidak memerlukan sistem operasi lengkap.
π³ Komponen Utama Docker β
| Komponen | Penjelasan |
|---|---|
| Dockerfile | File teks yang berisi instruksi untuk membuat image. |
| Image | Template read-only yang digunakan untuk membuat container. |
| Container | Instansi dari image yang sedang berjalan. |
| Docker Hub | Repositori online tempat menyimpan dan berbagi image. |
| docker-compose.yml | File konfigurasi untuk menjalankan beberapa container sekaligus. |
π§© Perintah Dasar Docker β
Berikut adalah daftar perintah Docker penting yang sering digunakan dalam pengembangan dan manajemen aplikasi berbasis container. Perintah-perintah ini bisa kamu jalankan di terminal (Command Prompt, PowerShell, atau Terminal Unix/Linux/macOS).
Menjalankan Container
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]Contoh:
# Menjalankan container dari image ubuntu
docker run ubuntu
# Jalankan container dan masuk ke shell-nya
docker run -it ubuntu bash
# Jalankan container dengan port mapping
docker run -d -p 80:80 nginx
-dβ menjalankan container di background (detached mode)-pβ mapping port host ke container-itβ interactive + TTY (untuk akses shell)
π§© Perintah-perintah lainnya β
# π¦ Melihat container yang sedang berjalan
docker ps
# Melihat semua container (termasuk yang berhenti)
docker ps -a
# βΈοΈ Berhenti, mulai, dan restart container
docker stop <container_id_or_name>
docker start <container_id_or_name>
docker restart <container_id_or_name>
# π₯ Menghapus container
docker rm <container_id_or_name> # Hapus satu container
docker rm container1 container2 # Hapus beberapa container sekaligus
docker container prune # Hapus semua container yang berhenti
# πΌοΈ Mengelola image
docker images # Lihat semua image lokal
docker rmi <image_name_or_id> # Hapus image
docker pull nginx # Pull image dari Docker Hub
# π¨ Build image dari Dockerfile
docker build -t nama_image:tag . # Build image dengan tag
# Contoh:
docker build -t my-app:v1 .
# π§ͺ Melihat log container
docker logs <container_id_or_name> # Lihat log biasa
docker logs -f <container_id_or_name> # Lihat log realtime (follow)
# π¬ Eksekusi perintah di dalam container
docker exec -it <container_id_or_name> <command> # Eksekusi perintah
# Contoh:
docker exec -it my_container bash
docker exec -it my_container ls /app
# π Docker Network
docker network ls # Lihat semua network
docker network inspect <network_name> # Lihat detail sebuah network
docker network create <network_name> # Buat network baru (default: bridge)
docker network create --driver overlay my_overlay # Buat network dengan driver overlay
docker network connect <network> <container> # Sambungkan container ke network
docker network disconnect <network> <container> # Putuskan container dari network
docker network rm <network_name> # Hapus network tertentu
docker network prune # Hapus semua network yang tidak digunakan
# π§© Docker Compose (untuk aplikasi multi-container)
docker-compose up # Jalankan aplikasi
docker-compose up --build # Jalankan + build ulang image
docker-compose down # Hentikan dan hapus container
docker-compose down -v # Termasuk volume
# π§Ή Pembersihan sistem
docker container prune # Hapus container yang berhenti
docker image prune -a # Hapus image yang tidak terpakai
docker network prune # Hapus network yang tidak dipakai
docker system prune # Bersihkan semua resource tak terpakai
docker system prune -a --volumes # Termasuk volume dan semua imageAutomation Flow β
Berikut adalah langkah-langkah otomatisasi workflow pengembangan aplikasi dengan Docker, dari setup hingga distribusi image ke Docker Hub.
| Langkah | Deskripsi |
|---|---|
| 1 | Clone repo |
| 2 | Buat folder & jalankan MySQL dengan DB contact_form |
| 3 | Import contact_form.sql ke mysql1 |
| 4 | Jalankan phpMyAdmin |
| 5 | Build image sempaner-web |
| 6 | Jalankan sempaner-container |
| 7 | Buat network & hubungkan semua container |
| 8 | Push image ke Docker Hub |
docker-compose adalah tool untuk mendefinisikan dan menjalankan multi-container Docker application menggunakan file YAML. Ini sangat berguna untuk mengatur database, frontend, backend dalam satu konfigurasi.
π§© 1. .env File β Konfigurasi Terpisah β
Memisahkan nilai variabel seperti password, nama database, atau port agar mudah diubah, tanpa menyentuh file docker-compose.yml.
π Contoh .env
Buat file .env di direktori yang sama dengan docker-compose1.yml:
MYSQL_ROOT_PASSWORD=1234
MYSQL_DATABASE=contact_form
PMA_PORT=8082
WEB_PORT=8088β οΈ Jangan upload file .env ke public repo!
Gunakan .gitignore dan simpan kredensial sensitif via GitHub Secrets atau .env.local.
π Lalu ubah docker-compose1.yml menjadi:
services:
mysql1:
image: mysql:latest
container_name: mysql1
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_ROOT_HOST: "%"
MYSQL_DATABASE: ${MYSQL_DATABASE}
volumes:
- ./data-mysql:/var/lib/mysql
- ./SEMPANER-WEB/uploads/contact_form.sql:/docker-entrypoint-initdb.d/contact_form.sql
networks:
- network1
phpmyadmin:
image: phpmyadmin
container_name: pma-container
ports:
- "${PMA_PORT}:80"
environment:
PMA_HOST: mysql1
depends_on:
- mysql1
networks:
- network1
sempaner-web:
build:
context: .
dockerfile: Dockerfile
container_name: sempaner-container
ports:
- "${WEB_PORT}:80"
depends_on:
- mysql1
networks:
- network1π 2. Automation Build + Push ke Docker Hub β
Agar kamu tidak perlu build & push manual tiap kali ada perubahan pada project lokal.
π§ Opsi 1: Gunakan Skrip Shell/Powershell
build-and-push.ps1
docker build -t allbibek/sempaner-web:latest -f Dockerfile .
docker login
docker push allbibek/sempaner-web:latestJalankan:
.\build-and-push.ps1π§ Opsi 2: Gunakan GitHub Actions
Jika kamu ingin CI/CD otomatis dari GitHub (misalnya saat push ke branch main), bisa pakai GitHub Actions:
.github/workflows/docker-publish.yml
name: Build and Push Docker Image
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push
uses: docker/build-push-action@v3
with:
context: .
push: true
tags: allbibek/sempaner-web:latestCatatan
- Kamu harus menyimpan
DOCKER_USERNAMEdanDOCKER_PASSWORDdi GitHub Secrets. - Buildx adalah builder baru dari Docker yang mendukung build multi-platform dan cache, berguna saat kamu ingin build image untuk ARM64 dan AMD64, atau mempercepat proses CI/CD.
π 3. Docker Compose versi Production (dengan Volume & Persistensi Lebih Baik) β
Menghindari data hilang saat container dihapus dan memisahkan data runtime.
π Perubahan:
services:
mysql1:
...
volumes:
- mysql_data:/var/lib/mysql
- ./SEMPANER-WEB/uploads/contact_form.sql:/docker-entrypoint-initdb.d/contact_form.sql
...
volumes:
mysql_data:TIP
Kamu tidak perlu membuat folder data-mysql secara manual, Docker akan kelola volume tersebut secara internal dan aman untuk production.
π§Ύ Kesimpulan
| Fitur | Fungsi | Direkomendasikan untuk |
|---|---|---|
.env | Konfigurasi terpisah | Semua environment |
build-and-push.ps1 | Build + push manual | Local development |
| GitHub Actions | CI/CD otomatis | Deployment ke Docker Hub |
| Named Volume | Persistensi data | Production (lebih bersih dari bind mount) |
TIP
- π Bind Mount: Menghubungkan folder lokal ke container (berguna saat development).
- π Named Volume: Disimpan oleh Docker di lokasi default, cocok untuk production karena lebih stabil dan terisolasi.
Production-ready Setup β
β Struktur Direktori
EVALUASI/
βββ .env
βββ docker-compose.production.yml
βββ Dockerfile
βββ SEMPANER-WEB/
β βββ index.php
β βββ uploads/
β βββ contact_form.sql
βββ build-and-push.ps1
βββ .github/
βββ workflows/
βββ docker-publish.yml1οΈβ£ .env File
EVALUASI/.env
MYSQL_ROOT_PASSWORD=1234
MYSQL_DATABASE=contact_form
PMA_PORT=8082
WEB_PORT=80882οΈβ£ docker-compose.production.yml
version: '3.9'
services:
mysql1:
image: mysql:latest
container_name: mysql1
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_ROOT_HOST: "%"
MYSQL_DATABASE: ${MYSQL_DATABASE}
volumes:
- mysql_data:/var/lib/mysql
- ./SEMPANER-WEB/uploads/contact_form.sql:/docker-entrypoint-initdb.d/contact_form.sql
networks:
- network1
phpmyadmin:
image: phpmyadmin
container_name: pma-container
restart: unless-stopped
ports:
- "${PMA_PORT}:80"
environment:
PMA_HOST: mysql1
depends_on:
- mysql1
networks:
- network1
sempaner-web:
build:
context: .
dockerfile: Dockerfile
container_name: sempaner-container
restart: unless-stopped
ports:
- "${WEB_PORT}:80"
depends_on:
- mysql1
networks:
- network1
networks:
network1:
driver: bridge
volumes:
mysql_data:Catatan
Mulai Docker Compose v1.27+ (dan terutama v2+), Compose secara otomatis menggunakan versi schema terbaru.*
3οΈβ£ Dockerfile
EVALUASI/Dockerfile
FROM php:8.2-apache
RUN apt-get update && \
apt-get upgrade -y && \
apt-get install -y nano && \
docker-php-ext-install mysqli
COPY SEMPANER-WEB/ /var/www/html/4οΈβ£ Build dan Push Manual ke Docker Hub
EVALUASI/build-and-push.ps1
docker build -t allbibek/sempaner-web:latest -f Dockerfile .
docker login
docker push allbibek/sempaner-web:latestJalankan dengan:
.\build-and-push.ps15οΈβ£ CI/CD Otomatis ke Docker Hub (GitHub Actions)
EVALUASI/.github/workflows/docker-publish.yml
name: Build and Push to Docker Hub
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and Push Docker Image
uses: docker/build-push-action@v3
with:
context: .
push: true
tags: allbibek/sempaner-web:latestπ― Tambahkan secrets di GitHub repo kamu:
DOCKER_USERNAME= username Docker Hub kamuDOCKER_PASSWORD= password Docker Hub kamu
π§ Menjalankan docker-compose.production.yml β
# Run Docker Compose
docker compose -f docker-compose.production.yml --env-file .env up -d --build
# Cek status container
docker ps
# Hentikan container jika perlu
docker compose -f docker-compose.production.yml downCatatan Penting! β
Supaya semua perubahan yang kamu buat (termasuk apt install nano, konfigurasi, file PHP, dll) bisa dibagikan atau dipush ulang ke Docker Hub, kamu perlu membuat ulang (rebuild) imagenya, lalu push lagi. Berikut langkah-langkah:
β 1. Commit Container ke Image Baru (jika edit dilakukan di container langsung) β
Jika kamu mengedit langsung di container (bukan rebuild Dockerfile), lakukan ini:
docker commit sempaner-container allbibek/sempaner-web:latestIni akan menyimpan kondisi container saat ini ke image baru.
- Membuat image baru berdasarkan container
sempaner-container. - Semua perubahan terakhir dalam container (misalnya: edit file, install nano, perubahan konfigurasi) akan tersimpan dalam image tersebut.
- Kamu bisa melihat hasilnya dengan
docker images.
β 2. Push ke Docker Hub β
docker login
docker push allbibek/sempaner-web:latestdocker login Memastikan kamu login ke Docker Hub agar bisa push.
Perintah docker push allbibek/sempaner-web:latest akan Mengupload image hasil commit tadi ke Docker Hub. Jika sebelumnya sudah ada image dengan tag latest, maka akan tertimpa (mirip seperti git push origin main menimpa commit lama).
π Kesimpulan β
docker commit= sepertigit commit, menyimpan kondisi terbaru container ke image.docker push= sepertigit push, mengirim image itu ke Docker Hub.- Perubahan container (file, konfigurasi, instalasi) akan diterapkan dan tersedia di Docker Hub jika sudah di-commit dan di-push.
π§ Penutup β
π§Ύ Ringkasan Singkat β
- Gunakan
.envβ agar konfigurasi mudah dikelola - Gunakan
volumeβ untuk simpan data yang tahan hapus - Build image lokal β
docker build - Push otomatis β GitHub Actions + Docker Hub
Dengan struktur ini:
| Komponen | Fungsi | Manfaat |
|---|---|---|
.env | Konfigurasi terpisah | Mudah ubah tanpa edit YML |
volume | Persistensi data MySQL | Tidak hilang meski container dihapus |
docker-entrypoint-initdb.d | Auto-import contact_form.sql saat container pertama kali run | Praktis |
build-and-push.ps1 | Build manual | Untuk development/testing lokal |
| GitHub Actions | Build + push otomatis saat push ke main | CI/CD Docker |
π Ingin mencoba? Clone repo Sempaner-Web dan jalankan docker-compose up sekarang!