ServBay ve Docker Birlikte Çalışma SSS (Sıkça Sorulan Sorular)
Yerel Web geliştirme sırasında ServBay'i kullanırken, genellikle konteynerleştirilmiş bir ortam oluşturmak için Docker kullanmak isteyebilirsiniz. Bu SSS, özellikle macOS ortamında, ServBay ve Docker birlikte çalışırken karşılaşabileceğiniz yaygın sorunların yanıtlarını sunar. Buna Docker'dan ServBay hizmetlerine erişim ve ServBay ile Docker konteynerlerindeki uygulamaların ters proxy kurulumu dahildir.
S1: ServBay neden sistemimindeki hosts
dosyasını değiştiriyor? Bunu engelleyebilir miyim?
ServBay, sisteminizin hosts
dosyasına (örn. mysite.servbay.demo 127.0.0.1
) yeni girdiler ekleyerek, geliştirme ortamında özel alan adları (örn. mysite.servbay.demo
) ile sitelerinize erişmenizi sağlar. Bu siteler gerçekte kendi makinenizdeki 127.0.0.1
adresinde çalışır.
Ancak Docker'ın çalışma prensibi nedeniyle, macOS ana makinenizden hosts dosyasını okur ve mysite.servbay.demo
adresini 127.0.0.1
olarak çözümler. Bu durumda, Docker kendi konteynerindeki (yanlış) servisi çağırır.
Temel Mekanizma:
- ServBay'de yeni bir site oluşturup özel bir alan adı tanımladığınızda (örn.
example.servbay.demo
), bu alan adı otomatik olarak127.0.0.1
'e yönlendirilir. - Bu, yerel özel alan adları ile erişimi standart ve kullanışlı hale getirir. Eğer
hosts
dosyasını değiştirmezseniz, sitenizi yalnızcahttp://127.0.0.1:PORT
şeklinde ziyaret edebilir, özel alan adı kullanamazsınız.
Engellemek mümkün mü?
Teorik olarak, ServBay'in eklediği girdileri manuel olarak kaldırabilirsiniz; ancak bu durumda, sitelerinize ServBay tarafından atanmış alan adları ile erişemezsiniz. Bu, ServBay'in hızlı ve kolay yerel geliştirme deneyimi sunma amacına terstir. ServBay'in olmazsa olmaz işlevlerinden biri, yerel sitelerin kurulumunu ve erişimini kolaylaştırmaktır. Belirli bir alan adının hosts
girdilerinin yönetilmesini istemiyorsanız, o alan adıyla ServBay'de site oluşturmamanızı öneririz.
Çoğu yerel geliştirme senaryosu için, ServBay'in hosts
dosyasını otomatik yönetmesi istenen ve geliştiricinin işini kolaylaştıran bir davranıştır.
S2: Docker konteynerimden, macOS ana makinesinde ServBay'in yönettiği sitelere (örn. mysite.servbay.demo
) doğru şekilde nasıl erişebilirim?
Sık karşılaşılan bir ihtiyaçtır ama doğru yöntemlerle çözülmezse sorun yaşatır. ServBay; macOS ana makinenizde bir siteyi (örn. mysite.servbay.demo
, ana makinede 127.0.0.1
'e çözümlüyor) çalıştırırken, Docker konteynerinizdeki 127.0.0.1
adresi ana makineyi değil, konteynerin bizzat kendisini işaret eder.
Yanlış Yöntem: ServBay sitesini ziyaret etmek için doğrudan host.docker.internal
'ı adres olarak kullanmak
Docker Desktop for Mac (ve Windows), konteyner içinden ana makinenin IP adresini çözümlemek için host.docker.internal
isminde özel bir DNS sağlar. Ancak ServBay sitelerine erişimde doğrudan URL olarak host.docker.internal
kullanılması kesinlikle önerilmez (örn. http://host.docker.internal/
ile mysite.servbay.demo
sitesine ulaşmayı beklemek).
Bunun nedeni, böyle yaptığınızda ServBay web sunucusuna (Caddy veya Nginx gibi) gönderilen HTTP isteğinin Host
başlığı, doğru alan adı yerine host.docker.internal
olur. ServBay'in web sunucusu, hangi sitenin istenildiğini anlamak için bu Host
başlığını kullanır. Yani, Host
başlığı host.docker.internal
olduğunda doğru sitede içerik gösterilemez veya HTTPS kullanıyorsanız SNI (Server Name Indication) hatası oluşur; çünkü sunulan SSL sertifikası mysite.servbay.demo
için üretilmiştir, host.docker.internal
için değil.
Doğru Çözüm: Docker konteyneri başlatırken extra_hosts
eklemek
Docker konteynerinizdeki uygulamanın, ServBay sitesinin gerçek alan adını (örn. mysite.servbay.demo
) kullanarak ve isteklerinde doğru Host
başlığını göndererek erişim sağlayabilmesi için, alan adını ana makinenin IP'sine yönlendirecek bir hosts girdisine ihtiyaç var. Bunu, extra_hosts
(docker-compose.yml'de) veya --add-host
(docker run sırasında) ile sağlayabilir, alan adını host.docker.internal
ya da tercihen host-gateway
'e yönlendirebilirsiniz.
docker run
ile:bashdocker run --add-host=mysite.servbay.demo:host-gateway ... your_image
1(
host-gateway
özel bir değer olup, Docker bunu ana makinenin iç IP adresiyle değiştirir. Docker 20.10+ sürümlerinde genelliklehost.docker.internal
'ın altyapı karşılığıdır.)docker-compose.yml
ile:yamlversion: '3.8' # veya üstü 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
Ayarladıktan sonra, Docker konteynerinizde:
- Uygulamanız
http://mysite.servbay.demo
veyahttps://mysite.servbay.demo
ile erişmeye çalıştığında konteynerin/etc/hosts
dosyası, bu alan adını macOS ana makinesinin IP adresine yönlendirecektir. - İstek ana makinede çalışan ServBay web sunucusuna ulaşır.
- HTTP
Host
başlığı doğru şekildemysite.servbay.demo
olur; böylece ServBay doğru SSL sertifikasını sunabilir ve isteği istenen siteye yönlendirebilir.
S3: Docker konteynerimden, ServBay'in yönettiği veritabanı (MySQL, PostgreSQL gibi) veya diğer HTTP dışı servislere nasıl bağlanırım?
Alan adına dayalı web servislerinden farklı olarak, veritabanı veya SNI gerektirmeyen diğer TCP servislerine bağlanırken sunucu adresi olarak host.docker.internal
kullanmak tavsiye edilen ve etkili yöntemdir.
Adımlar:
- ServBay üzerindeki veritabanı paketinin (veya diğer servisin) çalışır durumda olduğundan ve ana makineden bağlantı kabul edecek şekilde ayarlandığından emin olun (genelde varsayılan ayarlarla bu mümkündür).
- Docker konteynerinizde veritabanı (veya servis) bağlantısı ayarları şunları içermelidir:
- Sunucu Adı (Hostname/Server):
host.docker.internal
kullanın. - Port: ServBay'deki ilgili veritabanı (veya servis) portunu kullanın (örn. MySQL için varsayılan
3306
, PostgreSQL için5432
). - Kullanıcı Adı/Şifresi: ServBay'de oluşturduğunuz veritabanı (veya servis) kullanıcı adı ve şifresi.
- Sunucu Adı (Hostname/Server):
Örnek (ServBay yönetimindeki MySQL bağlantısı): Diyelim ki ServBay'deki MySQL, varsayılan port 3306
ile çalışıyor. Docker konteynerinizde bağlantı ayarlarınız şöyle olabilir:
- Sunucu:
host.docker.internal
- Port:
3306
- Kullanıcı:
your_db_user
- Şifre:
your_db_password
S4: Docker konteynerinden, (Q2'deki extra_hosts
yapılandırması ile) ServBay User CA sertifikalı HTTPS sitesine erişirken konteynerin bu sertifikaya güvenmesini nasıl sağlarım?
Q2'deki gibi, örneğin secure.servbay.demo
adresini host-gateway
'e yönlendirdiğinizi varsayalım. Eğer secure.servbay.demo
adresinde ServBay User CA tarafından imzalanmış SSL sertifikası kullanıyorsanız, Docker konteyneriniz bu CA'ya varsayılan olarak güvenmeyecek ve SSL el sıkışma hatası alacaksınız.
ServBay CA dosya yolları (macOS ana makinede):
- ServBay User CA Kök Sertifikası:
/Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt
- ServBay User CA, Public CA ve Mozilla kök sertifikaları içeren PEM dosyası:
- ARM Mac:
/Applications/ServBay/package/common/openssl/3.2/cacert.pem
- Intel Mac:
/Applications/ServBay/package/common/openssl/1.1.1u/cacert.pem
- ARM Mac:
Çözüm Özetleri:
Docker konteynerinin ServBay User CA'ya güvenmesini sağlamak için birkaç yöntem vardır:
- Yöntem 1: Derleme Sırasında Sistem Düzeyinde Güven (Dockerfile ile) - Kendi imajınızı özelleştirebiliyorsanız önerilir.
- Yöntem 2: Çalışma Zamanında Uygulama Düzeyinde Güven (volüm bağlama ve çevresel değişkenler ile) - Sadece belirli bir uygulamanın güvenmesi gerekiyorsa veya imajı değiştirmek istemiyorsanız uygundur.
- Yöntem 3: Çalışma Zamanında Sistem Düzeyinde Güven (volüm bağlama ve özel komut ile) - İmajı oluşturmadan sistemin tamamında güven sağlayan bir yöntemdir.
Yöntem 1: Derleme Sırasında Sistem Düzeyinde Güven (Dockerfile ile)
Bu yöntemde, Docker imajınızı oluştururken CA sertifikasını sistem güven listesine eklersiniz.
- CA dosyasını hazırlayın:
/Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt
dosyasını Docker dosyanızın bulunduğu ve Docker için build yaptığınız klasöre kopyalayın. - 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 derleme:yaml
# docker-compose.yml version: '3.8' services: myapp: build: context: ./app_service # Dockerfile ve ServBay-Private-CA-ECC-Root.crt burada 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 (volüm bağlama ve çevresel değişken ile)
Bu yöntemde CA sertifikasını doğrudan konteynere volüm olarak bağlayıp, uygulama ayarlarında ilgili ortam değişkenlerine işaret edersiniz.
docker-compose.yml
örneği:yamlUygulamanızın belgesinde doğru ortam değişkenini bulduğunuza emin olun.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: # 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 için örnek: # - 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
Yöntem 3: Çalışma Zamanında Sistem Düzeyinde Güven (volüm bağlama ve özel başlatma komutu)
Bu yöntemde, CA dosyasını bağlayıp konteyner başlatılırken sistemin sertifika deposunu güncelleyen bir komut çalıştırırsınız. Bu sayede kendi imajınızı oluşturmanıza gerek kalmaz ancak başlatma komutunuz karmaşıklaşabilir.
- Debian/Ubuntu tabanlı bir imaj için
docker-compose.yml
örneği:yamlDikkat Edilmesi Gerekenler:version: '3.8' services: myapp: image: ubuntu:latest # ya da update-ca-certificates komutu çalışabilen başka bir imaj volumes: # Ana makinedeki CA sertifikasını doğrudan sisteme bağla - /Applications/ServBay/ssl/private/ServBay-Private-CA-ECC-Root.crt:/usr/local/share/ca-certificates/ServBay-User-CA.crt:ro # Komutu override ederek sertifika güncelle ve uygulamayı başlat # Komutların root olarak çalıştığından emin olun veya gerekli izinleri sağlayın 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 sertifikaları güncellendi.' else echo 'update-ca-certificates komutu bulunamadı, CA güncellenmedi.' fi && echo 'Uygulama başlatılıyor...' && exec your_original_application_command_here # Burayı gerçek uygulama başlatma komutunuzla değiştirin " extra_hosts: ["secure.servbay.demo:host-gateway"] # Gerekirse root ile çalıştırın veya yetkiyi bir entrypoint script ile yönetin # user: root # Geçici olarak root ile çalışmak veya başka bir script aracılığıyla izinleri ayarlamak için
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- Karmaşıklık:
command
veyaentrypoint
değiştirmek, özellikle kompleks resmi imajlarda karmaşık olabilir. - Yetki:
update-ca-certificates
komutu genellikle root yetkisi ister. Konteynerinizi root kullanıcı ile başlatmanız gerekebilir. - Paket Gereklilikleri: Konteynerde
ca-certificates
paketi ve ilgili komutlar kurulu olmalı. Script örneği bunları yüklüyor. - Başlangıç Süresi: Konteyner her başlangıçta sertifika kontrol/güncellemesi yapacağından boot süresi artabilir.
- Alpine Linux: Alpine için komutlar
apk add --no-cache ca-certificates && update-ca-certificates
şeklinde olmalıdır.
- Karmaşıklık:
Hangi yöntemi seçmeli?
- Kendi imajınızı oluşturabiliyor ve CA'nın sistem genelinde güvenilmesini istiyorsanız Yöntem 1 en iyi tercihtir.
- İmajınızı değiştirmek istemiyorsanız ve sadece belirli uygulamanızda güvenilir olması gerekiyorsa Yöntem 2 pratiktir.
- İmaj oluşturmadan, sistem genelinde güvenmek istiyorsanız Yöntem 3 uygundur.
Kamuya açık CA'ların (örn. Let's Encrypt) sertifikalarında: Eğer ServBay siteniz Let's Encrypt gibi ACME ile alınmış resmi bir sertifika ile çalışıyorsa, çoğu Docker temel imajı bu CA'lara zaten güvendiği için ek işlem gerekmez.
S5: Docker konteynerinde çalışan bir uygulama için ServBay ile nasıl özel alan adı ve ters proxy yapılandırabilirim?
Bir Docker konteynerinde çalışan (örn. 3000 portunda çalışan bir Node.js servisi) uygulamayı, hem tarayıcıdan erişimi kolaylaştırmak hem de SSL sertifika yönetimini ServBay'e bırakmak için ServBay üzerinden özel bir alan adına (örn. myapp.servbay.demo
) yönlendirmek isteyebilirsiniz.
Adımlar:
Docker konteynerinizi, uygulamanın portunu ana makinedeki
127.0.0.1
'de bir porta yönlendirerek başlatın: Docker konteynerinizdeki portu, macOS ana makinenizdeki bir porta127.0.0.1
IP'sine bağlı olarak yönlendirin. Böylece bu port sadece ana makineden erişilebilir ve dış ağ tarafından ulaşılamaz.bash# Örneğin: Konteynerde 3000 portu çalışan uygulama, ana makinede 127.0.0.1:3001 ile ilişkilendiriliyor docker run -d -p 127.0.0.1:3001:3000 your-docker-app-image
1
2Bu örnekte, konteynerdeki uygulama 3000 portunu dinliyor ve ana makineden
http://127.0.0.1:3001
ile ulaşılabilir.ServBay'de yeni bir site ekleyip ters proxy olarak ayarlayın:
- ServBay arayüzünü açın.
- "Site Ekle" seçeneğine tıklayın.
- Alan adı: Kullanmak istediğiniz özel alan adını girin, örn.
myapp.servbay.demo
. - Site türü: Menüden "Ters Proxy" seçin.
- IP Adresi: Açılan kutuya
127.0.0.1
yazın. - Port: Docker konteynerinizin ana makineye yönlendirdiği portu girin, örn.
3001
. - "Kaydet" veya "Ekle" seçenekleri ile işlemi tamamlayın.
(Opsiyonel) SSL Ayarlarını Yapın: Siteyi ekledikten sonra, SSL'i de kolayca etkinleştirip Let's Encrypt gibi kamuya açık CA'lardan veya ServBay'in User CA/Public CA seçeneklerinden otomatik sertifika alabilirsiniz. ServBay SSL sonlandırmasını yapar; ServBay ile Docker arası bağlantı ise HTTP olur (
http://127.0.0.1:3001
).Erişimi Test Edin: ServBay ayarlarını kaydettikten sonra,
http://myapp.servbay.demo
veya (SSL etkin ise)https://myapp.servbay.demo
ile uygulamanıza ana makinede erişebilirsiniz. ServBay, talepleri Docker konteynerindeki uygulamaya iletecektir.
Çalışma Akışı: Kullanıcı tarayıcısı ->
https://myapp.servbay.demo
->
ServBay (SSL işlemi, ters proxy kuralı) ->
http://127.0.0.1:3001
(ana makinedeki port) ->
Docker konteynerindeki uygulama.
Özet
ServBay, macOS üzerinde yerel Web geliştirme süreçlerini oldukça kolaylaştırır. Docker ile birlikte kullanırken:
- Docker konteynerinden ServBay sitelerine erişim için, site alan adınızı
extra_hosts
veya--add-host
ilehost-gateway
'e yönlendirin. Böylece doğruHost
başlığı ile erişim sağlanıp SNI hatası yaşanmaz. - Docker'dan ServBay veritabanı ya da diğer HTTP dışı servislere erişim için, sunucu adresi olarak
host.docker.internal
kullanın. - Docker konteynerinin ServBay User CA tarafından imzalanan SSL sertifikalarına güvenmesini istiyorsanız; CA sertifikasını Docker imajınıza kopyalayın ve güven zincirini güncelleyin.
- ServBay'i Docker konteynerlerindeki uygulamalar için ters proxy olarak kullanmak için ServBay'de "Ters Proxy" site türünü seçin ve ana makinenin
127.0.0.1
portuna yönlendirme yapın.
Her zaman, ServBay üzerindeki ilgili servislerin ve Docker konteynerlerinizin doğru şekilde yapılandırılıp çalıştığından emin olun.