Takip et

WSL2 ve Docker: Docker Desktop Olmadan Manuel Konfigürasyon Rehberi

Docker Desktop’ın sunduğu kolaylıklar tartışılmaz olsa da, bazen lisanslama kısıtlamaları, kaynak tüketimi veya daha fazla kontrol isteği gibi nedenlerle alternatif çözümlere yönelmek gerekebilir. Bu makale, Windows Subsystem for Linux (WSL2) kullanarak Docker Desktop’a bağımlı kalmadan, tamamen manuel yöntemlerle Docker’ı kurmayı, NAT ağını yapılandırmayı ve uygulamalarınıza yerel makinenizden sorunsuz bir şekilde erişmeyi adım adım açıklamaktadır.

Günümüz yazılım geliştirme dünyasında konteynerizasyon, uygulamaların dağıtımı ve yönetimi için vazgeçilmez bir yaklaşım haline gelmiştir. Docker, bu alandaki en popüler araçlardan biri olup, geliştiricilere izole edilmiş, taşınabilir ve tutarlı ortamlar sunar. Windows üzerinde Docker kullanmak istediğinizde, genellikle ilk akla gelen çözüm Docker Desktop’tır. Ancak Docker Desktop, özellikle ticari kullanımda getirdiği lisanslama kısıtlamaları ve sistem kaynakları üzerindeki kayda değer yükü nedeniyle bazı kullanıcılar için ideal bir seçenek olmaktan çıkabilmektedir. İşte tam bu noktada, Windows Subsystem for Linux (WSL2) ve manuel Docker Engine kurulumu devreye giriyor.

Bu yöntemi tercih etmenin birden fazla önemli nedeni bulunmaktadır. Birincisi, maliyet. Docker Desktop’ın ücretli lisans modeline geçmesi, özellikle küçük işletmeler ve bağımsız geliştiriciler için önemli bir gider kalemi oluşturabilir. Manuel kurulum ile bu maliyetten kaçınmak mümkündür. İkincisi, performans ve kaynak tüketimi. Docker Desktop, arka planda çalışan sanal makine (VM) ve çeşitli entegrasyon servisleri nedeniyle sistem belleğini ve işlemci kaynaklarını yoğun bir şekilde kullanabilir. WSL2 üzerinde direkt Docker Engine çalıştırmak, genellikle daha hafif ve hızlı bir deneyim sunar. WSL2’nin Hyper-V tabanlı sanallaştırma teknolojisi sayesinde, Linux çekirdeği doğrudan Windows ile entegre bir şekilde çalışır ve Docker konteynerleri için neredeyse yerel Linux performansı sağlar. Üçüncüsü, kontrol. Manuel kurulum, kullanıcılara Docker ortamları üzerinde daha fazla esneklik ve kontrol imkanı tanır. Ağ yapılandırmasından güvenlik ayarlarına kadar her detayı kendi ihtiyaçlarınıza göre optimize edebilirsiniz. Bu kontrol, özellikle karmaşık ağ yapılarına sahip veya özel güvenlik gereksinimleri olan projelerde kritik öneme sahiptir.

Bu makale boyunca, Docker Desktop’ın sunduğu “tek tıkla” kolaylıklardan feragat ederek, daha derinlemesine bir anlayış ve daha fazla kontrolle kendi WSL2-Docker ortamınızı nasıl kuracağınızı adım adım keşfedeceğiz. NAT (Network Address Translation) ve localhost erişiminin el ile nasıl yapılandırılacağı gibi konulara özellikle odaklanacağız. Amacımız, sadece teknik adımları sunmakla kalmayıp, aynı zamanda bu adımların arkasındaki mantığı da anlaşılır bir dille açıklamaktır. Böylece, hem başlangıç seviyesindeki kullanıcılar için temel bir rehber sunacak, hem de deneyimli geliştiricilerin mevcut bilgilerini pekiştirmelerine yardımcı olacağız. Bu yolculuğun sonunda, tamamen özelleştirilmiş, hafif ve güçlü bir Docker geliştirme ortamına sahip olacaksınız.

Temel Kavramlar: WSL2, Docker ve Ağ Yapıları Nelerdir?

Manuel Docker kurulumuna geçmeden önce, üzerinde çalışacağımız temel teknolojileri ve ağ kavramlarını anlamak önemlidir. Bu bölüm, konuya yabancı olan okuyucular için bir temel oluşturacak ve ilerleyen adımları daha anlamlı kılacaktır.

WSL2 (Windows Subsystem for Linux 2): WSL2, Windows işletim sistemi üzerinde tam teşekküllü bir Linux çekirdeği çalıştırmanıza olanak tanıyan devrim niteliğinde bir özelliktir. İlk sürümü olan WSL1, Linux sistem çağrılarını Windows sistem çağrılarına çeviren bir katman kullanırken, WSL2 gerçek bir Hyper-V tabanlı sanal makine (VM) içinde gerçek bir Linux çekirdeği çalıştırır. Bu, WSL2’ye önemli performans avantajları, tam sistem çağrısı uyumluluğu ve özellikle disk G/Ç (I/O) ve ağ performansı açısından büyük iyileştirmeler getirmiştir. Docker gibi uygulamalar, bu gerçek Linux çekirdeğine doğrudan erişebildikleri için WSL2 üzerinde çok daha verimli çalışır. Geliştiriciler için, Linux tabanlı araçları ve komut satırı ortamlarını Windows makinelerinde yerel performansla kullanma imkanı sunar.

