FAQ Kerja Sama ServBay dan Docker
Saat menggunakan ServBay untuk pengembangan web lokal, Anda mungkin ingin mengintegrasikan lingkungan kontainer Docker. FAQ ini bertujuan untuk menjawab berbagai pertanyaan umum tentang kerja sama ServBay dan Docker di macOS dan Windows, termasuk cara mengakses servis ServBay dari Docker serta menggunakan ServBay sebagai reverse proxy untuk aplikasi dalam kontainer Docker.
Q1: Kenapa ServBay memodifikasi file hosts
sistem saya? Bisakah saya mencegahnya?
ServBay menambahkan entri ke file hosts
sistem (misalnya mysite.servbay.demo 127.0.0.1
) agar Anda dapat mengakses website lokal menggunakan domain khusus seperti mysite.servbay.demo
. Situs-situs ini pada dasarnya berjalan di alamat 127.0.0.1
di komputer Anda.
Namun, karena mekanisme Docker, file hosts dari sistem utama (macOS atau Windows) dibaca oleh Docker, sehingga mysite.servbay.demo
akan di-resolve ke 127.0.0.1
. Akibatnya, Docker justru mengakses servis dari dalam kontainer Docker itu sendiri (bukan dari host).
Mekanisme utama:
- Saat Anda membuat website di ServBay dan menetapkan nama domain (misal
example.servbay.demo
), ServBay otomatis mengarahkan domain itu ke127.0.0.1
. - Inilah cara standar untuk memungkinkan akses domain custom secara lokal. Jika ServBay tidak mengubah file hosts, Anda hanya dapat mengakses via alamat seperti
http://127.0.0.1:PORT
tanpa domain custom.
Bisakah dicegah?
Secara teori, Anda bisa menghapus entri dari ServBay secara manual, tapi Anda tidak akan bisa mengakses website lokal dengan domain yang diatur ServBay. Ini justru bertentangan dengan tujuan ServBay yaitu memudahkan pengembangan lokal. Salah satu fitur utama ServBay adalah menyederhanakan pembuatan dan akses website lokal. Jika Anda tidak ingin ServBay mengelola entri hosts untuk domain tertentu, sebaiknya jangan buat website dengan domain tersebut di ServBay.
Untuk sebagian besar kasus pengembangan lokal, pengelolaan otomatis file hosts oleh ServBay adalah perilaku yang diharapkan dan sangat membantu proses pengembangan.
Q2: Bagaimana cara kontainer Docker saya mengakses situs web yang dikelola ServBay di host (misalnya mysite.servbay.demo
) secara benar via domain?
Ini adalah kebutuhan umum yang harus diatur dengan benar agar tidak menimbulkan masalah. Jika ServBay menjalankan website di host Anda (misal mysite.servbay.demo
di-resolve ke 127.0.0.1
), dalam kontainer Docker, 127.0.0.1
mengacu pada kontainer itu sendiri—bukan sistem host.
Cara salah: Menggunakan host.docker.internal
langsung sebagai host URL untuk akses situs ServBay
Walaupun Docker Desktop for Mac (dan Windows) menyediakan DNS khusus host.docker.internal
agar kontainer bisa mengakses IP host, tidak disarankan menggunakan nama ini langsung di URL untuk mengakses website di ServBay (misal akses ke http://host.docker.internal/
dan berharap akan menampilkan mysite.servbay.demo
).
Hal ini karena permintaan HTTP yang dikirim ke server web ServBay (misal Caddy atau Nginx) dari Docker akan memiliki header Host
berisi host.docker.internal
. Server web ServBay menggunakan header ini untuk menentukan website mana yang diminta. Jika header ini bukan domain asli (mysite.servbay.demo
), server tidak dapat meroute permintaan dengan benar, dan untuk HTTPS bisa terjadi kesalahan SNI (Server Name Indication), sebab sertifikat SSL dibuat untuk mysite.servbay.demo
, bukan untuk host.docker.internal
.
Solusi yang benar: Tambah entri dengan extra_hosts
saat kontainer Docker dijalankan
Agar aplikasi dalam kontainer Docker bisa menggunakan nama domain aslinya (misal mysite.servbay.demo
) dan mengirim header Host
yang tepat, tambahkan entri ke /etc/hosts
kontainer—mengarah ke IP host. Ini bisa dilakukan dengan fitur extra_hosts
di docker-compose.yml
atau opsi --add-host
dengan perintah docker run
, mengarahkan domain ke host.docker.internal
atau yang lebih disarankan, host-gateway
.
Dengan
docker run
:bashdocker run --add-host=mysite.servbay.demo:host-gateway ... your_image
1(
host-gateway
adalah nilai spesial yang secara otomatis diganti Docker dengan IP host internal. Di Docker 20.10+ ini lebih reliable daripadahost.docker.internal
.)Dengan
docker-compose.yml
:yamlversion: '3.8' # atau lebih tinggi services: myapp: image: your_image extra_hosts: - "mysite.servbay.demo:host-gateway" # atau "mysite.servbay.demo:host.docker.internal" # ... konfigurasi lain
1
2
3
4
5
6
7
Setelah konfigurasi:
- Saat aplikasi dalam kontainer mencoba akses ke
http://mysite.servbay.demo
atauhttps://mysite.servbay.demo
, /etc/hosts kontainer akan resolve domain ke IP host (macOS/Windows). - Permintaan dikirim ke server web ServBay yang berjalan di host.
- Header HTTP
Host
adalahmysite.servbay.demo
, server ServBay dapat meroute permintaan dengan benar dan menyajikan sertifikat SSL yang sesuai (jika HTTPS digunakan).
Q3: Bagaimana cara kontainer Docker saya terhubung ke database (MySQL, PostgreSQL) atau servis non-HTTP lainnya yang dikelola ServBay?
Berbeda dengan akses web yang berbasis domain, untuk koneksi database atau layanan TCP yang tidak perlu SNI, menggunakan host.docker.internal
sebagai hostname adalah metode yang direkomendasikan dan efektif.
Langkah-langkah:
- Pastikan layanan database ServBay (atau layanan lain) sudah dijalankan, dan diatur agar menerima koneksi dari host (umumnya default sudah mendukung untuk pengembangan lokal).
- Di aplikasi dalam kontainer Docker:
- Hostname/server: gunakan
host.docker.internal
- Port: gunakan port yang dikonfigurasi ServBay untuk database/servis (contoh: MySQL
3306
, PostgreSQL5432
) - Username/password: gunakan kredensial yang Anda set di ServBay.
- Hostname/server: gunakan
Contoh (koneksi MySQL dari ServBay): Misal ServBay menjalankan MySQL di port 3306
. Konfigurasi aplikasi Anda dalam Docker:
- Host:
host.docker.internal
- Port:
3306
- User:
your_db_user
- Password:
your_db_password
Q4: Jika kontainer Docker mengakses website ServBay via domain (dengan extra_hosts
) menggunakan HTTPS dan Sertifikat ServBay User CA, bagaimana agar kontainer dapat mempercayai CA tersebut?
Anggap Anda telah mengikuti saran Q2, menambahkan domain secure.servbay.demo
ke host dengan extra_hosts
atau --add-host
. Jika website menggunakan sertifikat SSL dari ServBay User CA, kontainer Docker Anda secara default tidak mempercayai CA tersebut sehingga handshake SSL gagal.
Lokasi file CA ServBay:
- Root certificate ServBay User CA:
- macOS:
/Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt
- Windows:
C:\ServBay\ssl\private\ServBay-Private-CA-ECC-Root.crt
- macOS:
- File PEM gabungan ServBay User CA, Public CA, dan root Mozilla:
- macOS (ARM):
/Applications/ServBay/package/common/openssl/3.2/cacert.pem
- macOS (Intel):
/Applications/ServBay/package/common/openssl/1.1.1u/cacert.pem
- Windows:
C:\ServBay\package\common\openssl\3.3\cacert.pem
- macOS (ARM):
Ringkasan solusi:
Ada beberapa cara agar kontainer Docker mempercayai ServBay User CA:
- Metode 1: Sistem trust saat build (lewat Dockerfile) - Cocok jika Anda butuh seluruh sistem dan aplikasi mempercayai CA, dan image bisa dimodifikasi.
- Metode 2: Trust aplikasi saat runtime (mount volume + environment variable) - Cocok jika Anda hanya butuh aplikasi tertentu mempercayai CA atau tidak ingin mengubah image.
- Metode 3: Trust sistem saat runtime (mount volume + perintah custom saat startup) - Cocok jika ingin trust sistem secara runtime tanpa build image custom.
Metode 1: Sistem trust saat build (lewat Dockerfile)
CA dimasukkan ke kepercayaan sistem saat proses build image Docker.
- Siapkan file CA: Copy ServBay User CA ke context Docker build (satu folder dengan Dockerfile):
- macOS:
/Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt
- Windows:
C:\ServBay\ssl\private\ServBay-Private-CA-ECC-Root.crt
- macOS:
- Contoh Dockerfile (Debian/Ubuntu):dockerfile
# Dockerfile FROM ubuntu:latest COPY ServBay-Private-CA-ECC-Root.crt /usr/local/share/ca-certificates/ServBay-User-CA.crt RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && \ update-ca-certificates && \ rm -rf /var/lib/apt/lists/*
1
2
3
4
5
6 - Contoh Dockerfile (Alpine):dockerfile
# Dockerfile FROM alpine:latest COPY ServBay-Private-CA-ECC-Root.crt /usr/local/share/ca-certificates/ServBay-User-CA.crt RUN apk add --no-cache ca-certificates && update-ca-certificates
1
2
3
4 - Docker Compose build:yaml
# docker-compose.yml version: '3.8' services: myapp: build: context: ./app_service # folder berisi Dockerfile dan ServBay-Private-CA-ECC-Root.crt dockerfile: Dockerfile extra_hosts: ["secure.servbay.demo:host-gateway"]
1
2
3
4
5
6
7
8
Metode 2: Trust aplikasi saat runtime (mount volume + environment variable)
File CA di-mount ke kontainer, lalu aplikasi tertentu di-set agar menggunakan CA dengan environment variable.
- Contoh
docker-compose.yml
:yamlPastikan Anda mengecek dokumentasi aplikasi terkait environment variable yang didukung.version: '3.8' services: myapp: image: some-base-image volumes: # Contoh path macOS - /Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt:/etc/ssl/certs/MyCustomCA.crt:ro # Path Windows (sesuaikan dengan sistem Anda) # - C:\ServBay\ssl\private\ServBay-Private-CA-ECC-Root.crt:/etc/ssl/certs/MyCustomCA.crt:ro environment: # Contoh untuk Node.js: - NODE_EXTRA_CA_CERTS=/etc/ssl/certs/MyCustomCA.crt # Contoh untuk Python (requests): # - REQUESTS_CA_BUNDLE=/etc/ssl/certs/MyCustomCA.crt # Contoh generic: # - SSL_CERT_FILE=/etc/ssl/certs/MyCustomCA.crt extra_hosts: ["secure.servbay.demo:host-gateway"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Metode 3: Trust sistem saat runtime (mount volume + custom perintah startup)
Metode ini menggabungkan mount volume dengan eksekusi perintah untuk memperbarui kepercayaan CA saat kontainer dijalankan, tanpa build image baru. Perlu skrip entrypoint custom.
- Contoh
docker-compose.yml
(basis Debian/Ubuntu):yamlCatatan:version: '3.8' services: myapp: image: ubuntu:latest # Bisa juga image lain yang mendukung update-ca-certificates volumes: # Mount CA ke direktori sistem # macOS - /Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt:/usr/local/share/ca-certificates/ServBay-User-CA.crt:ro # Windows (sesuaikan dengan sistem) # - C:\ServBay\ssl\private\ServBay-Private-CA-ECC-Root.crt:/usr/local/share/ca-certificates/ServBay-User-CA.crt:ro # Override command untuk update CA dan lalu menjalankan app # Jalankan container sebagai root atau user yang punya hak update-ca-certificates command: > sh -c " echo 'Memperbarui sertifikat CA...' && if command -v update-ca-certificates > /dev/null; then if [ ! -f /usr/bin/update-ca-certificates ]; then apt-get update && apt-get install -y --no-install-recommends ca-certificates; fi && update-ca-certificates && echo 'CA certificates diperbarui.' else echo 'update-ca-certificates tidak ditemukan, melewatkan update CA.' fi && echo 'Menjalankan aplikasi...' && exec your_original_application_command_here # Ganti dengan command asli aplikasi Anda " extra_hosts: ["secure.servbay.demo:host-gateway"] # Jika perlu menjalankan sebagai root untuk update CA tapi aplikasi run bukan root, buat entrypoint script khusus # user: root # Untuk sementara, atau handle via entrypoint script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28- Kompleksitas: Modifikasi command bisa rumit untuk image dengan logic startup kompleks. Pastikan command aplikasi benar.
- Permission:
update-ca-certificates
butuh root. Jika default user bukan root, bisa gagal atau perlu akses lebih. - Dependency: Kontainer harus memiliki paket
ca-certificates
dan commandupdate-ca-certificates
. Skema skrip di atas akan menginstal bila perlu (untuk basis apt). - Waktu startup: Setiap boot kontainer menjalankan pemeriksaan dan perintah ini—waktu startup sedikit bertambah.
- Alpine Linux: Untuk Alpine gunakan perintah
apk add --no-cache ca-certificates && update-ca-certificates
.
Mana cara yang sebaiknya dipilih?
- Jika Anda bisa build image custom dan butuh trust CA di sistem dan aplikasi, Metode 1 biasanya terbaik.
- Jika tidak ingin mengubah image, dan cukup aplikasi tertentu yang trust CA, Metode 2 sangat praktis.
- Jika tidak ingin build image, perubahan sistem minimal dan butuh trust sistem saat runtime, Metode 3 paling cocok.
Untuk sertifikat dari CA publik (misal Let's Encrypt): Jika website ServBay menggunakan Let's Encrypt atau CA publik lain via ACME, kebanyakan image Docker sudah mempercayai CA publik secara default, sehingga tidak butuh langkah tambahan.
Q5: Bagaimana cara menggunakan ServBay untuk mengatur domain dan reverse proxy aplikasi di dalam kontainer Docker?
Anda mungkin ingin menjalankan aplikasi di kontainer Docker (misal service Node.js pada port 3000
) dan mengaksesnya dengan domain ramah (seperti myapp.servbay.demo
) dari browser host, menggunakan SSL yang dikelola ServBay.
Langkah-langkah:
Jalankan kontainer Docker dan map port ke
127.0.0.1
host: Pastikan port aplikasi dalam kontainer Docker di-mapping ke port di host (macOS/Windows), dan gunakan IP127.0.0.1
. Tujuannya agar port hanya bisa diakses dari lokal host, bukan dari luar.bash# Contoh: aplikasi dalam kontainer dengar di port 3000, mapping ke host 127.0.0.1:3001 docker run -d -p 127.0.0.1:3001:3000 your-docker-app-image
1
2Dalam contoh ini, aplikasi dalam kontainer listening
3000
, akses dari host viahttp://127.0.0.1:3001
.Tambahkan situs baru di ServBay dan konfigurasikan reverse proxy:
- Buka dashboard admin ServBay.
- Klik “Tambah Website.”
- Domain: Masukkan domain yang ingin digunakan, contoh
myapp.servbay.demo
. - Tipe website: Pilih “Reverse Proxy”.
- IP address: Masukkan
127.0.0.1
. - Port: Masukkan port hasil mapping dari Docker, misal
3001
. - Klik “Simpan” atau “Tambah.”
(Opsional) Konfigurasi SSL: Setelah situs ditambahkan, Anda dapat mengaktifkan SSL di pengaturan ServBay. ServBay mendukung sertifikat otomatis via ACME (Let's Encrypt), atau bisa menggunakan ServBay User CA/Public CA. SSL dihandle ServBay, dengan request dari ServBay ke aplikasi Docker bisa tetap HTTP (
http://127.0.0.1:3001
).Tes akses: Setelah konfigurasi, Anda should bisa mengakses
http://myapp.servbay.demo
atauhttps://myapp.servbay.demo
(jika SSL aktif) di browser. ServBay akan memproxy permintaan ke aplikasi dalam kontainer Docker.
Alur kerja: Browser user ->
https://myapp.servbay.demo
->
ServBay (handle SSL, cari aturan proxy) ->
http://127.0.0.1:3001
(port di host) ->
aplikasi dalam kontainer Docker.
Ringkasan
ServBay sangat menyederhanakan pengembangan web lokal di macOS dan Windows. Jika dipakai bersama Docker:
- Untuk mengakses website ServBay dari kontainer Docker, gunakan
extra_hosts
atau--add-host
untuk mengarahkan domain kehost-gateway
, agar headerHost
tetap benar dan mencegah masalah SNI. - Untuk mengakses database ServBay atau servis non-HTTP dari Docker, gunakan
host.docker.internal
sebagai hostname server—mudah dan efektif. - Untuk membuat Docker trust Sertifikat SSL ServBay User CA, salin CA ke image Docker dan update trusted certificates-nya.
- Untuk menggunakan ServBay sebagai reverse proxy ke aplikasi dalam Docker, di ServBay buat website dengan tipe “Reverse Proxy” dan arahkan ke port Docker yang di-mapping ke
127.0.0.1
.
Pastikan semua paket ServBay (web server, database, dll.) serta kontainer Docker Anda telah dikonfigurasi dan berjalan dengan benar agar integrasi optimal.