ServBay ve Docker ile Birlikte Çalışırken Sıkça Sorulan Sorular (SSS)
Yerel web geliştirme için ServBay kullanırken çoğu zaman Docker ile konteyner tabanlı bir ortamı da entegre etmek istersiniz. Bu SSS dokümanı, ServBay ve Docker’ın birlikte çalışması sürecinde macOS ile Windows ortamlarında karşılaşabileceğiniz yaygın soruları açıklar: Docker’dan ServBay servislerine erişim ve ServBay ile Docker içindeki uygulamaları ters proxy ile yayınlamak dahil.
S1: ServBay neden sistemimdeki hosts
dosyasını değiştiriyor? Bunu engelleyebilir miyim?
ServBay, yerel geliştirme sitelerine özel alan adlarıyla ulaşabilmeniz için sisteminizin hosts
dosyasına örneğin mysite.servbay.demo 127.0.0.1
gibi kayıtlar ekler. Böylece mysite.servbay.demo
gibi özel domainlerle sitenize erişirsiniz. Aslında bu siteler bilgisayarınızda 127.0.0.1
üzerinden çalışır.
Ancak Docker’ın mekanizması gereği, ana sistemin (macOS veya Windows) hosts dosyası konteyner içerisine aktarılır ve böylece Docker’daki mysite.servbay.demo
adresi yanlışlıkla konteynerin kendi “127.0.0.1” adresine yönlendirilir ve doğru servise ulaşamazsınız.
Özünde:
- ServBay’de yeni bir site oluşturup bir alan adı tanımladığınızda (örneğin
example.servbay.demo
), ServBay bunu sisteminizde127.0.0.1
adresine yönlendirir. - Bu, yerel geliştirmede özel domain ile erişim için standart bir uygulamadır. Eğer hosts dosyanız güncellenmezse, siteye sadece
http://127.0.0.1:PORT
ile erişebilir, özel domain kullanamazsınız.
Engellemek mümkün mü?
Teorik olarak ServBay’in eklediği satırları manuel kaldırabilirsiniz fakat bu durumda ServBay’in domain ile kolay site erişim avantajından faydalanamazsınız. ServBay’in temel amacı yerelde kolay ve hızlı site erişimi sağlamaktır. Belirli bir alan adına kaydedilen hosts kaydının ServBay tarafından yönetilmesini istemiyorsanız, o domain için ServBay’de site oluşturmamanız tavsiye edilir.
Çoğu yerel geliştirme senaryosu için ServBay’in hosts dosyasını otomatik olarak yönetmesi, geliştirme sürecini kolaylaştıran bir davranıştır.
S2: Docker konteynerimden, ana makinede ServBay ile yönetilen web sitesine (ör: mysite.servbay.demo
) isimle nasıl doğru erişirim?
Bu, oldukça yaygın bir gereksinimdir ve doğru yapılandırılmazsa sorun yaşanır. ServBay, ana makinede (macOS veya Windows) bir web sitesi çalıştırır (ör: mysite.servbay.demo
- bu ana makinede 127.0.0.1
olarak çözümlenir). Fakat Docker konteynerinde 127.0.0.1
, sadece konteynerin kendisini ifade eder, ana makineyi değil.
Yanlış yöntem: ServBay sitesine ulaşmak için URL’de direkt olarak host.docker.internal
kullanmak
Docker Desktop (Mac ve Windows) konteynerden ana makinenin IP’sine özel host.docker.internal
adı verir. Fakat siteye erişmek için URL’de bu ismi doğrudan kullanmak kesinlikle önerilmez (ör: http://host.docker.internal/
ile mysite.servbay.demo
ya erişmeye çalışmak).
Çünkü böyle yaptığınızda, ServBay’in web sunucusu (Caddy veya Nginx) tarafından alınan HTTP isteğinde Host
başlığı host.docker.internal
olur. ServBay bu “Host” başlığından hangi siteye istek geldiğini anlar. Doğru domain (mysite.servbay.demo
) yerine host.docker.internal
gönderirseniz, siteyi doğru yönlendirmez ya da HTTPS'de SNI hatası oluşur; çünkü SSL sertifikası domain’e ('mysite.servbay.demo') özel hazırlanmıştır, host.docker.internal için değildir.
Doğru çözüm: Docker konteyner başlatılırken extra_hosts
ekleyin
Docker konteynerinizin içindeki uygulamanın ServBay sitesi gerçek domainiyle (mysite.servbay.demo
) erişebilmesi için, domaini konteynerin hosts dosyasına ekleyip ana makinenin IP’sine yönlendirmelisiniz. Bunun için extra_hosts
(docker-compose.yml
ile) veya --add-host
(docker run komutuyla) kullanılır. IP olarak host.docker.internal
yerine mümkünse host-gateway
önerilir.
docker run ile:
bashdocker run --add-host=mysite.servbay.demo:host-gateway ... your_image
1(
host-gateway
, Docker’ın ana makinenin IP’sini otomatik bulup bağlayacağı özel bir tanımdır. Genellikle Docker 20.10+ sürümler için daha doğrudan, düşük seviyeli bir alternatiftir.)docker-compose.yml ile:
yamlversion: '3.8' # veya daha güncel bir sürüm services: myapp: image: your_image extra_hosts: - "mysite.servbay.demo:host-gateway" # veya "mysite.servbay.demo:host.docker.internal" # ... diğer ayarlar
1
2
3
4
5
6
7
Bu yapılandırmayla, Docker konteynerinizde:
- Uygulamanız
http://mysite.servbay.demo
veyahttps://mysite.servbay.demo
çağrısı yaptığında, konteynerin hosts dosyası domaini doğru şekilde ana makinedeki IP’ye çözümler. - İstek ServBay web sunucusuna (ana makinede çalışan) gider.
- HTTP
Host
başlığı doğru şekilde (mysite.servbay.demo
) gönderildiği için, ServBay isteği doğru siteye yönlendirir ve SSL sertifikası (HTTPS kullanılıyorsa) düzgün çalışır.
S3: Docker konteynerimden ServBay tarafından yönetilen veri tabanına (MySQL, PostgreSQL) veya HTTP dışı servislere nasıl bağlanırım?
Domain tabanlı web servislerinin aksine, veri tabanları veya SNI gerektirmeyen TCP servisleri için ana makineye host.docker.internal
ismini kullanarak bağlanmak doğru ve pratik bir yoldur.
Adımlar:
ServBay’de ilgili veri tabanı paketinin (veya servisin) çalıştığından emin olun ve bağlantılara izin verildiğinden emin olun (genellikle varsayılan ayarlar yerel geliştirme için uygundur).
Docker konteynerinizde, veri tabanı bağlantısı kurarken:
- Host (sunucu adı):
host.docker.internal
kullanın. - Port: ServBay’de ilgili veri tabanı için tanımlı portu kullanın (ör: MySQL için
3306
, PostgreSQL için5432
). - Kullanıcı adı / şifre: ServBay veri tabanı (veya servis) ayarlarında belirlediğiniz bilgiler.
Örnek: ServBay’deki MySQL’e bağlantı: Diyelim ki MySQL ServBay’de varsayılan port olan
3306
ile çalışıyor. Docker konteynerinizde uygulamanızda şu yapılandırmaları girmeniz gerekir:- Host:
host.docker.internal
- Port:
3306
- Kullanıcı:
your_db_user
- Şifre:
your_db_password
- Host (sunucu adı):
S4: Docker konteynerimden domain ile (extra_hosts kullanarak) ServBay’deki HTTPS sitesine (ServBay User CA sertifikasıyla) güvenli bağlantı için CA nasıl tanıtılır?
Q2’de anlatıldığı gibi, extra_hosts
veya --add-host
ile secure.servbay.demo
yu host-gateway’e yönlendirdiğinizi varsayalım. Eğer bu domain, ServBay User CA tarafından imzalanmış bir SSL sertifikası kullanıyorsa, Docker konteyneri genellikle bu CA’ya güvenmez ve SSL hatası verir.
ServBay CA Dosya Yolları:
- ServBay User CA temel sertifikası:
- macOS:
/Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt
- Windows:
C:\ServBay\ssl\private\ServBay-Private-CA-ECC-Root.crt
- macOS:
- ServBay User CA, Public CA ve Mozilla Root sertifikalarını içeren PEM dosyası:
- 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):
Çözüm Yaklaşımları:
Docker konteynerinin ServBay User CA’ya güvenmesi için birkaç yöntem vardır:
- Yöntem 1: Dockerfile ile sistem genelinde güven sağlar – CA’ya yaygın güven gerektiren, özelleştirilebilir imajlarda en iyi yoldur.
- Yöntem 2: Çalışma zamanında uygulama düzeyinde güven (volume ve çevresel değişkenle) – Sadece belirli uygulamada CA’ya güvenmek ya da imajı değiştirmeden ilerlemek istiyorsanız idealdir.
- Yöntem 3: Çalışma zamanında sistem genelinde güven (custom komutla, volume ile) – Sistem genelinde güven lazım ama özel imaj kurmak istemiyorsanız en uygunudur.
Yöntem 1: Dockerfile ile sistem genelinde güven
Docker imajını oluştururken CA sertifikasını sistemin güven listesine ekleyebilirsiniz.
- CA dosyasını hazırla: ServBay User CA kök sertifikasını Dockerfile ile aynı dizine kopyalayın:
- macOS:
/Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt
- Windows:
C:\ServBay\ssl\private\ServBay-Private-CA-ECC-Root.crt
- macOS:
- Dockerfile örneği (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 - Dockerfile örneği (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 ile build:yaml
# docker-compose.yml version: '3.8' services: myapp: build: context: ./app_service # Dockerfile ve CA dosyası bu dizinde olmalı dockerfile: Dockerfile extra_hosts: ["secure.servbay.demo:host-gateway"]
1
2
3
4
5
6
7
8
Yöntem 2: Çalışma zamanında uygulama düzeyinde güven (volume ve çevresel değişkenle)
CA dosyasını konteynere volume ile bağlayıp uygulamaya özel çevresel değişkenlerle gösterirsiniz.
- docker-compose.yml örneği:yamlUygulamanızın dokümantasyonunu inceleyerek doğru çevre değişkenini belirleyin.
version: '3.8' services: myapp: image: some-base-image volumes: # macOS yol örneği - /Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt:/etc/ssl/certs/MyCustomCA.crt:ro # Windows örneği (gerekirse sisteminize uygun olarak ayarlayın) # - C:\ServBay\ssl\private\ServBay-Private-CA-ECC-Root.crt:/etc/ssl/certs/MyCustomCA.crt:ro environment: # Node.js için örnek: - NODE_EXTRA_CA_CERTS=/etc/ssl/certs/MyCustomCA.crt # Python (requests) için örnek: # - REQUESTS_CA_BUNDLE=/etc/ssl/certs/MyCustomCA.crt # Genel SSL_CERT_FILE örneği: # - 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
Yöntem 3: Çalışma zamanında sistem genelinde güven (volume + komut ile)
CA dosyasını volume ile bağlayıp, konteyner başlatılınca sistemin güvenli CA listesini güncelleyen bir script komut ile başlatılır.
- docker-compose.yml örneği (Debian/Ubuntu tabanlı imajlar):yamlDikkat Edin:
version: '3.8' services: myapp: image: ubuntu:latest # veya update-ca-certificates destekleyen başka bir imaj volumes: # CA düzeneğini sistemin beklediği dizine bağlayın # macOS yol örneği - /Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt:/usr/local/share/ca-certificates/ServBay-User-CA.crt:ro # Windows örneği (gerektiği gibi değiştirin) # - C:\ServBay\ssl\private\ServBay-Private-CA-ECC-Root.crt:/usr/local/share/ca-certificates/ServBay-User-CA.crt:ro # Komutu override ederek konteyner başlatılırken CA güncelleme ve sonrasında uygulama çalıştırılır command: > sh -c " echo 'CA sertifikaları güncelleniyor...' && 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 güncellendi.' else echo 'update-ca-certificates bulunamadı, güncelleme atlandı.' fi && echo 'Uygulama başlatılıyor...' && exec your_original_application_command_here # Burayı asıl uygulama komutunuzla değiştirin " extra_hosts: ["secure.servbay.demo:host-gateway"] # Eğer root yetkisi gerekiyorsa veya giriş scripti karmaşıksa ayarlamalar gerekir # user: root # Gerekirse root ile başlatın veya entrypoint ile ayarlayın
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- Karmaşıklık: Çoklu init dosyaları veya özel entrypoint gerektiren imajlar için komut değiştirmek karmaşık olabilir.
- İzinler: update-ca-certificates genellikle root yetkisi ister. Konteyneriniz root dışında çalışıyorsa ek düzenleme gerekebilir.
- Bağımlılıklar: İmajda ca-certificates paketi ve update-ca-certificates komutu olmalı. Örnek script yoksa yükler.
- Başlatma süresi: Her başlatmada CA güncellemek konteyner açılışını yavaşlatır.
- Alpine kullanıyorsanız: Komut
apk add --no-cache ca-certificates && update-ca-certificates
olmalı.
Hangi yöntemi seçmeli?
- Özelleştirilebilir imaj ve sistem çapında güven lazımsa Yöntem 1 en iyi seçimdir.
- İmaj değiştirmek istemiyorsanız ve sadece belli uygulama CA’ya güvenmeli ise Yöntem 2 pratik olur.
- İmaj değiştirmeye gerek yok, sistemde genel bir güven lazım ise Yöntem 3 en uygundur.
Eğer Sertifika Let's Encrypt gibi Genel CA’dan ise: ServBay, ACME protokolü ile Let's Encrypt gibi kamu CA’lardan sertifika aldıysa, Docker imajları zaten bu CA'ya güvenilir. Ek işleme gerek yoktur.
S5: Docker içinde çalışan bir uygulama için ServBay ile domain ve ters proxy nasıl ayarlanır?
Docker konteynerinizde bir uygulama (ör: Node.js sunucusu 3000 portunda) çalıştırıyor olabilir ve ona ServBay üzerinden özel bir alan adı (myapp.servbay.demo
) atayıp ana makinede tarayıcıdan erişmek ve SSL yönetimini ServBay’e bırakmak isteyebilirsiniz.
Adımlar:
Docker konteynerinizi başlatırken portu ana makinenin
127.0.0.1
adresine yönlendirin: Uygulamanızın portunu ana makinedeki bir porta ve yalnızca localhost’a (127.0.0.1) bağlanacak şekilde haritalayın ki dış ağdan doğrudan erişim olmasın.bash# Örnek: Konteynerdeki uygulama 3000 portunda, ana makinede 127.0.0.1:3001'e yönlenir docker run -d -p 127.0.0.1:3001:3000 your-docker-app-image
1
2Artık ana makinenin tarayıcısından
http://127.0.0.1:3001
ile uygulamaya erişebilirsiniz.ServBay’de yeni bir site ekleyip ters proxy olarak yapılandırın:
- ServBay yönetim panelini açın.
- "Site Ekle"ye tıklayın.
- Domain: Kullanmak istediğiniz alan adını girin (ör:
myapp.servbay.demo
). - Site Tipi: Açılır listeden "Ters Proxy" seçin.
- IP Adresi: Sağdaki alana
127.0.0.1
yazın. - Port: Docker konteynerinin ana makinede haritaladığı portu girin, örneğin
3001
. - "Kaydet" veya "Ekle"ye tıklayın.
(Opsiyonel) SSL yapılandırın: Site eklendikten sonra, ayarlarından SSL’i aktif edebilirsiniz. ServBay, ACME protokolü ile Let's Encrypt gibi genel CA’lardan otomatik sertifika almayı; ayrıca ServBay User CA veya ServBay Public CA ile de işlemeyi destekler. ServBay SSL sonlandırmasını halleder; ServBay ile konteyner arasındaki bağlantı HTTP (ör:
http://127.0.0.1:3001
) olabilir.Test edin: ServBay’deki yapılandırma kaydedildikten sonra, tarayıcıdan
http://myapp.servbay.demo
veya SSL etkinsehttps://myapp.servbay.demo
ile uygulamaya erişebilirsiniz. ServBay isteği Docker konteynerindeki uygulamaya proxy üzerinden aktarır.
Çalışma Akışı: Kullanıcı tarayıcı → https://myapp.servbay.demo
→ ServBay (SSL ve proxy yönetimi) → http://127.0.0.1:3001
→ Docker konteynerdeki uygulama
Özet
ServBay, macOS ve Windows’ta yerel web geliştirme sürecini büyük ölçüde kolaylaştırır. Docker ile entegrasyon sırasında:
- Docker konteynerinden ServBay’deki web sitelerine erişim için, domaini host-gateway’e yönlendiren
extra_hosts
veya--add-host
kullanın. Böylece Host başlığı doğru iletilir ve SNI hatası yaşanmaz. - Docker konteynerinden ServBay yönetimli veri tabanına veya HTTP dışı servise erişmek için, server adı olarak
host.docker.internal
kullanmak en kolay ve güvenilir yoldur. - Docker konteynerinin ServBay User CA’dan alınan SSL sertifikasına güvenmesi için, CA dosyasını imajınıza ekleyip güvenli CA deposunu güncelleyin.
- Docker içindeki uygulamanızı ServBay ile ters proxy üzerinden yayınlamak için, ServBay’de “Ters Proxy” site tipi seçip uygulamanın ana makinedeki localhost portunu hedef gösterin.
Her zaman ServBay’de ilgili paketlerin (web sunucu, veritabanı vs.) ve Docker konteynerinizin düzgün yapılandırılıp çalıştığından emin olun.