Docker: Konteynerizasyonun Temeli: Docker, uygulamaları ve bağımlılıklarını “konteyner” adı verilen hafif, taşınabilir ve izole edilmiş birimler halinde paketlemek için kullanılan açık kaynaklı bir platformdur. Geleneksel sanal makinelerin aksine, konteynerler işletim sistemini paylaşır ve bu da onları çok daha hızlı başlatılabilir ve kaynak açısından daha verimli hale getirir. Her konteyner, kendi bağımlılıklarına, kütüphanelerine ve yapılandırmalarına sahip olsa da, ana işletim sisteminin çekirdeğini kullanır. Bu izolasyon, “benim makinemde çalışıyordu” sendromunu ortadan kaldırır ve geliştirme, test ve üretim ortamları arasında tutarlılık sağlar. Docker Engine, bu konteynerleri oluşturmaktan, çalıştırmaktan ve yönetmekten sorumlu ana bileşendir.

NAT (Network Address Translation): Ağ Adresi Çevirisi: NAT, özel bir IP adres alanında yer alan birden fazla cihazın tek bir genel IP adresi kullanarak internete erişmesini sağlayan bir ağ mekanizmasıdır. Basitçe ifade etmek gerekirse, yerel ağınızdaki cihazlar (örneğin WSL2 sanal makinesi) dış dünya ile iletişime geçerken, ağ geçidi (genellikle modem veya router) onların özel IP adreslerini kendi genel IP adresine çevirir. Gelen paketler için de tersine çevirme işlemi yaparak doğru cihaza yönlendirir. WSL2 özelinde, her WSL2 dağıtımı dinamik bir IP adresi alır ve bu IP adresi, Windows’un iç ağında bulunur. Dışarıdan (Windows ana makinesi üzerinden) bu WSL2 IP adresine doğrudan erişmek veya belirli portları açmak istediğimizde NAT yapılandırması kritik hale gelir. Bu sayede, WSL2 içindeki bir Docker konteynerinin açtığı bir porta, Windows üzerinden ‘localhost’ adresiyle erişim sağlayabiliriz.

Localhost Erişimi: İç Ağı Dışarıya Açmak: “Localhost” terimi, genellikle yerel makinenin kendisini ifade eden standart bir ana bilgisayar adıdır (IP adresi olarak 127.0.0.1’e karşılık gelir). Geliştirme sürecinde, uygulamalarınızı kendi makinenizde çalıştırırken, tarayıcınızı “localhost:8080” gibi bir adrese yönlendirerek bu uygulamalara erişirsiniz. WSL2 ve Docker senaryomuzda, Docker konteynerleri WSL2 sanal makinesinin içinde çalışır ve bu sanal makinenin kendi özel IP adresi vardır. Windows ana makinenizden “localhost” üzerinden bu konteynerlere erişmek için, Windows üzerinde bir “port yönlendirme” kuralı oluşturmamız gerekir. Bu kural, belirli bir “localhost” portuna gelen trafiği, WSL2 VM’sinin belirli bir portuna yönlendirir. Bu, Docker Desktop’ın otomatik olarak yaptığı bir işlemdir ve biz bunu manuel olarak yapılandırarak WSL2-Docker ortamımızın dış dünyadan (veya en azından Windows ana makinemizden) erişilebilir olmasını sağlayacağız. Bu temel kavramları anlamak, sonraki adımlarda yapacağımız her konfigürasyonun neden gerekli olduğunu kavramanıza yardımcı olacaktır.

Docker Desktop Olmadan WSL2 Üzerine Docker Kurulumu Nasıl Yapılır?

Bu bölümde, Docker Desktop’a ihtiyaç duymadan, sıfırdan bir WSL2 ortamı üzerine Docker Engine’i nasıl kuracağımızı adım adım inceleyeceğiz. Bu süreç, Windows makinenizde bir Linux dağıtımı kurmaktan, Docker servislerini yapılandırmaya kadar temel adımları içerir.

1. WSL2 Kurulumu ve Linux Dağıtımı Seçimi

Öncelikle, WSL2’nin Windows sisteminizde etkinleştirildiğinden emin olmanız gerekir. Windows 10 sürüm 2004 ve üzeri veya Windows 11 için bu adımlar oldukça basittir.

  1. Windows Özelliklerini Etkinleştirin: PowerShell’i yönetici olarak açın ve aşağıdaki komutları çalıştırın:
    
    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
            


    Bu komutlar "Linux için Windows Alt Sistemi" ve "Sanal Makine Platformu" özelliklerini etkinleştirir. Ardından bilgisayarınızı yeniden başlatmanız gerekebilir.

  2. WSL2'yi Varsayılan Yapın: Yeniden başlattıktan sonra tekrar PowerShell'i açın ve WSL2'nin varsayılan sürüm olduğundan emin olun:
    
    wsl --set-default-version 2
            

  3. Linux Dağıtımı Kurun: Microsoft Store'u açın ve tercih ettiğiniz bir Linux dağıtımını (Ubuntu, Debian vb.) aratıp kurun. Kurulum tamamlandıktan sonra uygulamayı ilk kez çalıştırdığınızda bir kullanıcı adı ve şifre belirlemeniz istenecektir. Ubuntu, genellikle en popüler ve iyi desteklenen seçenektir.

Bu adımların ardından, Windows makinenizde çalışan bir WSL2 ortamına sahip olacaksınız. Artık bu ortamın içine Docker Engine'i kurmaya hazırız.

2. WSL2 Linux Dağıtımına Docker Engine Kurulumu

