FAQ Kolaborasi ServBay dan Docker
Saat menggunakan ServBay untuk pengembangan web lokal, Anda mungkin ingin memanfaatkan lingkungan terkontainerisasi dengan Docker. FAQ ini ditujukan untuk menjawab berbagai pertanyaan umum seputar kolaborasi ServBay dan Docker, khususnya di lingkungan macOS, termasuk akses ServBay dari dalam Docker dan penerapan reverse proxy dari ServBay ke aplikasi di dalam kontainer Docker.
Q1: Mengapa ServBay memodifikasi file hosts
sistem saya? Bisakah saya mencegahnya?
ServBay menambahkan entri ke file hosts
pada sistem Anda (misal mysite.servbay.demo 127.0.0.1
) sehingga Anda bisa mengakses situs pengembangan lokal dengan nama domain kustom seperti mysite.servbay.demo
. Situs-situs ini sebenarnya dijalankan pada alamat 127.0.0.1
di komputer Anda.
Akan tetapi, karena mekanisme Docker, file hosts akan dibaca ulang dari host macOS ke dalam kontainer. Akibatnya, mysite.servbay.demo
akan diarahkan ke 127.0.0.1
, sehingga Docker justru mengakses layanannya sendiri di dalam kontainer, bukan situs di host.
Mekanisme inti:
- Saat Anda membuat situs baru di ServBay dan menentukan nama domain (misal
example.servbay.demo
), ServBay otomatis mengarahkannya ke127.0.0.1
. - Ini adalah cara standar agar situs pengembangan lokal mudah diakses. Jika Anda tidak memodifikasi file hosts, Anda hanya dapat mengakses situs melalui alamat seperti
http://127.0.0.1:PORT
, tanpa nama domain sendiri.
Bisakah dicegah?
Secara teori, Anda bisa menghapus entri yang ditambahkan ServBay secara manual, tetapi konsekuensinya adalah Anda tidak akan bisa lagi mengakses situs lokal Anda menggunakan domain yang diatur via ServBay—itu melemahkan tujuan utama ServBay, yaitu menyederhanakan akses dan pembuatan situs web lokal. Salah satu fitur kunci ServBay adalah otomatisasi pengelolaan domain lokal. Jika Anda tidak ingin ServBay menangani entri tertentu di file hosts
, sebaiknya jangan membuat situs di ServBay untuk domain tersebut.
Untuk kebanyakan kebutuhan pengembangan lokal, pengelolaan otomatis file hosts
oleh ServBay adalah perilaku yang diinginkan karena sangat memudahkan workflow pengembangan.
Q2: Bagaimana agar kontainer Docker saya dapat mengakses situs yang dikelola ServBay di macOS host menggunakan domain (misalnya mysite.servbay.demo
)?
Ini kebutuhan umum, namun memerlukan pendekatan yang tepat. Saat ServBay menjalankan sebuah situs di macOS host (misal mysite.servbay.demo
, yang pada host diarahkan ke 127.0.0.1
), 127.0.0.1
di dalam kontainer Docker menunjuk ke kontainer itu sendiri, bukan ke host macOS.
Cara yang salah: Langsung menggunakan host.docker.internal
sebagai hostname pada URL saat mengakses situs ServBay
Meski Docker Desktop for Mac (dan Windows) menyediakan nama DNS khusus host.docker.internal
untuk mengakses IP host dari dalam kontainer, sangat tidak disarankan menggunakan ini secara langsung pada URL situs ServBay (misal mengakses http://host.docker.internal/
dengan harapan diarahkan ke mysite.servbay.demo
).
Alasannya, ketika Anda melakukan ini, field Host
pada header HTTP request ke web server ServBay (misal Caddy atau Nginx) akan berisi host.docker.internal
. Web server ServBay sangat bergantung pada field Host
untuk menentukan ke situs mana request tersebut dialamatkan. Jika fieldnya bukan mysite.servbay.demo
, routing web server bisa gagal, bahkan untuk HTTPS akan memicu kesalahan SNI (Server Name Indication) karena sertifikat SSL yang diberikan hanya valid untuk mysite.servbay.demo
bukan untuk host.docker.internal
.
Solusi benar: Tambahkan extra_hosts
saat menjalankan kontainer Docker
Agar aplikasi di dalam kontainer Docker bisa memakai nama domain asli ServBay (misal mysite.servbay.demo
) dan mengirimkan header Host
yang benar, Anda perlu memastikan nama domain tersebut diarahkan ke IP host dari dalam /etc/hosts
kontainer. Ini bisa dilakukan lewat extra_hosts
(pada docker-compose.yml
) atau --add-host
(saat menggunakan docker run
) dan diarahkan ke host.docker.internal
atau lebih direkomendasikan ke host-gateway
.
Menggunakan
docker run
:bashdocker run --add-host=mysite.servbay.demo:host-gateway ... your_image
1(
host-gateway
adalah nilai khusus yang akan digantikan oleh Docker dengan IP internal host. Untuk Docker 20.10 ke atas, ini adalah alias low-level darihost.docker.internal
.)Menggunakan
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 dikonfigurasi:
- Saat aplikasi coba akses
http://mysite.servbay.demo
atauhttps://mysite.servbay.demo
dari dalam kontainer,/etc/hosts
kontainer akan mengarahkan domain tersebut ke IP host macOS. - Request akan sampai ke web server ServBay yang berjalan di host.
- Field
Host
pada HTTP akan tetapmysite.servbay.demo
, sehingga ServBay bisa routing permintaan ke situs yang benar dan menyediakan sertifikat SSL yang valid (jika HTTPS).
Q3: Bagaimana kontainer Docker saya terhubung ke database (misal MySQL, PostgreSQL) yang dikelola ServBay atau layanan non-HTTP lainnya?
Berbeda dengan layanan web berbasis domain, untuk koneksi ke database atau layanan TCP lain yang tidak bergantung pada SNI, menggunakan host.docker.internal
sebagai hostname server adalah metode yang disarankan dan efektif.
Langkah-langkah:
- Pastikan paket database (atau layanan lain) sudah berjalan di ServBay dan dikonfigurasi untuk menerima koneksi dari host (biasanya konfigurasi default sudah cukup untuk kebutuhan pengembangan).
- Di dalam kontainer Docker, atur parameter koneksi database seperti berikut:
- Hostname/Server:
host.docker.internal
- Port: gunakan port yang terkonfigurasi di ServBay untuk database tersebut (misal, MySQL default
3306
, PostgreSQL default5432
) - Username/Password: gunakan kredensial yang sudah Anda buat di ServBay
- Hostname/Server:
Contoh (koneksi ke MySQL ServBay): Andaikan MySQL ServBay berjalan di port 3306
. Maka di aplikasi pada kontainer:
- Host:
host.docker.internal
- Port:
3306
- User:
your_db_user
- Password:
your_db_password
Q4: Jika kontainer Docker mengakses situs HTTPS di ServBay menggunakan domain (dengan konfigurasi extra_hosts
), bagaimana agar kontainer dapat mempercayai CA ServBay?
Misal Anda mengikuti saran di Q2, dengan extra_hosts
atau --add-host
untuk secure.servbay.demo
mengarah ke host-gateway
. Jika secure.servbay.demo
menggunakan sertifikat SSL yang dikeluarkan oleh ServBay User CA, secara default kontainer Docker Anda tidak mengenal CA ini sehingga terjadi kegagalan SSL handshake.
Lokasi file CA ServBay di host macOS:
- Root Certificate ServBay User CA:
/Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt
- File PEM (gabungan ServBay User CA + Public CA + Mozilla root CA):
- Mac ARM:
/Applications/ServBay/package/common/openssl/3.2/cacert.pem
- Mac Intel:
/Applications/ServBay/package/common/openssl/1.1.1u/cacert.pem
- Mac ARM:
Ringkasan Solusi:
Ada beberapa cara agar kontainer Docker dapat mempercayai ServBay User CA:
- Metode 1: Trust sistem level saat build (via Dockerfile) - Disarankan jika ingin seluruh sistem dalam image mempercayai CA dan memungkinkan kustomisasi image.
- Metode 2: Trust aplikasi level saat runtime (via mounting volume dan variabel environment) - Cocok untuk kebutuhan trust pada aplikasi tertentu tanpa modifikasi image.
- Metode 3: Trust sistem level saat runtime (via mounting volume dan custom command saat start) - Cocok jika tidak ingin membangun image baru tapi ingin seluruh sistem dalam kontainer mempercayai CA.
Metode 1: Trust Sistem Level Saat Build (via Dockerfile)
CA akan diintegrasikan ke certificate store sistem saat membangun image Docker.
- Siapkan file CA: Salin
/Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt
ke direktori build Docker Anda (sejajar dengan Dockerfile). - 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 - Compose Build:yaml
# docker-compose.yml version: '3.8' services: myapp: build: context: ./app_service # Folder dengan Dockerfile & 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 Level Saat Runtime (mounting volume + env var)
CA di-mount ke kontainer dan aplikasi diatur untuk menggunakan CA tersebut via variabel environment tertentu.
- Contoh
docker-compose.yml
:yamlSilakan cek dokumentasi aplikasi yang digunakan untuk variabel environment yang relevan.version: '3.8' services: myapp: image: some-base-image volumes: - /Applications/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 untuk SSL_CERT_FILE: # - 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
Metode 3: Trust Sistem Level Saat Runtime (mount volume + custom command)
CA langsung di-mount lalu update trust store saat kontainer start. Tidak perlu build image baru, namun kebutuhan command bisa lebih rumit.
- Contoh
docker-compose.yml
(berbasis Debian/Ubuntu):yamlCatatan:version: '3.8' services: myapp: image: ubuntu:latest # atau image lain dengan dukungan update-ca-certificates volumes: - /Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt:/usr/local/share/ca-certificates/ServBay-User-CA.crt:ro command: > sh -c " echo 'Attempting to update CA certificates...' && 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 updated.' else echo 'update-ca-certificates command not found, skipping CA update.' fi && echo 'Starting application...' && exec your_original_application_command_here # ganti dengan command aplikasi Anda " extra_hosts: ["secure.servbay.demo:host-gateway"] # Jika harus root untuk update CA, pastikan hak akses user tepat # user: root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22- Kompleksitas: Mengubah
command
/entrypoint
kadang rumit, terutama pada official image dengan pipeline booting kompleks. - Hak Akses:
update-ca-certificates
perlu hak root. Jika default user Anda non-root, siapkan handling permission. - Dependensi: Harus ada paket
ca-certificates
& commandupdate-ca-certificates
. Script contoh mencoba menginstal jika belum ada (untuk image berbasis apt). - Waktu startup: Setiap kali kontainer start akan menjalankan script ini, sehingga startup sedikit lebih lama.
- Alpine Linux: Perintahnya:
apk add --no-cache ca-certificates && update-ca-certificates
.
- Kompleksitas: Mengubah
Mana yang harus dipilih?
- Jika bisa membangun image kustom dan perlu trust sistem level: Metode 1 sangat direkomendasikan.
- Jika tidak ingin rebuild image dan hanya perlu trust untuk aplikasi tertentu: Metode 2 paling praktis.
- Jika tidak ingin membangun image dan ingin trust sistem level tanpa ubah image: Metode 3 pilihan terbaik.
Untuk sertifikat dari Public CA (seperti Let's Encrypt): Jika ServBay menggunakan sertifikat dari Public CA (ACME/Let's Encrypt), hampir semua Docker base image sudah mengenal dan mempercayai root CA publik ini, sehingga tidak perlu tindakan tambahan.
Q5: Bagaimana mengatur domain dan reverse proxy ServBay untuk aplikasi di dalam kontainer Docker?
Misal Anda menjalankan aplikasi dalam kontainer Docker (misal Node.js di port 3000), dan ingin mengaksesnya dari browser host dengan domain ramah (misal myapp.servbay.demo
) sembari mendapatkan SSL yang diatur ServBay.
Langkah-langkah:
Jalankan kontainer dan mapping port ke
127.0.0.1
di host: Pastikan port aplikasi dalam kontainer di-map ke port di host pada alamat127.0.0.1
saja, untuk keamanan dan menghindari akses dari luar.bash# Contoh: Aplikasi dengar di port 3000, dipetakan ke 127.0.0.1:3001 pada host docker run -d -p 127.0.0.1:3001:3000 your-docker-app-image
1
2Dengan ini, aplikasi pada kontainer port 3000 dapat diakses dari host di
http://127.0.0.1:3001
.Tambahkan situs baru di ServBay sebagai reverse proxy:
- Buka panel manajemen ServBay.
- Klik “Tambah Situs”.
- Domain: masukkan domain yang diinginkan, misal
myapp.servbay.demo
. - Tipe situs: pilih “Reverse Proxy”.
- Alamat IP: isikan
127.0.0.1
. - Port: isikan port mapping dari langkah 1, misal
3001
. - Klik “Simpan” atau “Tambah”.
(Opsional) Konfigurasi SSL: Setelah situs ditambahkan, Anda bisa mengaktifkan SSL pada pengaturan situs. ServBay mendukung auto-sertifikat Let's Encrypt (public CA) melalui ACME, atau bisa memilih menggunakan ServBay User CA/Public CA. SSL akan dikelola ServBay, sedangkan koneksi ke kontainer cukup HTTP biasa (misal
http://127.0.0.1:3001
).Tes akses: Setelah konfigurasi, akses
http://myapp.servbay.demo
atauhttps://myapp.servbay.demo
via browser. ServBay otomatis me-routing lalu lintas ke aplikasi pada kontainer Docker Anda.
Alur akses: Browser pengguna ->
https://myapp.servbay.demo
->
ServBay (tangani SSL, aturan proxy) ->
http://127.0.0.1:3001
(port di host) ->
aplikasi pada kontainer Docker.
Ringkasan
ServBay sangat menyederhanakan pengembangan web lokal di macOS. Saat digunakan bersama Docker:
- Untuk mengakses situs ServBay dari kontainer Docker, gunakan
extra_hosts
/--add-host
dan arahkan domain kehost-gateway
untuk memastikan headerHost
tetap benar dan menghindari masalah SNI. - Untuk mengakses database/non-HTTP service yang dikelola ServBay dari kontainer, cukup gunakan
host.docker.internal
sebagai hostname. - Untuk membuat kontainer mempercayai SSL Sertifikat dari ServBay User CA, salin CA ke image atau mount ke kontainer lalu update trust store sesuai kebutuhan.
- Untuk menggunakan ServBay sebagai reverse proxy ke aplikasi dalam Docker, cukup tambahkan situs baru bertipe reverse proxy dan arahkan ke port mapping pada host di
127.0.0.1
.
Pastikan seluruh paket ServBay (web server, database, dll) dan kontainer Docker Anda sudah dikonfigurasi dan berjalan dengan benar.