Sanallaştırma dünyasında VM’ler (sanal makineler) uzun yıllar boyunca tartışmasız hakimdi. Ancak son birkaç yılda konteyner teknolojisi hem geliştirici hem de sistem yöneticisi tarafında ciddi bir yer edindi. Docker’ı muhtemelen duymuşsunuzdur, belki kullanıyorsunuzdur da. Peki LXC nedir ve neden Proxmox ortamlarında bu kadar sık tercih edilir? Bu yazıda LXC konteynerlerini sıfırdan anlayıp, kurulum ve günlük yönetim konularını elimizden geldiğince pratik bir şekilde ele alacağız.
LXC Nedir ve VM’den Farkı Ne?
LXC (Linux Containers), Linux çekirdeğinin sunduğu cgroups ve namespaces özelliklerini kullanarak izole edilmiş uygulama ortamları oluşturan bir konteyner teknolojisidir. Temelde tek bir Linux çekirdeği üzerinde birden fazla izole kullanıcı alanı çalıştırmanıza olanak tanır.
Bunu biraz somutlaştıralım. Bir VM çalıştırdığınızda şunlar olur: Hypervisor sanal donanım emüle eder, konuk işletim sistemi bu sanal donanım üzerinde tam bir çekirdek başlatır ve ancak ondan sonra uygulamalarınız çalışmaya başlar. Bu süreç hem kaynak açısından hem de başlangıç süresi açısından maliyetlidir.
LXC konteynerlerinde ise durum çok farklıdır. Konuk sistem, ana makinenin çekirdeğini paylaşır. Kendi init sistemi çalıştırır, kendi ağ arayüzlerine sahiptir, kendi dosya sistemine sahiptir, ama çekirdek seviyesinde ana makineyle ortak bir zemin kullanır. Bu sayede:
- Başlangıç süresi saniyelerin altına iner
- RAM tüketimi dramatik şekilde düşer (200MB RAM ile tam bir Ubuntu ortamı ayağa kalkar)
- Disk kullanımı minimuma iner
- CPU overhead neredeyse sıfırdır
Docker ile kıyaslamak gerekirse, LXC daha çok “hafif bir sanal makine” gibi davranır. Docker tek bir uygulama çalıştırmak için tasarlanmışken, LXC tam bir işletim sistemi ortamı sunar. İçine SSH açar, birden fazla servis kurarsınız, cron job’larınız çalışır. Proxmox ortamında bu özellikle anlamlıdır çünkü küçük servisler için ayrı VM ayağa kaldırmak yerine, çok daha hafif LXC konteynerlerini kullanabilirsiniz.
Proxmox’ta LXC Altyapısı
Proxmox, LXC’yi birinci sınıf vatandaş olarak destekler. Web arayüzünden birkaç tıklamayla konteyner oluşturabilirsiniz, ancak CLI üzerinden yönetmek çok daha hızlı ve tekrarlanabilirdir.
Proxmox’ta LXC yönetimi için kullanılan temel araç pct (Proxmox Container Toolkit) komutudur. Bu komut ile konteyner oluşturma, silme, başlatma, durdurma ve yapılandırma işlemlerini yapabilirsiniz.
Önce sisteminizde mevcut şablonları görelim:
pveam list local
Eğer henüz şablon indirmediyseniz, mevcut şablonlara şöyle bakabilirsiniz:
pveam available | grep -i ubuntu
pveam available | grep -i debian
pveam available | grep -i alpine
Beğendiğiniz bir şablonu indirmek için:
pveam download local ubuntu-22.04-standard_22.04-1_amd64.tar.zst
İndirme işlemi tamamlandıktan sonra şablon local storage’ınızdaki template dizinine yerleşir ve kullanıma hazır hale gelir.
İlk LXC Konteynerinizi Oluşturmak
Temel bir konteyner oluşturma komutu şöyle görünür:
pct create 101 local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst
--hostname webserver
--memory 512
--swap 512
--cores 2
--rootfs local-lvm:8
--net0 name=eth0,bridge=vmbr0,ip=192.168.1.101/24,gw=192.168.1.1
--nameserver 8.8.8.8
--password SuperGizliSifre123
--unprivileged 1
--start 1
Bu komutu biraz açalım:
- 101: Konteyner ID’si, Proxmox’ta her VM ve CT’nin benzersiz bir ID’si olmalı
- local:vztmpl/…: Kullanılacak şablon
- –hostname: Konteynerin host adı
- –memory: MB cinsinden RAM miktarı
- –swap: MB cinsinden swap alanı
- –cores: Atanacak CPU çekirdek sayısı
- –rootfs: Disk depolama alanı ve boyutu
- –net0: Ağ yapılandırması
- –unprivileged 1: Güvenlik açısından kritik, ayrıcalıksız mod
- –start 1: Oluşturulduktan hemen sonra başlat
Unprivileged mod hakkında bir not: Üretim ortamlarında neredeyse her zaman --unprivileged 1 kullanmalısınız. Bu mod, konteyner içindeki root kullanıcısını ana sistemin root’u ile eşitlemiyor. Güvenlik açısından çok önemli bir fark.
Konteyner Yönetimi: Günlük Operasyonlar
Temel Konteyner Komutları
Proxmox’taki konteynerleri listelemek için:
pct list
Bu komut size tüm konteynerlerin ID’sini, durumunu, ismini ve diğer temel bilgileri gösterir.
Konteyner başlatmak, durdurmak ve yeniden başlatmak:
# Başlat
pct start 101
# Durdur (graceful shutdown)
pct shutdown 101
# Zorla durdur
pct stop 101
# Yeniden başlat
pct reboot 101
# Durum kontrolü
pct status 101
Konteyner içine girmek için iki yöntem var. Birincisi doğrudan konsola bağlanmak:
pct enter 101
İkincisi exec kullanmak (script otomasyonu için çok kullanışlı):
pct exec 101 -- bash -c "apt update && apt upgrade -y"
Konteyner Yapılandırmasını Görüntülemek ve Değiştirmek
Bir konteynerin mevcut yapılandırmasını görmek için:
pct config 101
Çalışan bir konteynerin RAM’ini artırmak isterseniz (reboot gerekmez):
pct set 101 --memory 1024
CPU çekirdek sayısını değiştirmek:
pct set 101 --cores 4
Yeni bir ağ arayüzü eklemek:
pct set 101 --net1 name=eth1,bridge=vmbr1,ip=10.0.0.101/24
Disk Yönetimi
Mevcut disk boyutunu artırmak (küçültme desteklenmez):
pct resize 101 rootfs 20G
Konteyner içinde bu değişikliği görmek için konteynere girip kontrol edebilirsiniz:
pct enter 101
df -h
Snapshot ve Backup İşlemleri
Bu konu sistem yöneticileri için kritik öneme sahip. LXC konteynerleri snapshot almayı ve geri yüklemeyi çok kolaylaştırır.
Snapshot Almak
# Snapshot al
pct snapshot 101 temiz-kurulum --description "Apache kurulmadan onceki temiz hal"
# Mevcut snapshotları listele
pct listsnapshot 101
# Snapshot'a geri dön
pct rollback 101 temiz-kurulum
# Snapshot sil
pct delsnapshot 101 temiz-kurulum
Snapshot özelliği özellikle şu senaryolarda hayat kurtarır: Bir sunucu uygulaması kuracaksınız ama sonuçtan emin değilsiniz. Önce snapshot alın, kurulumu yapın, bir şeyler ters giderse tek komutla eski halinize dönün.
Backup Almak
Proxmox’un kendi backup sistemi olan vzdump ile yedekleme yapmak:
# Tek bir konteyner yedekle
vzdump 101 --storage local --compress zstd --mode snapshot
# Birden fazla konteyner yedekle
vzdump 101 102 103 --storage backup-storage --compress zstd
# Tüm konteynerleri yedekle
vzdump --all --storage local --compress zstd
Yedekten geri yükleme işlemi:
pct restore 101 /var/lib/vz/dump/vzdump-lxc-101-2024_01_15-03_00_00.tar.zst
--storage local-lvm
--rootfs local-lvm:8
Gerçek Dünya Senaryosu: Nginx Web Sunucusu Kurulumu
Teoriden çıkıp pratik bir senaryo üzerinden gidelim. Küçük bir web uygulaması için LXC konteyner ayağa kaldıralım.
# Konteyner oluştur
pct create 200 local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst
--hostname nginx-web
--memory 256
--cores 1
--rootfs local-lvm:5
--net0 name=eth0,bridge=vmbr0,ip=192.168.1.200/24,gw=192.168.1.1
--nameserver 8.8.8.8
--unprivileged 1
# Başlat
pct start 200
# İçine gir ve nginx kur
pct exec 200 -- bash -c "
apt update -qq &&
apt install -y nginx &&
systemctl enable nginx &&
systemctl start nginx
"
# Nginx durumunu kontrol et
pct exec 200 -- systemctl status nginx
Bu kadar. 256MB RAM kullanan, 5GB disk alanı olan, saniyeler içinde ayağa kalkan bir Nginx sunucunuz var. Aynı işlemi bir VM ile yaptığınızda minimum 1-2GB RAM ve en az 20GB disk harcarsınız.
Birden Fazla Konteyner ile Servis Mimarisi
Gerçek dünya senaryolarında genellikle şöyle bir yapı kurarsınız:
- CT 200: Nginx (reverse proxy, 256MB RAM)
- CT 201: Uygulama sunucusu (1GB RAM)
- CT 202: MariaDB (512MB RAM)
- CT 203: Redis (128MB RAM)
Bu yapıyı VM’lerle kurduğunuzda toplamda 10-15GB RAM harcarsınız. LXC ile aynı yapıyı 2GB RAM’in altında çalıştırabilirsiniz. Küçük bir Proxmox sunucusunda bu fark devasa bir anlam ifade eder.
Ağ Yapılandırması ve Güvenlik Duvarı
Proxmox’ta LXC konteynerleri için ağ yapılandırması genellikle bridge üzerinden yapılır. Bir konteynerin ağ ayarlarını değiştirmek için:
# Mevcut ağ yapılandırmasını gör
pct config 200 | grep net
# Statik IP'yi değiştir (durdurulmuş konteyner üzerinde)
pct set 200 --net0 name=eth0,bridge=vmbr0,ip=192.168.1.205/24,gw=192.168.1.1
Proxmox’un dahili güvenlik duvarını LXC konteyneri için aktif etmek ve kural eklemek de oldukça basit. Web arayüzünden yapabileceğiniz gibi, yapılandırma dosyasını doğrudan düzenleyebilirsiniz:
# Konteyner için firewall kuralı dosyası
cat /etc/pve/firewall/200.fw
# Örnek kural ekleme (HTTP ve HTTPS izin ver)
cat >> /etc/pve/firewall/200.fw << 'EOF'
[RULES]
IN ACCEPT -p tcp --dport 80
IN ACCEPT -p tcp --dport 443
EOF
Kaynak Sınırlamaları ve Performans Tuning
LXC’nin güçlü yanlarından biri, cgroups aracılığıyla kaynak sınırlamalarını çok ince bir şekilde ayarlayabilmenizdir.
CPU Limitleme
# CPU kullanımını %50 ile sınırla (1 core = 100)
pct set 201 --cpulimit 0.5
# CPU önceliğini ayarla (1-8192 arası, varsayılan 1024)
pct set 201 --cpuunits 512
–cpulimit: Konteynerin maksimum kullanabileceği CPU miktarı. 0.5 değeri, toplam CPU kapasitesinin yarısı anlamına gelir.
–cpuunits: Yük altında CPU paylaşımını belirler. Düşük değer = düşük öncelik.
Memory Limiting
# RAM ve swap sınırı belirle
pct set 201 --memory 1024 --swap 0
# Mevcut kaynak kullanımını izle
pct exec 201 -- free -h
Disk I/O Sınırlama
Özellikle yoğun disk kullanan konteynerlerin diğerlerini etkilememesi için:
# Read ve write hızını MB/s cinsinden sınırla
pct set 202 --rootfs local-lvm:20,mbps_rd=50,mbps_wr=30
Konteyner Şablonu Oluşturmak
Sık kullandığınız bir yapılandırmanız varsa (örneğin her web sunucusunda aynı paketleri kuruyorsunuz), bu yapıyı şablon haline getirebilirsiniz.
# Temel bir konteyner hazırla ve içini doldurup kur
pct enter 101
# İçinde gerekli işlemleri yap
apt update && apt install -y curl wget vim htop net-tools
# Temizlik yap
apt autoremove -y && apt clean
history -c
exit
# Konteyneri durdur
pct stop 101
# Şablona dönüştür
vzdump 101 --dumpdir /var/lib/vz/template/cache/ --compress zstd
Artık bu backup dosyasını şablon olarak kullanarak yeni konteynerler oluşturabilirsiniz. Bu sayede her seferinde aynı paketleri kurmak zorunda kalmazsınız.
Günlük İzleme ve Sorun Giderme
Bir sistem yöneticisi olarak konteynerlerin sağlığını takip etmek zorundasınız. İşte günlük hayatta kullandığım bazı yöntemler:
# Tüm konteynerlerin kaynak kullanımını göster
for ct in $(pct list | awk 'NR>1 {print $1}'); do
echo "=== CT $ct ==="
pct exec $ct -- bash -c "free -h | grep Mem; df -h / | tail -1" 2>/dev/null
done
# Belirli bir konteynerin loglarına bak
pct exec 101 -- journalctl -n 50 --no-pager
# Konteyner yapılandırma dosyasına doğrudan bak
cat /etc/pve/lxc/101.conf
Proxmox’ta konteyner log dosyaları /var/log/lxc/ altında bulunur. Bir konteyner başlamıyorsa ilk bakacağınız yer burası olmalı:
cat /var/log/lxc/101.log
Yaygın Sorunlar ve Çözümleri
Konteyner başlamıyor: İlk olarak ID’yi ve storage durumunu kontrol edin.
pct start 101 --debug
pvesm status
İçeriden dışarıya çıkılamıyor: DNS ve gateway yapılandırmasını kontrol edin.
pct exec 101 -- ping -c 3 8.8.8.8
pct exec 101 -- cat /etc/resolv.conf
Disk doldu: Disk genişletme veya gereksiz dosyaları temizleme gerekiyor.
pct exec 101 -- df -h
pct exec 101 -- du -sh /var/log/*
pct resize 101 rootfs 20G
Otomasyon: Toplu Konteyner Yönetimi
Birden fazla konteyneriniz olduğunda, bazı işlemleri toplu yapma ihtiyacı doğar. İşte birkaç pratik script:
#!/bin/bash
# Tüm çalışan konteynerleri güncelle
RUNNING_CTS=$(pct list | awk 'NR>1 && $2=="running" {print $1}')
for CT_ID in $RUNNING_CTS; do
CT_NAME=$(pct config $CT_ID | grep hostname | awk '{print $2}')
echo "[$CT_ID] $CT_NAME guncelleniyor..."
# Debian/Ubuntu tabanlı konteynerler için
pct exec $CT_ID -- bash -c "apt update -qq && apt upgrade -y -qq" 2>/dev/null
if [ $? -eq 0 ]; then
echo "[$CT_ID] $CT_NAME - Guncelleme basarili"
else
echo "[$CT_ID] $CT_NAME - Guncelleme hatasi veya apt desteklenmiyor"
fi
done
echo "Tum guncellemeler tamamlandi."
Bu scripti cron job olarak her hafta çalıştırırsanız, tüm konteynerleriniz otomatik olarak güncel kalır.
LXC mi Docker mi? Hangisini Seçmeliyim?
Bu soruyu çok sık alıyorum. Kısa cevap: ikisi farklı problemleri çözer ve birbirini dışlamaz.
LXC’yi tercih edin eğer:
- Tam bir işletim sistemi ortamı istiyorsanız
- Birden fazla servis aynı konteynerde çalışacaksa
- SSH ile direkt bağlantı gerekiyorsa
- Systemd ile servis yönetimi yapılacaksa
- Mevcut VM iş yüklerini hafifletmek istiyorsanız
Docker’ı tercih edin eğer:
- Tek bir uygulama veya mikroservis çalıştıracaksanız
- CI/CD pipeline’ı inşa ediyorsanız
- Uygulama bağımlılıklarını paketlemek istiyorsanız
- Kubernetes veya swarm ortamına geçiş planınız varsa
Proxmox ortamında ikisini birlikte kullanmak da yaygın bir yaklaşımdır. Docker’ı bir LXC konteynerinin içinde çalıştırabilirsiniz (privileged mod gerektirir) ya da Docker’ı ayrı bir VM üzerinde, LXC konteynerlerini ise hafif servisler için kullanabilirsiniz.
Sonuç
LXC konteynerleri, doğru kullanıldığında Proxmox altyapınızın verimliliğini ciddi ölçüde artırır. Başlangıçta VM’lere alışkın olan sistem yöneticileri için öğrenme eğrisi çok dik değil, ancak zihniyet değişikliği gerektirebilir.
Pratik önerilerim şunlar: Küçük, izole servisler için (DNS sunucusu, monitoring ajanı, küçük web uygulaması, cache sunucusu) hemen LXC’ye geçin. VM’leri gerçekten farklı bir çekirdeğe ihtiyaç duyduğunuzda, Windows çalıştıracağınızda veya donanım sanallaştırması gereken senaryolarda kullanın.
Snapshot özelliğini aktif olarak kullanın. Her önemli değişiklik öncesi snapshot almak, gece yarısı panikle geçireceğiniz saatleri önler. Yedekleme stratejinizi otomatize edin ve geri yüklemeyi düzenli olarak test edin.
Kaynak sınırlamalarını ihmal etmeyin. Bir konteyner kontrolsüzce büyürse diğerlerini etkileyebilir. --cpulimit ve --memory parametrelerini bilinçli kullanın.
Son olarak, LXC’yi bir kez gerçek bir projede kullandığınızda, neden bu kadar çok sysadmin’in VM’lerden LXC’ye geçtiğini anlayacaksınız. Hız, verimlilik ve yönetim kolaylığı açısından sunduğu avantajlar tartışmasız.