WSL2 üzerinden Linux dağıtımınıza giriş yapın (Başlat menüsünden dağıtımınızın adını aratarak veya PowerShell'den wsl -d komutuyla). Aşağıdaki adımlar Ubuntu için geçerlidir, ancak diğer Debian tabanlı dağıtımlar için de benzerdir.

  1. Mevcut Paketleri Güncelleyin:
    
    sudo apt update
    sudo apt upgrade -y
            

  2. Docker'ın Gerekli Bağımlılıklarını Kurun:
    
    sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release -y
            

  3. Docker'ın GPG Anahtarını Ekleyin: Bu adım, indirdiğimiz Docker paketlerinin güvenilirliğini doğrulamak içindir.
    
    sudo mkdir -p /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
            

  4. Docker Reposunu Ekleyin:
    
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
            

  5. Docker Engine'i Kurun: Repoyu ekledikten sonra, paket listesini güncelleyin ve Docker Engine'i kurun.
    
    sudo apt update
    sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
            

  6. Docker Servisini Başlatın ve Kullanıcıyı Docker Grubuna Ekleyin:

    Docker servisini elle başlatmak ve her seferinde sudo kullanmamak için kullanıcınızı docker grubuna ekleyin:

    
    sudo service docker start
    sudo usermod -aG docker $USER
            

    Bu adımdan sonra WSL penceresini kapatıp tekrar açmanız gerekecektir. Yeniden giriş yaptığınızda, Docker komutlarını sudo olmadan çalıştırabileceksiniz.

  7. Docker Kurulumunu Test Edin:
    
    docker run hello-world
            

    Eğer "Hello from Docker!" mesajını görüyorsanız, Docker Engine başarılı bir şekilde kurulmuş demektir.

Bu adımları tamamladıktan sonra, WSL2 ortamınızda çalışan bağımsız bir Docker Engine'iniz olacaktır. Ancak şu an için bu Docker konteynerlerine Windows ana makinenizden "localhost" üzerinden erişemezsiniz. Bu erişimi sağlamak için bir sonraki bölümde NAT ve port yönlendirme yapılandırmalarına geçeceğiz. Bu kurulum, Docker Desktop'ın sağladığı entegrasyonu manuel olarak taklit etme yolculuğumuzun ilk önemli adımıdır ve sistem kaynaklarınız üzerinde size daha fazla kontrol sağlar.

Uzman İpucu: WSL2 performansını artırmak için, özellikle disk I/O yoğunluğu olan durumlarda, .wslconfig dosyasını kullanarak WSL2 VM'nizin bellek ve işlemci çekirdeği tahsisini özelleştirebilirsiniz. Bu dosya, Windows kullanıcınızın ana dizininde (C:\Users\\.wslconfig) bulunur.


[wsl2]
memory=4GB  # Örneğin 4GB RAM
processors=2 # Örneğin 2 CPU çekirdeği
      

Değişikliklerin etkili olması için wsl --shutdown komutunu çalıştırıp WSL'yi yeniden başlatmanız gerekir.

Manuel NAT Konfigürasyonu: Ağ Erişimi Nasıl Sağlanır?

Docker Engine'i WSL2 üzerine kurmuş olsak da, Windows ana makinenizden "localhost" üzerinden bu Docker konteynerlerine doğrudan erişim henüz mümkün değildir. Bunun temel nedeni, WSL2 dağıtımınızın Windows'un dahili bir sanal ağı içinde dinamik olarak atanmış bir IP adresine sahip olmasıdır. Bu bölümde, bu erişimi sağlamak için gerekli olan manuel NAT (Network Address Translation) yapılandırmalarını ve port yönlendirme mekanizmalarını adım adım inceleyeceğiz.

WSL2'nin dinamik IP adresi sorunu, her WSL başlatıldığında farklı bir IP alabilmesi anlamına gelir. Bu, sabit port yönlendirme kuralları oluşturmayı zorlaştırır. Bu sorunu aşmak için bir sanal anahtar oluşturacak, buna bir NAT ağı atayacak ve ardından gerekli port yönlendirmelerini yapılandıracağız.

1. Windows'ta Sanal Anahtar Oluşturma (Hyper-V Manager veya PowerShell)

WSL2, aslında bir Hyper-V sanal makinesi olarak çalıştığından, Hyper-V yönetim araçlarını kullanarak WSL2'ye özel bir sanal ağ oluşturabiliriz.

  1. Hyper-V Yönetici Aracını Etkinleştirin (Gerekliyse):

    Eğer Hyper-V Yönetici aracınız kurulu değilse, Denetim Masası -> Programlar ve Özellikler -> Windows özelliklerini aç veya kapat yolunu izleyerek "Hyper-V Yönetim Araçları"nı etkinleştirin.

  2. Yeni Bir Sanal Anahtar Oluşturun:

    PowerShell'i yönetici olarak açın ve aşağıdaki komutu çalıştırın. Bu komut, sadece WSL2 ve Windows'un kendi içinde iletişim kurabileceği harici olmayan bir sanal anahtar oluşturur.

    
    New-VMSwitch -Name "WSL2-NAT-Switch" -SwitchType Internal
            

    "WSL2-NAT-Switch" yerine istediğiniz bir isim verebilirsiniz.

2. NAT Ağını Yapılandırma

Oluşturduğumuz sanal anahtar üzerinden WSL2 dağıtımınızın internete çıkabilmesini ve Windows ana makinenizden erişilebilir olmasını sağlamak için bir NAT ağı oluşturmamız gerekiyor. Bu ağ, WSL2'nin içindeki IP adreslerini, ana Windows makinenizin IP adreslerine çevirecektir.

  1. NAT IP Adresi Aralığı Belirleme:

    NAT ağınız için bir IP adresi aralığı belirlememiz gerekiyor. Örneğin, 192.168.100.0/24 aralığını kullanabiliriz. Bu, ağ geçidinin 192.168.100.1 olacağı anlamına gelir.

    
    New-NetIPAddress -IPAddress 192.168.100.1 -PrefixLength 24 -InterfaceAlias "vEthernet (WSL2-NAT-Switch)"
            

    "vEthernet (WSL2-NAT-Switch)" ifadesi, bir önceki adımda oluşturduğumuz sanal anahtarın ağ adaptörü adıdır. Bu isim, sisteminizde farklılık gösterebilir. Doğru adı bulmak için Get-NetAdapter komutunu kullanabilirsiniz.

  2. NAT Ağını Oluşturma:

    Şimdi belirlediğimiz IP adresi aralığını kullanarak NAT ağını oluşturuyoruz:

    
    New-NetNat -Name "WSL2-NAT-Network" -InternalIPInterfaceAddressPrefix 192.168.100.0/24
            

    "WSL2-NAT-Network", NAT ağınıza verdiğimiz isimdir. Bu adı istediğiniz gibi değiştirebilirsiniz.

Bu adımlarla, Windows üzerinde WSL2'niz için özel bir sanal anahtar ve bir NAT ağı oluşturmuş olursunuz. Ancak bu NAT ağı henüz WSL2 dağıtımınız tarafından kullanılmıyor. WSL2'yi bu yeni ağa bağlamak için birkaç ek adım daha gereklidir. WSL2'nin otomatik olarak bu yeni sanal anahtarı kullanması için wsl --shutdown komutunu çalıştırıp tüm WSL2 dağıtımlarını kapatıp tekrar açmanız gerekebilir. WSL yeniden başlatıldığında, yeni oluşturulan WSL2-NAT-Switch'e bağlanmaya çalışacaktır.

Bu yapılandırmalar biraz karmaşık görünebilir ancak Windows'un ağ alt yapısıyla WSL2'nin dinamik IP yönetimini bir araya getirmek için gereklidir. Doğru yapıldığında, WSL2 içindeki Docker konteynerlerinize Windows ana makinenizden belirlenmiş portlar üzerinden sorunsuz bir şekilde erişebileceksiniz. Bir sonraki bölümde, bu port yönlendirme işlemini nasıl gerçekleştireceğimizi detaylıca ele alacağız.

Uzman İpucu: Birden fazla WSL2 dağıtımınız varsa ve hepsi için aynı NAT ağını kullanmak istiyorsanız, bu adımları sadece bir kez yapmanız yeterlidir. Tüm WSL2 dağıtımları aynı sanal anahtar ve NAT ağı üzerinden iletişim kurabilir. Eğer farklı ağ yapılandırmaları gerektiren özel durumlarınız varsa, her dağıtım için ayrı sanal anahtarlar ve NAT ağları oluşturmanız gerekebilir, ancak bu, karmaşıklığı artıracaktır.

Yerel Makineden Docker Servislerine Erişim: Port Yönlendirme ve Güvenlik

Artık WSL2 üzerinde Docker Engine'i çalışır durumda ve Windows tarafında bir NAT ağı yapılandırmış durumdayız. Ancak bu haliyle, Windows ana makinemizdeki tarayıcıdan veya diğer uygulamalardan WSL2 içindeki Docker konteynerlerine "localhost" üzerinden doğrudan erişemeyiz. İşte bu noktada "port yönlendirme" devreye giriyor. Port yönlendirme, Windows ana makinenizin belirli bir portuna gelen trafiği, WSL2'nin dinamik IP adresine ve oradaki Docker konteynerinin belirli bir portuna yönlendirmemizi sağlar.

1. WSL2 IP Adresini Dinamik Olarak Bulma

WSL2'nin dinamik IP adresi aldığını daha önce belirtmiştik. Bu, her WSL2 yeniden başlatıldığında IP adresinin değişebileceği anlamına gelir. Bu yüzden, port yönlendirme kurallarını oluşturmadan önce güncel WSL2 IP adresini bulmamız gerekiyor.

  1. WSL2 IP Adresini Tespit Etme:

    WSL2 terminalinize gidin ve aşağıdaki komutu çalıştırın:

    
    ip a | grep eth0 | grep inet | awk '{print $2}' | cut -d '/' -f 1
            

    Bu komut, eth0 arayüzüne atanmış olan IPv4 adresini size verecektir. Örneğin: 172.20.12.15.

  2. PowerShell ile Otomatik IP Tespiti (Gelişmiş Yöntem):

    Port yönlendirme kurallarını otomatik hale getirmek için, bu IP adresini PowerShell üzerinden dinamik olarak alabiliriz. Yönetici olarak açılmış PowerShell'de aşağıdaki komutu kullanın:

    
    $wsl_ip = (wsl hostname -I).Trim()
    Write-Host "WSL2 IP Adresi: $wsl_ip"
            

    Bu komut, size sadece IP adresini döndürür ve bir sonraki adımda kullanıma hazırdır.

2. Port Yönlendirme Kuralları Oluşturma (netsh interface portproxy)

Windows'ta port yönlendirme işlemleri için netsh interface portproxy komut setini kullanırız. Bu komut, belirli bir dinleme portuna gelen TCP veya UDP trafiğini başka bir IP adresinin belirli bir portuna yönlendirir.

  1. Örnek Senaryo: Nginx Konteyneri

    Diyelim ki WSL2 içinde bir Nginx konteyneri çalıştıracaksınız ve bu konteyner 80 numaralı porttan yayın yapıyor. Biz bu servise Windows'tan localhost:8080 üzerinden erişmek istiyoruz.

    Önce WSL2 içinde Nginx'i çalıştıralım:

    
    docker run --name my-nginx -p 80:80 -d nginx
            

    Şimdi Windows PowerShell'i (yönetici olarak) açın ve WSL2 IP adresinizi tespit ettikten sonra port yönlendirme kuralını ekleyin:

    
    # WSL2 IP adresini dinamik olarak alın (yukarıdaki komutu kullanın)
    $wsl_ip = (wsl hostname -I).Trim()
    
    # Port yönlendirme kuralını ekle:
    netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=80 connectaddress=$wsl_ip
            

    Burada:

    • listenport=8080: Windows ana makinenizdeki dinlenecek port.
    • listenaddress=0.0.0.0: Tüm ağ arayüzlerinden gelen bağlantıları dinle.
    • connectport=80: WSL2 içindeki Docker konteynerinin hedef portu.
    • connectaddress=$wsl_ip: WSL2 dağıtımınızın IP adresi.

    Artık Windows tarayıcınızdan http://localhost:8080 adresine giderek WSL2 içindeki Nginx konteynerine erişebilirsiniz.

  2. Port Yönlendirme Kurallarını Görüntüleme ve Silme:

    Mevcut tüm port yönlendirme kurallarını görmek için:

    
    netsh interface portproxy show v4tov4
            

    Bir kuralı silmek için:

    
    netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=0.0.0.0
            

3. Güvenlik ve En İyi Pratikler

Manuel port yönlendirme yaparken güvenlik önemli bir husustur:

  • Firewall Ayarları: Windows Defender Firewall, varsayılan olarak gelen bağlantıları engelleyebilir. Port yönlendirme kurallarınızın çalışması için belirli portlar için (örneğin 8080) bir güvenlik duvarı kuralı oluşturmanız gerekebilir. Sadece gerçekten ihtiyaç duyduğunuz portları açın.
  • listenaddress Kullanımı: listenaddress=0.0.0.0 kullanmak, yönlendirmeyi tüm ağ arayüzleri üzerinden erişilebilir kılar. Eğer sadece kendi makinenizden erişmek istiyorsanız, listenaddress=127.0.0.1 kullanmak daha güvenli olabilir. Ancak, bazı durumlarda ağınızdaki diğer cihazlardan da erişim sağlamak isteyebilirsiniz (örneğin mobil cihazınızdan).
  • Gereksiz Kuralları Kaldırın: Geliştirme sürecinizde artık kullanmadığınız port yönlendirme kurallarını düzenli olarak temizleyin. Bu, gereksiz açık portları ve potansiyel güvenlik açıklarını azaltır.
  • Otomasyon: WSL2 IP adresi dinamik olduğu için, her yeniden başlatmada bu adımları tekrarlamak zahmetli olabilir. Bir PowerShell scripti yazarak bu işlemi otomatik hale getirebilirsiniz. Bu script, WSL2'nin IP adresini bulacak, eski port yönlendirme kurallarını silecek ve yenilerini oluşturacaktır.

Bu adımlarla, WSL2 içindeki Docker konteynerlerinize Windows ana makinenizden "localhost" üzerinden sorunsuz bir şekilde erişim sağlamış olursunuz. Bu, Docker Desktop'ın sunduğu temel bir özelliği manuel olarak taklit etmenin ve geliştirme ortamınız üzerinde tam kontrol sahibi olmanın önemli bir parçasıdır.

Uzman İpucu: Otomatik port yönlendirme için bir başlangıç scripti oluşturabilirsiniz. PowerShell'de bir .ps1 dosyası oluşturun (örneğin C:\Scripts\wsl-docker-port-forward.ps1) ve Windows Görev Zamanlayıcı'ya (Task Scheduler) sistem başlangıcında bu scripti çalıştırmasını söyleyin. Scriptinizde mevcut kuralları silmeyi ve yeni kuralları eklemeyi unutmayın.


# wsl-docker-port-forward.ps1
# WSL2 IP'sini al
$wsl_ip = (wsl hostname -I).Trim()

# Mevcut tüm v4tov4 kurallarını sil
netsh interface portproxy delete v4tov4

# Örnek port yönlendirme kurallarını ekle
# Docker'da 80 portunda çalışan web uygulaması için (Windows'ta 8080'den erişim)
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=80 connectaddress=$wsl_ip

# Docker'da 3000 portunda çalışan Node.js uygulaması için (Windows'ta 3000'den erişim)
netsh interface portproxy add v4tov4 listenport=3000 listenaddress=0.0.0.0 connectport=3000 connectaddress=$wsl_ip

Write-Host "WSL2 IP: $wsl_ip, Port yönlendirme kuralları güncellendi."
      

Vaka Analizi: Geliştirme Ortamınızı Optimize Etmek

Şimdiye kadar edindiğimiz bilgileri somut bir senaryo üzerinde uygulayarak, Docker Desktop olmadan manuel WSL2-Docker kurulumunun gerçek bir geliştirme ortamında nasıl kullanılabileceğini görelim. Bu vaka analizi, bir web geliştiricisinin popüler teknolojilerle (Node.js ve PostgreSQL) nasıl bir ortam kurabileceğini göstermektedir.

Senaryo: Tam Yığın Web Uygulaması Geliştirme Ortamı

Ayşe, modern bir React ön yüzü ve Node.js/Express arka yüzü ile PostgreSQL veritabanı kullanan bir tam yığın web uygulaması geliştiriyor. Docker Desktop'ın getirdiği kaynak tüketimi ve lisanslama maliyetlerinden kaçınmak isteyen Ayşe, WSL2 üzerinde manuel bir Docker kurulumu yapmaya karar verdi.

Adımlar:

  1. WSL2 ve Docker Engine Kurulumu:

    Ayşe, yukarıdaki "Docker Desktop Olmadan WSL2 Üzerine Docker Kurulumu Nasıl Yapılır?" bölümündeki adımları takip ederek Ubuntu WSL2 dağıtımına Docker Engine'i kurdu. docker run hello-world komutuyla kurulumun başarılı olduğunu doğruladı.

  2. Sanal Anahtar ve NAT Ağı Yapılandırması:

    Ardından, "Manuel NAT Konfigürasyonu" bölümündeki adımları uygulayarak Windows tarafında WSL2-NAT-Switch adında bir sanal anahtar ve WSL2-NAT-Network adında bir NAT ağı oluşturdu. Bu, WSL2'sinin Windows ağ ortamıyla entegre olmasını sağladı.

  3. Uygulama Bileşenlerini Dockerize Etme:

    Ayşe, Node.js arka yüzü ve PostgreSQL veritabanı için iki ayrı Docker servisi tanımlayan bir docker-compose.yml dosyası oluşturdu:

    
    version: '3.8'
    services:
      app:
        build: .
        ports:
          - "3000:3000"
        environment:
          DATABASE_URL: postgres://user:password@db:5432/mydatabase
        depends_on:
          - db
      db:
        image: postgres:14
        environment:
          POSTGRES_DB: mydatabase
          POSTGRES_USER: user
          POSTGRES_PASSWORD: password
        volumes:
          - pgdata:/var/lib/postgresql/data
    
    volumes:
      pgdata:
          

    Node.js uygulaması için Dockerfile (app servisi için):

    
    FROM node:18
    WORKDIR /app
    COPY package*.json ./
    RUN npm install
    COPY . .
    CMD ["npm", "start"]
          

  4. Docker Konteynerlerini Başlatma:

    WSL2 terminalinde, docker-compose.yml dosyasının bulunduğu dizine giderek konteynerleri başlattı:

    
    docker compose up -d
          

    Bu komut, PostgreSQL veritabanını ve Node.js uygulamasını WSL2 içinde ayrı Docker konteynerlerinde çalıştırdı. Node.js uygulaması 3000 numaralı porttan, PostgreSQL ise 5432 numaralı porttan dinlemeye başladı (sadece Docker içindeki özel ağda).

  5. Port Yönlendirme Kurallarını Oluşturma:

    Ayşe, "Yerel Makineden Docker Servislerine Erişim" bölümündeki adımları kullanarak, Windows ana makinesinden bu servislere erişmek için port yönlendirme kuralları oluşturdu. İlk olarak, güncel WSL2 IP adresini buldu:

    
    $wsl_ip = (wsl hostname -I).Trim()
          

    Ardından, Node.js uygulaması için 3000 numaralı portu ve PostgreSQL veritabanı için 5432 numaralı portu Windows ana makinesine yönlendirdi:

    
    netsh interface portproxy add v4tov4 listenport=3000 listenaddress=0.0.0.0 connectport=3000 connectaddress=$wsl_ip
    netsh interface portproxy add v4tov4 listenport=5432 listenaddress=0.0.0.0 connectport=5432 connectaddress=$wsl_ip
          

  6. Uygulamayı Test Etme:

    Ayşe şimdi Windows tarayıcısını açıp http://localhost:3000 adresine giderek Node.js uygulamasının API'lerine erişebiliyordu. Ayrıca, DBeaver gibi bir veritabanı yönetim aracıyla localhost:5432 adresinden PostgreSQL veritabanına bağlanabildi. Geliştirme ortamı artık eksiksiz ve hızlı bir şekilde çalışıyordu.

Bu vaka analizi, manuel WSL2-Docker kurulumunun ne kadar esnek ve güçlü olabileceğini göstermektedir. Ayşe, Docker Desktop'ın ek yükü ve lisanslama endişeleri olmadan, ihtiyaçlarına göre optimize edilmiş bir geliştirme ortamı kurmayı başardı. Bu yöntem, özellikle kaynak kısıtlamaları olan makinelerde veya birden fazla geliştirme ortamını eş zamanlı olarak yönetmesi gereken profesyoneller için ideal bir çözümdür. Ayşe gibi birçok geliştirici, bu manuel konfigürasyon sayesinde daha hafif, daha hızlı ve daha kontrollü bir geliştirme deneyimi elde edebilir.

İleri Düzey İpuçları ve Optimizasyonlar

Manuel WSL2 ve Docker kurulumunuzu daha verimli hale getirmek ve karşılaşabileceğiniz bazı yaygın sorunları çözmek için ileri düzey ipuçları ve optimizasyonları bu bölümde ele alacağız. Bu tavsiyeler, geliştirme iş akışınızı iyileştirmeye ve sistem performansını artırmaya yardımcı olacaktır.

1. Otomatik Port Yönlendirme Scriptleri

WSL2'nin dinamik IP adresi sorunu nedeniyle, her WSL2 yeniden başlatıldığında port yönlendirme kurallarını manuel olarak yeniden oluşturmak zahmetli olabilir. Bunu otomatikleştirmek için bir PowerShell scripti oluşturabilir ve bunu Windows başlangıcında veya WSL2 başlatıldığında çalıştırabilirsiniz.


# C:\Scripts\Update-WslDockerPortForwarding.ps1
# Yönetici olarak çalıştırılması gerekmektedir

# WSL2'nin güncel IP adresini al
$wsl_ip = (wsl hostname -I).Trim()
if ([string]::IsNullOrWhiteSpace($wsl_ip)) {
    Write-Warning "WSL2 IP adresi alınamadı. WSL2 çalışıyor mu?"
    exit 1
}

Write-Host "WSL2 IP Adresi: $wsl_ip"

# Mevcut tüm v4tov4 port yönlendirme kurallarını sil (isteğe bağlı, sadece temiz bir başlangıç için)
# Bu satır, aynı dinleme portu için birden fazla kuralın oluşmasını engeller
netsh interface portproxy delete v4tov4 | Out-Null # Hataları bastırmak için Out-Null

# Eklenecek port yönlendirmelerinin bir listesini oluştur
# [WindowsListenPort, DockerContainerPort]
$portsToForward = @(
    @{ ListenPort = 8080; ConnectPort = 80 },   # Nginx, Apache gibi web sunucuları
    @{ ListenPort = 3000; ConnectPort = 3000 }, # Node.js uygulamaları
    @{ ListenPort = 5000; ConnectPort = 5000 }, # Python Flask/Django uygulamaları
    @{ ListenPort = 5432; ConnectPort = 5432 }, # PostgreSQL
    @{ ListenPort = 3306; ConnectPort = 3306 }  # MySQL
)

foreach ($port in $portsToForward) {
    $listenPort = $port.ListenPort
    $connectPort = $port.ConnectPort
    $command = "netsh interface portproxy add v4tov4 listenport=$listenPort listenaddress=0.0.0.0 connectport=$connectPort connectaddress=$wsl_ip"
    
    try {
        Invoke-Expression $command
        Write-Host "Port yönlendirme kuralı eklendi: localhost:$listenPort -> $wsl_ip:$connectPort"
    } catch {
        Write-Error "Port yönlendirme kuralı eklenirken hata oluştu: $command. Hata: $_"
    }
}

Write-Host "Tüm belirlenen port yönlendirme kuralları güncellendi."
    

Bu scripti Windows Görev Zamanlayıcı (Task Scheduler) ile her oturum açılışında veya sistem başlangıcında otomatik olarak çalışacak şekilde ayarlayabilirsiniz. Görev Zamanlayıcı'da yeni bir görev oluştururken "En yüksek ayrıcalıklarla çalıştır" seçeneğini işaretlemeyi unutmayın, çünkü netsh komutları yönetici izni gerektirir.

2. WSL2 Performans İyileştirmeleri

WSL2, varsayılan olarak sistem kaynaklarının bir kısmını kullanır. Performansınızı daha da optimize etmek için .wslconfig dosyasını kullanabilirsiniz:


# C:\Users\\.wslconfig
[wsl2]
memory=8GB           # WSL2'ye tahsis edilecek maksimum RAM. Daha büyük projeler için artırılabilir.
processors=4         # WSL2'ye tahsis edilecek maksimum CPU çekirdek sayısı.
swap=2GB             # WSL2 için takas alanı (SWAP) boyutu.
swapFile=C:\temp\wsl-swap.vhdx # Takas dosyası konumu
localhostforwarding=true # Docker Desktop'taki gibi otomatik localhost forwarding'i etkinleştirebilir.
kernelCommandLine = "systemd.unified_cgroup_hierarchy=0" # systemd desteği için gerekli olabilir.
    

Değişikliklerin etkili olması için PowerShell'den wsl --shutdown komutunu çalıştırıp WSL'yi tamamen kapatıp yeniden başlatın.

3. WSL2 Üzerinde systemd Kullanımı

Bazı Linux servisleri (örneğin docker servisi, systemd ile yönetilir). WSL2'nin varsayılan yapılandırması systemd'yi doğrudan desteklemez. Ancak son zamanlarda WSL2, systemd'yi deneysel olarak desteklemeye başladı. .wslconfig dosyasında systemd=true ayarını yaparak veya /etc/wsl.conf dosyasını düzenleyerek systemd'yi etkinleştirebilirsiniz.


# /etc/wsl.conf (WSL2 içinden düzenlenir)
[boot]
systemd=true
    

Bu değişiklikleri yaptıktan sonra wsl --shutdown komutu ile WSL2'yi kapatıp yeniden başlatmanız gerekmektedir.

4. Çoklu WSL2 Dağıtımları ve Ağ İzolasyonu

Birden fazla WSL2 dağıtımı kullanıyorsanız (örneğin, Ubuntu ve Debian), hepsi aynı sanal anahtarı ve NAT ağını kullanabilir. Ancak, her dağıtımın kendi Docker Engine'i ayrı birer ortam olarak çalışır. Eğer farklı projeler için tamamen izole ağlar veya farklı IP aralıkları gerekiyorsa, her dağıtım veya proje grubu için ayrı sanal anahtarlar ve NAT ağları oluşturmanız gerekebilir. Bu, ağ karmaşıklığını artırsa da, tam bir izolasyon ve özelleştirme sağlar.

5. WSL Dosya Sistemi Performansı

WSL2, Linux dosyalarına Windows'tan erişirken veya tam tersi, performans sorunları yaşayabilir. En iyi performans için, projelerinizi ve Docker dosyalarınızı (docker-compose.yml, uygulama kodları) WSL2 Linux dosya sistemi içinde (örneğin /home/user/myproject altında) tutun. Windows tarafındaki bir dizinden (/mnt/c/Users/...) Docker volume'larını bağlamak veya kod çalıştırmak, I/O performansını düşürebilir.

Bu ileri düzey ipuçları ve optimizasyonlar, manuel WSL2 ve Docker kurulumunuzdan en iyi şekilde yararlanmanıza olanak tanıyacak, geliştirme deneyiminizi daha akıcı ve verimli hale getirecektir. Unutmayın, her sistemin kendine özgü ihtiyaçları olabilir, bu nedenle bu ayarları kendi kullanım senaryonuza göre uyarlamaktan çekinmeyin.

Sonuç ve Sıkça Sorulan Sorular

Bu kapsamlı rehber boyunca, Docker Desktop'ın getirdiği sınırlamaları aşarak, Windows Subsystem for Linux 2 (WSL2) üzerinde tamamen manuel bir Docker geliştirme ortamı kurmanın inceliklerini keşfettik. Adım adım, WSL2 kurulumundan Docker Engine entegrasyonuna, sanal ağ oluşturmadan dinamik IP yönetimine ve port yönlendirme kurallarına kadar tüm kritik süreçleri ele aldık. Bir vaka analiziyle gerçek dünya senaryosunda bu bilgilerin nasıl uygulanabileceğini gösterdik ve son olarak, ileri düzey ipuçları ve optimizasyonlarla sisteminizi daha da verimli hale getirme yollarını inceledik.

Özetle, Docker Desktop'a alternatif olarak manuel WSL2-Docker kurulumu, geliştiricilere aşağıdaki önemli avantajları sunar:

  • Maliyet Etkinliği: Docker Desktop'ın ticari kullanım lisansı olmadan konteynerizasyonun tüm gücünden faydalanma.
  • Yüksek Performans: WSL2'nin gerçek Linux çekirdeği sayesinde neredeyse yerel Linux deneyimi ve daha düşük kaynak tüketimi.
  • Tam Kontrol: Ağ yapılandırmasından servis yönetimine kadar her detay üzerinde daha fazla esneklik ve özelleştirme imkanı.
  • Esneklik: Belirli proje veya geliştirme ihtiyaçlarına göre özelleştirilmiş ağ ve kaynak tahsisleri.

Bu manuel yaklaşım, başlangıçta biraz daha fazla kurulum çabası gerektirse de, uzun vadede daha hafif, daha hızlı ve daha güvenli bir geliştirme ortamı sağlayarak bu çabayı fazlasıyla telafi eder. Gelişen teknolojiler ve değişen ihtiyaçlar karşısında, bu tür esnek ve kontrol odaklı çözümler, modern geliştiricilerin araç kutusunda önemli bir yer tutmaktadır. Konteynerizasyonun geleceği parlak ve WSL2 ile Windows üzerindeki potansiyeli giderek artıyor.

Sıkça Sorulan Sorular (SSS)

S: WSL2 IP adresim sürekli değişiyor, bu bir sorun mu?
C: Evet, WSL2'nin dinamik IP adresi alması yaygın bir durumdur ve port yönlendirme kurallarını etkileyebilir. Bu nedenle, makalede anlattığımız gibi PowerShell scriptleri kullanarak her açılışta veya WSL2 yeniden başlatıldığında IP adresini dinamik olarak tespit edip port yönlendirme kurallarını güncellemek en iyi yaklaşımdır.
S: Docker Desktop'ın "Integrate with WSL2 distros" özelliğinin aynısını nasıl yapabilirim?
C: Docker Desktop'ın bu özelliği, Windows'taki Docker CLI'nın WSL2 içindeki Docker Engine'e bağlanmasını sağlar. Manuel kurulumda, Windows'a Docker CLI'yı kurup, WSL2 içindeki Docker Engine'i uzaktan erişime açarak benzer bir kurulum yapabilirsiniz. Ancak, bizim rehberimizdeki yaklaşım, Docker CLI'yı doğrudan WSL2 içinden kullanmayı ve Windows'tan erişimi port yönlendirmeyle sağlamayı amaçlamaktadır. Bu, daha hafif ve Docker Desktop'a bağımlılığı olmayan bir çözümdür.
S: Kurduğum Docker konteynerlerine ağdaki başka bir bilgisayardan erişebilir miyim?
C: Evet, eğer port yönlendirme kuralınızı listenaddress=0.0.0.0 ile oluşturursanız, Windows ana makinenizin IP adresini veya ağ adını kullanarak ağınızdaki diğer bilgisayarlardan da erişebilirsiniz. Ancak bu durumda, Windows güvenlik duvarı ayarlarınızı kontrol etmeli ve ilgili port için gelen bağlantılara izin vermelisiniz. Güvenlik açısından sadece gerekli olduğunda bu erişime izin vermeniz önerilir.
S: WSL2 içindeki Docker performansını nasıl artırabilirim?
C: Performansı artırmak için birkaç yol vardır:
  • Projelerinizi WSL2 Linux dosya sistemi içinde tutun (/home/user/...), Windows tarafındaki dosya sisteminden erişim (/mnt/c/...) yavaş olabilir.
  • .wslconfig dosyasını kullanarak WSL2'ye daha fazla RAM ve CPU çekirdeği tahsis edin.
  • Gereksiz WSL2 dağıtımlarını kapatmak için wsl --shutdown komutunu kullanın.
S: Docker Compose kullanmak zorunda mıyım?
C: Hayır, Docker Compose kullanmak zorunda değilsiniz. Tek tek docker run komutlarıyla da konteynerlerinizi yönetebilirsiniz. Ancak birden fazla servis içeren uygulamalar için Docker Compose, konfigürasyonu basitleştiren ve servisleri tek bir komutla başlatıp durdurmayı sağlayan çok kullanışlı bir araçtır. Geliştirme ortamınızın karmaşıklığına bağlı olarak tercih edilebilir.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version