Geçenlerde bir arkadaşım homelab kurmak istediğini söyledi ve bana ilk sorusu “Proxmox mu kurmalıyım, Docker mı?” oldu. Bu soru aslında temel bir yanlış anlamadan kaynaklanıyor; çünkü Proxmox ve Docker birbirine rakip teknolojiler değil, aksine birbirini tamamlayan iki farklı katman. Homelab dünyasına adım atan birçok kişinin kafası bu konuda karışık oluyor, ben de kendi 20 yıllık saha tecrübemden yola çıkarak bu ikilinin ne işe yaradığını ve homelab macerasına nereden başlamanın daha mantıklı olduğunu anlatmak istedim.
Bu yazıda, Proxmox ve Docker’ın ne olduğunu, temel farklarını, benim kendi sunucularımda ve üretim ERP’sinde nasıl kullandığımı ve homelab için nasıl bir strateji izlenmesi gerektiğini detaylıca ele alacağım. Aslında en verimli homelab kurulumu genellikle bu iki teknolojiyi bir arada kullanmaktan geçiyor.
Homelab Macerasına Başlarken Yanlış Soru: Proxmox ve Docker Rakip mi?
Homelab kurmaya karar verdiğinizde, ilk başta donanım seçimi kadar yazılım katmanını da düşünmeniz gerekiyor. Genellikle insanlar, sahip oldukları tek bir fiziksel sunucuyu en verimli şekilde kullanmak isterler. Bu noktada Proxmox ve Docker isimleri sıklıkla karşılarına çıkar ve sanki birini seçip diğerinden vazgeçmeleri gerekiyormuş gibi algılarlar. Ancak bu durum, “ev almak mı, yoksa araba almak mı” diye sormaya benzer; ikisi de farklı ihtiyaçlara hizmet eder ve birbiri yerine geçmez.
Benim deneyimimde, bu tür sorular genellikle teknolojilerin temel katmanlarını karıştırmaktan kaynaklanıyor. Proxmox, fiziksel donanım üzerinde çalışan bir “Hypervisor” iken, Docker işletim sistemi seviyesinde “Container” teknolojisi sunar. Yani, Proxmox fiziksel sunucunuzu birden fazla sanal sunucuya bölmenizi sağlarken, Docker bu sanal sunucuların içinde uygulamalarınızı izole etmenize yardımcı olur. Bu farkı anlamak, homelab mimarinizi doğru kurmanın ilk adımıdır.
Proxmox Nedir ve Homelab’da Neden Tercih Edilir?
Proxmox VE (Virtual Environment), açık kaynaklı bir sunucu sanallaştırma platformudur. KVM (Kernel-based Virtual Machine) ve LXC (Linux Containers) teknolojilerini temel alır. Kısacası, Proxmox’u fiziksel sunucunuza kurduğunuzda, o sunucuyu birden fazla sanal makineye (VM) veya hafif konteynere (LXC) bölebilirsiniz. Benim kendi homelab’imde ve hatta bazı eski müşteri projelerimin test ortamlarında yıllardır Proxmox kullanıyorum. Tek bir fiziksel sunucu üzerinde Windows, Linux sunucuları ve hatta farklı Linux dağıtımlarını aynı anda çalıştırmak istediğimde ilk başvurduğum çözüm Proxmox oluyor.
Proxmox’un en büyük avantajı, fiziksel kaynakları (CPU, RAM, disk, ağ kartları) sanal makineler arasında verimli bir şekilde paylaştırması ve merkezi bir web arayüzünden kolayca yönetilebilmesidir. Örneğin, kendi yan ürünlerimin backend’ini geliştirirken, bir tarafta PostgreSQL sunucusunu ayrı bir Debian VM’ine kurup, diğer tarafta FastAPI uygulamasını başka bir Ubuntu VM’inde çalıştırabiliyorum. Bu sayede, bir yazılımın çökmesi veya kaynak tüketimi, diğerini doğrudan etkilemiyor. Ayrıca, Proxmox’un sağladığı snapshot ve yedekleme özellikleri sayesinde, kritik sistemlerimin güvenliğini de kolayca sağlayabiliyorum. Birkaç yıl önce disk arızası yaşadığımda, Proxmox’un otomatik yedekleme özelliği sayesinde sadece birkaç saat içinde tüm sanal makinelerimi yeni diske geri yükleyebilmiştim.
# Proxmox'ta yeni bir LXC (Linux Container) oluşturma örneği
# Bu komut ile Ubuntu 22.04 LTS tabanlı, 512MB RAM ve 4GB diskli bir container oluşturulur.
# Bu, hafif servisler için ideal bir çözümdür.
pct create 101 local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst --hostname my-lxc --memory 512 --rootfs local-lvm:4 --unprivileged 1 --cores 1
Docker Nedir ve Uygulama Geliştirmede Neden Kullanılır?
Docker, uygulamaları ve bağımlılıklarını “container” adı verilen hafif, taşınabilir ve izole edilmiş birimler halinde paketlemek için kullanılan bir platformdur. Proxmox’un aksine, Docker fiziksel donanımı değil, işletim sistemini sanallaştırır. Yani Docker, zaten çalışan bir işletim sistemi (örneğin bir Linux VM’i) üzerinde çalışır. Benim üretim ERP’si geliştirme sürecimde veya kendi Android spam uygulamamın backend servislerini kurarken Docker vazgeçilmez bir araç oldu. Uygulama geliştiricisi olarak, geliştirme ortamımı, test ortamımı ve üretim ortamımı birebir aynı tutmama olanak tanıyor.
Docker’ın temel faydası, “benim makinemde çalışıyordu” sendromunu ortadan kaldırmasıdır. Bir uygulamanın tüm bağımlılıklarını (kütüphaneler, ayarlar, binary’ler) tek bir Docker imajına dahil edersiniz. Bu imajı istediğiniz sunucuda (yerel makinenizde, Proxmox VM’inizin içinde, bulutta) çalıştırabilirsiniz ve her yerde aynı şekilde davranır. Geçen yıl, bir API servisinde Python versiyonu kaynaklı beklenmedik bir hata aldığımda, Docker container’ının içindeki kesin versiyonlama sayesinde sorunu 15 dakikada tespit edip düzeltebildim. Eğer Docker kullanmasaydık, o sunucunun global Python ortamını bozma riskim olacaktı.
# Basit bir Nginx Dockerfile örneği
# Bu dosya, Nginx web sunucusunu bir container içinde nasıl çalıştıracağımızı tanımlar.
FROM nginx:latest
COPY ./nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Homelab Senaryolarında Proxmox ve Docker Birlikteliği Nasıl Çalışır?
Proxmox ve Docker’ın birbirini tamamladığını söylediğimde tam olarak ne demek istediğimi anlatayım. Bir homelab senaryosunda, genellikle tek bir fiziksel sunucunuz olur. Bu sunucuya doğrudan Proxmox kurarsınız. Proxmox, bu fiziksel sunucunun üzerindeki işletim sistemi ve hypervisor katmanıdır. Daha sonra, Proxmox’un web arayüzünden birden fazla sanal makine (VM) veya LXC oluşturursunuz. Örneğin, bir Debian VM’i, bir Ubuntu LXC’si veya hatta bir Windows Server VM’i.
İşte bu noktada Docker devreye girer: Docker’ı bu sanal makinelerin içine kurarsınız. Örneğin, Debian VM’inizin içine Docker Engine’i kurar ve tüm uygulamalarınızı (Nginx reverse proxy, PostgreSQL veritabanı, kendi geliştirdiğiniz servisler, Plex medya sunucusu vb.) Docker container’ları olarak bu VM içinde çalıştırırsınız. Bu mimari, size hem donanım seviyesinde izolasyon (Proxmox ile farklı işletim sistemleri arasında) hem de uygulama seviyesinde izolasyon (Docker ile aynı işletim sistemi içindeki uygulamalar arasında) sağlar. Benim kendi yan ürünlerimin çoğunda bu yapıyı kullanıyorum; Proxmox üzerinde bir Linux VM’im var ve tüm servislerim o VM içindeki Docker Compose stack’lerinde çalışıyor. Bu sayede, VM’i taşıma, yedekleme veya belirli kaynakları (CPU, RAM) ayırma esnekliğine sahip oluyorum.
graph TD;
A["Fiziksel Sunucu (Bare-Metal)"] --> B["Proxmox VE"];
B --> C["VM: Debian Server"];
B --> D["VM: Ubuntu Server"];
C --> E["Docker Engine"];
E --> F["Container: Nginx"];
E --> G["Container: PostgreSQL"];
E --> H["Container: Kendi Uygulamam"];
D --> I["Docker Engine"];
I --> J["Container: Jellyfin"];
I --> K["Container: Home Assistant"];
subgraph "Proxmox Katmanı"
B
end
subgraph "VM Katmanı"
C
D
end
subgraph "Docker Katmanı (VM içinde)"
E
F
G
H
I
J
K
end
Bu diyagram, fiziksel sunucu üzerinde Proxmox’un nasıl çalıştığını, Proxmox’un içinde birden fazla VM’in nasıl barındığını ve bu VM’lerin bazılarının içinde Docker Engine’in ve onun da içinde container’ların nasıl çalıştığını gösteriyor. Bu katmanlı yapı, kaynakların daha verimli kullanılmasını ve yönetimin basitleştirilmesini sağlar.
Karşılaştırma: Hangi Durumda Hangisi Daha Uygun? (Ya da İkisi Birden?)
Proxmox ve Docker’ı ayrı ayrı veya birlikte kullanma kararı, ihtiyaçlarınıza ve homelab hedeflerinize göre değişir. Her birinin kendine özgü avantajları ve dezavantajları var.
Proxmox Tek Başına:
- Avantajlar: Farklı işletim sistemleri çalıştırmak (Windows, farklı Linux dağıtımları), donanım seviyesinde izolasyon, kolay yedekleme ve snapshot alma, kaynakları (CPU, RAM) VM’lere özel atama imkanı. Eski donanımları veya özel donanım geçişine ihtiyaç duyan servisleri çalıştırmak için ideal.
- Dezavantajlar: Her VM’in kendi işletim sistemi yükü olması nedeniyle kaynak tüketimi daha yüksek olabilir, boot süreleri daha uzundur. Uygulama bağımlılıklarını yönetmek için VM içine tek tek kurulumlar yapmanız gerekir.
- Ne zaman tercih edilir: Eğer farklı işletim sistemlerine ihtiyacınız varsa (örneğin bir Windows Active Directory sunucusu ve birkaç Linux sunucusu), veya bir uygulamanın belirli bir donanım kartına doğrudan erişmesi gerekiyorsa (GPU passthrough gibi), Proxmox tek başına veya ana katman olarak vazgeçilmezdir.
Docker Tek Başına (Fiziksel Sunucu Üzerinde):
- Avantajlar: Çok hafif ve hızlı, uygulama bağımlılıklarını kolayca yönetir, taşınabilirlik, hızlı deploy ve rollback. Tek bir işletim sistemi üzerinde yüzlerce uygulama çalıştırabilirsiniz.
- Dezavantajlar: Sadece Linux tabanlı container’lar çalıştırabilirsiniz (Windows container’ları da var ama genellikle Linux host’ta çalışmaz), işletim sistemi seviyesinde izolasyon sağlamaz. Yani tüm container’lar aynı kernel’ı paylaşır. Bir container’ın kernel seviyesinde güvenlik açığı, diğerlerini de etkileyebilir.
- Ne zaman tercih edilir: Eğer tek bir Linux işletim sistemi üzerinde sadece Linux tabanlı uygulamalarınızı çalıştırmak istiyorsanız ve donanım sanallaştırmasına ihtiyacınız yoksa, doğrudan fiziksel sunucuya bir Linux dağıtımı kurup üzerine Docker kurabilirsiniz. Bu benim bazı hafif servisler için kullandığım bir yöntem.
Proxmox ve Docker Birlikte (Önerilen Homelab Yaklaşımı):
- Avantajlar: Her iki dünyanın en iyisi. Donanım seviyesinde esneklik ve izolasyon (Proxmox), uygulama seviyesinde esneklik ve izolasyon (Docker). Kaynakları daha verimli kullanma. Kolay yönetim ve otomasyon.
- Dezavantajlar: Yönetilecek iki ayrı katman olması, başlangıçta biraz daha karmaşık gelebilir. Ancak bu karmaşıklık, sağladığı esnekliğin yanında göz ardı edilebilir.
- Ne zaman tercih edilir: Çoğu homelab kullanıcısı için en mantıklı ve esnek yaklaşım budur. Farklı servisleri farklı VM’lerde izole etmek, sonra bu VM’lerin içinde Docker ile uygulamaları izole etmek, hem güvenlik hem de yönetim kolaylığı açısından büyük avantaj sağlar. Örneğin, bir VM’i sadece web servisleri için ayırıp içinde Nginx, Caddy gibi reverse proxy’leri Docker ile çalıştırırken, başka bir VM’i veritabanları için ayırıp PostgreSQL veya Redis’i Docker içinde çalıştırabilirsiniz.
Pratik Bir Homelab Kurulum Örneği ve Benim Yaklaşımım
Homelab kurulumuna başlarken benim izlediğim yol genellikle şu şekilde oluyor:
-
Fiziksel Sunucuya Proxmox Kurulumu: İlk adım, fiziksel sunucuma Proxmox VE’yi kurmaktır. Kurulum esnasında disk yapılandırmasına dikkat ederim. Genellikle işletim sistemi için küçük bir SSD, VM’ler ve container’lar için daha büyük, hızlı bir disk (NVMe veya SSD) ve arşiv/yedekler için HDD havuzu kullanırım. Kurulum sonrası Proxmox web arayüzüne erişip temel ayarları (ağ, depolama) yaparım.
-
Temel Linux VM Oluşturma: Genellikle bir veya iki adet “ana” Linux sanal makinesi (VM) oluştururum. Benim tercihim genellikle Debian veya Ubuntu Server LTS sürümleri olur. Bu VM’leri, Proxmox arayüzünden oluştururken yeterli CPU çekirdeği (2-4), RAM (4-8 GB) ve disk alanı (50-100 GB) ayırırım. Bu VM’ler, ileride üzerinde Docker Engine çalıştıracağım “ana bilgisayarlar” olacaktır. Örneğin, benim “backend-vm” adını verdiğim bir VM’im var.
-
VM İçine Docker Engine Kurulumu: Oluşturduğum Linux VM’ine SSH ile bağlanır ve standart adımları takip ederek Docker Engine’i kurarım.
# Ubuntu/Debian üzerinde Docker kurulumu sudo apt update sudo apt install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo \ "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo usermod -aG docker $USER # Kullanıcınızı docker grubuna ekleyinBu adımları tamamladıktan sonra VM’i yeniden başlatıp Docker’ın çalıştığını
docker run hello-worldkomutuyla kontrol ederim. -
Uygulamaları Docker Compose ile Dağıtma: Artık Linux VM’im içinde Docker çalışmaya hazır. Uygulamalarımı (Nginx, PostgreSQL, Redis, kendi geliştirdiğim servisler) Docker Compose dosyalarıyla yönetirim. Örneğin, kendi blog sitemin backend’i ve veritabanı için basit bir
docker-compose.yamldosyası kullanıyorum.# Basit bir docker-compose.yaml örneği version: '3.8' services: web: image: my-blog-app:latest ports: - "8000:8000" depends_on: - db environment: DATABASE_URL: postgresql://user:password@db:5432/mydb db: image: postgres:14 environment: POSTGRES_DB: mydb POSTGRES_USER: user POSTGRES_PASSWORD: password volumes: - db_data:/var/lib/postgresql/data volumes: db_data:Bu dosyayı VM içine atıp
docker compose up -dkomutuyla tüm servisleri tek komutla ayağa kaldırırım.
Bu katmanlı yaklaşım bana esneklik sağlıyor. Diyelim ki bir gün “backend-vm” üzerindeki disk alanı yetersiz kaldı veya performansı düşmeye başladı. Proxmox arayüzünden o VM’e daha fazla disk veya CPU/RAM atayabilirim. Ya da tamamen yeni bir VM oluşturup Docker Compose stack’imi oraya taşıyabilirim. Bu geçiş, fiziksel sunucuyu yeniden kurmaktan veya tüm uygulamaları tek tek yeniden yapılandırmaktan çok daha hızlı ve güvenli olur.
Sık Yapılan Hatalar ve Benim Ders Çıkardıklarım
Homelab yolculuğumda hem Proxmox hem de Docker tarafında birçok hata yaptım, ancak her birinden değerli dersler çıkardım.
-
Proxmox’ta Disk Alanı Yönetimi: Başlangıçta, Proxmox’a kurduğum diskleri çok basitçe bölüyordum. Örneğin, tek bir büyük LVM-thin havuzu oluşturup tüm VM’leri oraya yığıyordum. Ancak zamanla bu durum performans darboğazlarına yol açtı. Özellikle veritabanı gibi I/O yoğun servisler için aynı havuzdaki diğer VM’ler sorun yaratabiliyordu. Artık, Proxmox’ta işletim sistemi için ayrı, VM’ler için SSD tabanlı ayrı bir depolama, yedekler için ise HDD tabanlı farklı bir depolama kullanıyorum. Hatta kritik VM’ler için direkt LVM-thin yerine
rawformatında diskler oluşturup performansı optimize etmeye çalışıyorum. Birkaç yıl önce Redis cache’imin yavaşladığını fark ettim ve bunun nedeninin aynı disk havuzundaki yoğun çalışan bir diğer VM olduğunu anladım. O VM’i ayrı bir diske taşıyınca Redis performansı %40 arttı. -
Docker Container Ağ İzolasyonu: Docker container’ları varsayılan olarak
bridgeağı üzerinden birbirleriyle iletişim kurabilirler. Ancak bazen bu yeterli olmuyor veya güvenlik riskleri doğurabiliyor. Örneğin, bir veritabanı container’ını sadece belirli bir uygulama container’ının erişebileceği şekilde izole etmek isteyebilirsiniz. Başlangıçta tüm container’ları tek bir ağa koyuyordum, ancak bir güvenlik denetiminde bunun riskli olduğu ortaya çıktı. Şimdi, her uygulama stack’i için ayrı bir Docker network’ü tanımlıyorum.# Docker Compose ile özel ağ tanımlama version: '3.8' services: web: image: my-app:latest networks: - app_network db: image: postgres:14 networks: - app_network networks: app_network: driver: bridge # İsterseniz IP aralığı da belirtebilirsiniz # ipam: # config: # - subnet: 172.20.0.0/24Bu sayede,
webvedbservisleri sadeceapp_networküzerinden konuşur, diğer Docker ağlarındaki container’larla doğrudan iletişim kuramazlar. -
Kaynak Limitleri ve OOM-Killed Sorunları: Docker container’larına kaynak limitleri (CPU, RAM) tanımlamayı ilk başlarda ihmal ediyordum. Özellikle kendi yan ürünlerimin backend’inde, bellek sızıntısı olan bir geliştirme aşamasında, bir container tüm VM’in RAM’ini tüketip
OOM-killedolabiliyordu. Bu da diğer çalışan servisleri de etkiliyordu. Artık her kritik container içinresources.limitsveresources.reservationstanımlamayı alışkanlık haline getirdim.# Docker Compose ile kaynak limitleri belirleme version: '3.8' services: my_service: image: my-image:latest deploy: resources: limits: memory: 512M # Maksimum 512MB RAM kullanabilir cpus: '0.5' # Maksimum 0.5 CPU çekirdeği kullanabilir reservations: memory: 128M # Her zaman en az 128MB RAM ayrılırBu limitler, bir container’ın kontrolden çıkıp tüm sistemi etkilemesini engeller ve sistemin genel stabilitesini artırır. Geçen ay bir raporlama servisi, beklenenden çok daha fazla veri işleyince RAM limitini aşıp OOM-killed oldu. Limitler sayesinde diğer servislerim çalışmaya devam etti, sadece raporlama servisi durdu ve kolayca yeniden başlatabildim.
Sonuç: Homelab Macerasına Başlarken Doğru Bakış Açısı
Homelab macerasına başlarken “Proxmox mu Docker mı?” sorusu, aslında “fiziksel donanımımı nasıl bölmeliyim ve uygulamalarımı nasıl izole etmeliyim?” sorusunun bir yansımasıdır. Net pozisyonum şudur: Bu iki teknoloji rakip değildir, aksine birbirini tamamlayan katmanlardır ve çoğu homelab senaryosunda birlikte kullanılması en verimli çözümü sunar.
Eğer tek bir fiziksel sunucunuz varsa, Proxmox ile başlayarak donanımınızı sanal makinelere veya LXC’lere bölmek, size en yüksek esnekliği ve izolasyonu sağlayacaktır. Daha sonra bu sanal makinelerin içine Docker Engine kurarak uygulamalarınızı container’lar halinde izole edebilir, kolayca dağıtabilir ve yönetebilirsiniz. Bu katmanlı yaklaşım, hem farklı işletim sistemlerini çalıştırma ihtiyacınızı karşılar hem de uygulama geliştirme ve dağıtım süreçlerinizi modernize eder.
Unutmayın, teknoloji dünyasında “ya o ya bu” çoğu zaman yanlış bir ikilemdir. Önemli olan, her aracın ne işe yaradığını anlamak ve ihtiyaçlarınıza göre en doğru kombinasyonu oluşturmaktır. Benim homelab’imde ve birçok iş ortamında bu hibrit yapı, bana yıllardır büyük faydalar sağladı. Bir sonraki adımda, kurduğunuz bu Proxmox-Docker homelab’i nasıl daha güvenli hale getireceğinizi veya Kubernetes ile nasıl ölçekleyeceğinizi konuşabiliriz.