Kısa cevap: Bir VDS üzerinde Docker kurulumu üç adımdır: resmî depoyu ekle, docker-ce ve compose eklentisini kur, kullanıcını docker grubuna al. CI/CD tarafında ise en pratik yol, sunucuda bir runner çalıştırıp deploy adımını compose pull ve compose up ile yürütmektir. Aşağıda sıra ve atlanmaması gereken güvenlik ayarları var.

Paylaşımlı hostingte bunların hiçbiri yapılamaz, çünkü sisteme yazılım kuramazsınız. VDS'in getirdiği root erişimi tam olarak bu senaryo içindir.

1. Sunucuyu hazırla

Kurulum öncesi iki şey: sistemi güncelleyin ve SSH erişimini anahtara çevirin. Şifreyle SSH açık bırakmak, Docker ile servis yayınlayan bir sunucuda en yaygın ele geçirilme yoludur.

SSH anahtarı kurulumunu SSH anahtarı ile sunucuya bağlanma yazısında adım adım anlattık. Anahtar çalıştığını doğrulamadan şifre girişini kapatmayın, yoksa kendinizi dışarıda bırakırsınız.

2. Docker kurulumu

Dağıtımın kendi deposundaki Docker paketi genelde geride kalır. Resmî depoyu eklemek, güncel sürüm ve compose eklentisi için gereklidir.

Ubuntu ve Debian'da sıra şöyledir: gerekli sertifika paketlerini kurun, Docker'ın GPG anahtarını ekleyin, depo tanımını yazın, ardından docker-ce, docker-ce-cli, containerd.io ve docker-compose-plugin paketlerini kurun.

Kurulum sonrası kendinizi docker grubuna ekleyin ve oturumu yeniden açın. Bu adımı atlarsanız her komutta sudo yazmak zorunda kalırsınız.

Bir uyarı: docker grubuna eklenen kullanıcı pratikte root yetkisine sahiptir, çünkü konteyner içinden ana sistemin dosya sistemine erişebilir. Bu grubu yalnızca gerçekten gereken hesaplara verin.

3. Compose ile servisleri tanımlayın

Tek tek docker run komutlarıyla servis çalıştırmak ilk gün pratik görünür, ikinci ayda hangi konteynerin hangi parametreyle çalıştığını hatırlamazsınız. compose.yml dosyası bu sorunu çözer: tüm servisler, portlar, birimler ve ortam değişkenleri tek dosyada durur.

Dosyayı sürüm kontrolüne alın ama ortam değişkenlerini içine yazmayın. Şifreler ve API anahtarları ayrı bir .env dosyasında dursun ve o dosya depoya girmesin.

4. Ters vekil sunucu koyun

Konteynerlerin portlarını doğrudan dışarıya açmak yerine önlerine bir ters vekil sunucu (reverse proxy) koyun. Bunun üç faydası var: tek yerden SSL yönetimi, birden fazla servisi tek IP üzerinden yayınlama, ve konteyner portlarını dış dünyaya kapatma.

Nginx ya da Caddy bu iş için yeterlidir. SSL sertifikasını vekil sunucu üzerinde sonlandırırsanız her konteyner için ayrı sertifika yönetmeniz gerekmez.

5. CI/CD zincirini kurun

Amaç şudur: kodu depoya gönderdiğinizde imaj derlenip sunucuya kendiliğinden dağıtılsın. Pratik kurulum şöyle işler:

İmajı CI tarafında derleyin. Derleme işini sunucuda yapmak, üretim sunucusunun kaynağını derleme için harcamak demektir. Derlemeyi CI ortamında yapıp hazır imajı bir kayıt defterine (registry) gönderin.

Sunucuda yalnızca çekin ve başlatın. Deploy adımı iki komuttan oluşur: yeni imajı çek, servisleri yeniden başlat. Bu, sunucudaki iş yükünü minimumda tutar.

Runner'ı sınırlı yetkiyle çalıştırın. CI sisteminin sunucuya root olarak bağlanması gerekmez. Deploy için ayrı bir kullanıcı açıp yalnızca ilgili dizin ve compose komutlarına yetki verin.

Kendi Git sunucunuzu barındırmak istiyorsanız GitLab gereksinimlerini GitLab için sunucu gereksinimleri yazısında listeledik.

Kaynak planlaması

Docker'ın kendisi hafiftir ama çalıştırdığınız servisler değildir. Pratik ölçü şudur: her servis için ayrı bellek payı düşünün ve toplamın üzerine işletim sistemi için pay bırakın.

Derleme işini sunucuda yapacaksanız hesabı ikiye katlayın; derleme anlık olarak yüksek bellek ve CPU tüketir. Bu yüzden derlemeyi CI tarafına almak sadece hız değil kaynak tasarrufudur.

Tek çekirdek hızının bu senaryoda rolü şudur: konteyner sayısı arttıkça çekirdek sayısı öne geçer, ama tek bir servisin yanıt süresi hâlâ çekirdek frekansına bağlıdır. Ayrımı tek çekirdek hızı neden önemli yazısında anlattık.

Bu iş yükü için Ryzen VDS paketlerine bakabilirsiniz; root erişimi tüm paketlerde vardır.

Sık Sorulan Sorular

VDS üzerinde Docker kurabilir miyim?

Evet. VDS root erişimi verdiği için sisteme yazılım kurabilirsiniz. Paylaşımlı hostingte bu mümkün değildir.

Dağıtımın kendi Docker paketini kullanabilir miyim?

Kullanabilirsiniz ama genelde geride kalır ve compose eklentisi eksik olabilir. Resmî depoyu eklemek güncel sürüm için daha güvenlidir.

docker grubuna eklenmek güvenli mi?

Bu grup pratikte root yetkisi verir, çünkü konteyner içinden ana sistemin dosya sistemine erişilebilir. Grubu yalnızca gerçekten gereken hesaplara verin.

Konteyner portlarını doğrudan açmalı mıyım?

Hayır. Önlerine ters vekil sunucu koyun. Böylece SSL'i tek yerden yönetir, birden fazla servisi tek IP üzerinden yayınlar ve konteyner portlarını dış dünyaya kapatırsınız.

İmajı sunucuda mı derlemeliyim?

Hayır. Derleme anlık olarak yüksek bellek ve CPU tüketir; bunu üretim sunucusunda yapmak kaynak israfıdır. İmajı CI ortamında derleyip sunucuda yalnızca çekip başlatın.

CI sisteminin sunucuya root erişimi gerekir mi?

Gerekmez. Deploy için ayrı bir kullanıcı açıp yalnızca ilgili dizin ve compose komutlarına yetki vermek daha güvenlidir.