Ubuntu 22.04 Üzerinde Özel Bir Docker Registry Kurulumu: Kapsamlı Rehber
Docker, uygulamaları kapsayıcılar (containers) içinde paketleyerek dağıtmayı ve çalıştırmayı kolaylaştıran devrim niteliğinde bir teknolojidir. Docker Hub gibi herkese açık registry’ler, milyonlarca Docker imajını barındırır ve kullanıcıların bu imajları kolayca indirip kullanmasına olanak tanır. Ancak, her zaman herkese açık bir registry kullanmak istemeyebilirsiniz. Şirket içi geliştirilen uygulamaların imajları, hassas veriler içeren imajlar veya ağ kısıtlamaları olan ortamlar için özel (private) bir Docker Registry kurmak hayati önem taşır. Bu kapsamlı rehberde, Ubuntu 22.04 sunucusu üzerinde güvenli ve işlevsel bir özel Docker Registry’yi adım adım nasıl kuracağınızı, yapılandıracağınızı ve yöneteceğinizi ele alacağız.
Neden Özel Bir Docker Registry?
Özel bir Docker Registry kullanmanın birçok avantajı vardır:
* Güvenlik ve Gizlilik: Şirketinizin veya projenizin hassas imajlarını halka açık Docker Hub’dan uzakta, kendi kontrolünüz altındaki bir ortamda saklayabilirsiniz. Bu, fikri mülkiyetinizi korumanın ve yetkisiz erişimi engellemenin en iyi yoludur.
* Erişim Kontrolü: Kimlerin imajlarınıza erişebileceğini ve hangi işlemleri (çekme, gönderme, silme) yapabileceğini detaylı bir şekilde kontrol edebilirsiniz.
* Ağ Verimliliği: Özellikle büyük imajlarla veya sık sık imaj çekme/gönderme işlemleriyle çalışıyorsanız, registry’nin kendi yerel ağınızda bulunması ağ trafiğini azaltır ve işlem sürelerini hızlandırır.
* Özelleştirme ve Kontrol: Registry’nin depolama, güvenlik ve ağ yapılandırması üzerinde tam kontrol sahibi olursunuz. Kendi güvenlik politikalarınızı uygulayabilir, özel depolama çözümleri entegre edebilir ve CI/CD süreçlerinize daha iyi entegre edebilirsiniz.
* Bağımsızlık: Harici bir hizmete bağımlılığı ortadan kaldırarak, internet bağlantısı kesintileri veya üçüncü taraf hizmet kesintilerinden etkilenmezsiniz. Hava boşluklu (air-gapped) ortamlar için vazgeçilmezdir.
Bu rehberde, Docker’ın resmi registry imajını kullanarak bir özel registry kuracağız. Bu imaj, Docker topluluğu tarafından aktif olarak desteklenmekte ve birçok esnek yapılandırma seçeneği sunmaktadır.
Ön Koşullar
Başlamadan önce aşağıdaki gereksinimlerin karşılandığından emin olun:
* Ubuntu 22.04 Sunucusu: Temiz bir Ubuntu 22.04 LTS kurulumu önerilir.
* Sudo Yetkileri: Komutları çalıştırmak için sudo yetkisine sahip bir kullanıcı.
* Temel Docker Bilgisi: Docker komutları (pull, push, tag, run) hakkında temel bilgi.
* Alan Adı veya IP Adresi: Registry’nizi HTTPS ile güvenli hale getirmek için bir alan adı (örneğin, registry.example.com) veya sunucunuzun statik bir IP adresi. Bu rehberde hem IP adresi hem de alan adı kullanılabilecektir.
* Açık Portlar: Registry için 5000 numaralı portun (veya tercih ettiğiniz başka bir portun) ve eğer ters proxy kullanacaksanız 80/443 portlarının güvenlik duvarında açık olması.
Docker Kurulumu
Öncelikle, Ubuntu 22.04 sunucunuza Docker Engine’i kurmanız gerekmektedir.
Sistem Güncellemesi ve Gerekli Paketlerin Kurulumu
Sisteminizin güncel olduğundan ve Docker kurulumu için gerekli paketlerin yüklü olduğundan emin olun:
sudo apt update
sudo apt upgrade -y
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
Docker GPG Anahtarını Ekleme
Docker’ın resmi deposundan paketleri güvenli bir şekilde indirmek için GPG anahtarını ekleyin:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Docker Deposunu Ekleme
Sisteminizin apt paket yöneticisine Docker deposunu ekleyin:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Docker Engine Kurulumu
Depo eklendikten sonra, Docker Engine’i ve ilgili bileşenleri kurabilirsiniz:
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
Docker Kurulumunu Doğrulama
Docker’ın doğru bir şekilde kurulup kurulmadığını test etmek için hello-world imajını çalıştırın:
sudo docker run hello-world
Eğer çıktıda “Hello from Docker!” mesajını görüyorsanız, Docker başarıyla kurulmuştur.
Kullanıcıyı Docker Grubuna Ekleme (İsteğe Bağlı ama Önerilir)
sudo komutunu her seferinde kullanmadan Docker komutlarını çalıştırmak için kendi kullanıcınızı docker grubuna ekleyebilirsiniz. Bu işlemi yaptıktan sonra oturumu kapatıp tekrar açmanız veya sistemi yeniden başlatmanız gerekir.
sudo usermod -aG docker $USER
Registry Kurulumu ve Yapılandırması
Şimdi sıra özel Docker Registry’mizi kurmaya geldi. Güvenlik nedeniyle HTTPS ve temel kimlik doğrulama (Basic Auth) kullanacağız.
Temel Registry Çalıştırma (Geliştirme Ortamları İçin)
Üretim ortamları için kesinlikle önerilmese de, registry’yi hızlıca test etmek için HTTPS ve kimlik doğrulama olmadan çalıştırabiliriz. Bu adım, registry’nin temel işlevselliğini anlamanıza yardımcı olacaktır.
docker run -d -p 5000:5000 --restart always --name registry registry:2
Bu komut, registry:2 imajını kullanarak bir Docker kapsayıcısı başlatır, 5000 numaralı portu host makineye eşler ve kapsayıcının her zaman yeniden başlamasını sağlar.
Dikkat: Bu yapılandırma HTTP üzerinden çalıştığı için güvenli değildir ve üretim ortamlarında kullanılmamalıdır.
İstemci Tarafında Güvenli Olmayan Registry Yapılandırması:
Eğer bu şekilde bir registry’yi test ediyorsanız, Docker istemcinizin (yani imajları çekeceğiniz veya göndereceğiniz makine) bu registry’yi güvenli olmayan bir registry olarak tanıması gerekir. Bunun için istemci makinede /etc/docker/daemon.json dosyasını oluşturun veya düzenleyin:
sudo nano /etc/docker/daemon.json
Dosyanın içeriği aşağıdaki gibi olmalıdır (IP adresini kendi registry sunucunuzun IP adresiyle değiştirin):
{
"insecure-registries": ["YOUR_REGISTRY_IP_OR_DOMAIN:5000"]
}
Değişiklikleri kaydettikten sonra Docker servisini yeniden başlatın:
sudo systemctl restart docker
Artık bir imajı çekip etiketleyerek registry’nize gönderebilirsiniz:
docker pull busybox
docker tag busybox YOUR_REGISTRY_IP_OR_DOMAIN:5000/my-busybox
docker push YOUR_REGISTRY_IP_OR_DOMAIN:5000/my-busybox
Bu şekilde çalıştırmak sadece bir test içindir. Şimdi güvenli yapılandırmaya geçelim.
HTTPS ile Güvenli Registry Kurulumu (Önerilen Yöntem)
Üretim ortamları için HTTPS kullanmak zorunludur. Bu, verilerinizin şifrelenmesini ve kimlik doğrulamanın güvenli bir şekilde yapılmasını sağlar. HTTPS için bir SSL/TLS sertifikasına ihtiyacımız var. İki ana seçeneğimiz var:
1. Let’s Encrypt: Ücretsiz, güvenilir sertifikalar sağlar. Bir alan adına ve 80/443 portlarının dışarıdan erişilebilir olmasına ihtiyaç duyar. Genellikle bir ters proxy (Nginx, Caddy) ile birlikte kullanılır. Üretim ortamları için en iyi seçenektir.
2. Kendinden İmzalı (Self-Signed) Sertifikalar: Alan adı gerektirmez, kurulumu daha kolaydır. Ancak, bu sertifikalar varsayılan olarak tarayıcılar veya işletim sistemleri tarafından güvenilmez kabul edilir. Her istemci makinesinde bu sertifikayı manuel olarak güvenilir olarak eklemeniz gerekir. İç ağlardaki geliştirme veya test ortamları için uygundur.
Bu rehberde, kurulumu daha basit olduğu için kendinden imzalı sertifikalarla ilerleyeceğiz. Üretim ortamı için Let’s Encrypt ve bir ters proxy kullanmayı düşünmelisiniz.
Sertifika Oluşturma
Registry sunucunuzda sertifikalarınızı saklamak için bir dizin oluşturalım:
mkdir -p ~/certs
cd ~/certs
Şimdi OpenSSL kullanarak kendinden imzalı bir anahtar ve sertifika oluşturalım. YOUR_REGISTRY_IP_OR_DOMAIN kısmını registry sunucunuzun IP adresi veya alan adıyla değiştirmeyi unutmayın. Sertifika oluştururken “Common Name (CN)” sorulduğunda bu değeri girmeniz çok önemlidir.
openssl req -newkey rsa:4096 -nodes -sha256 -keyout domain.key -x509 -days 365 -out domain.crt
Komutu çalıştırdıktan sonra bazı bilgiler girmeniz istenecektir. Önemli olan “Common Name (CN)” kısmına registry’nize erişmek için kullanacağınız IP adresi veya alan adını (örneğin, 192.168.1.100 veya registry.example.com) girmenizdir. Diğer alanları isteğe bağlı olarak doldurabilirsiniz.
domain.key (özel anahtar) ve domain.crt (genel sertifika) dosyaları ~/certs dizininde oluşturulacaktır.
Registry’yi HTTPS ile Çalıştırma
Önceki güvensiz registry kapsayıcısını durdurup kaldıralım:
docker stop registry
docker rm registry
Şimdi registry’yi HTTPS’yi etkinleştirerek ve oluşturduğumuz sertifikaları kullanarak çalıştıralım:
docker run -d \
-p 5000:5000 \
--restart always \
--name registry \
-v ~/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry:2
Bu komutta:
* -v ~/certs:/certs: Host makinedeki ~/certs dizinini kapsayıcı içindeki /certs dizinine bağlar.
* -e REGISTRY_HTTP_TLS_CERTIFICATE: Sertifika dosyasının kapsayıcı içindeki yolunu belirtir.
* -e REGISTRY_HTTP_TLS_KEY: Anahtar dosyasının kapsayıcı içindeki yolunu belirtir.
İstemci Tarafında Sertifika Yapılandırması
Kendinden imzalı sertifikalar kullandığımız için, imajları çekmek veya göndermek istediğiniz her Docker istemcisinin bu sertifikaya güvenmesi gerekir.
1. Sertifikayı İstemciye Kopyalama:
Registry sunucunuzdaki ~/certs/domain.crt dosyasını Docker istemcisi makinesine kopyalayın. Örneğin, scp kullanarak:
scp ~/certs/domain.crt user@client_ip:/tmp/domain.crt
2. İstemcide Sertifikayı Güvenilir Olarak Ekleme:
İstemci makinede aşağıdaki adımları izleyin:
* Yöntem A: Sistem Geneli Güven:
Sertifikayı sistemin güvenilir sertifikaları arasına ekleyin:
sudo cp /tmp/domain.crt /usr/local/share/ca-certificates/registry.crt
sudo update-ca-certificates
Bu, çoğu Linux sisteminde sertifikanın sistem genelinde güvenilir olmasını sağlar.
* Yöntem B: Docker Özelinde Güven (Önerilir):
Docker’ın belirli bir registry için özel sertifika dizini vardır. Bu, sertifikanın sadece Docker tarafından kullanılmasını sağlar:
sudo mkdir -p /etc/docker/certs.d/YOUR_REGISTRY_IP_OR_DOMAIN:5000
sudo cp /tmp/domain.crt /etc/docker/certs.d/YOUR_REGISTRY_IP_OR_DOMAIN:5000/ca.crt
YOUR_REGISTRY_IP_OR_DOMAIN kısmını sertifikayı oluştururken Common Name olarak kullandığınız IP adresi veya alan adıyla değiştirin.
Her iki yöntemde de, sertifika eklendikten sonra Docker servisini yeniden başlatmanız gerekir:
sudo systemctl restart docker
Artık istemci makineden HTTPS üzerinden imajları çekip gönderebilirsiniz. Unutmayın, YOUR_REGISTRY_IP_OR_DOMAIN kısmını sertifikanızı oluştururken kullandığınız değerle değiştirmelisiniz.
docker pull busybox
docker tag busybox YOUR_REGISTRY_IP_OR_DOMAIN:5000/my-busybox
docker push YOUR_REGISTRY_IP_OR_DOMAIN:5000/my-busybox
Eğer x509: certificate signed by unknown authority gibi bir hata alırsanız, istemci tarafında sertifika kurulumunu tekrar kontrol edin.
Temel Kimlik Doğrulama (Basic Auth) Ekleme
Registry’nize yetkisiz erişimi engellemek için kimlik doğrulama eklemek çok önemlidir. Docker Registry, temel kimlik doğrulama için htpasswd dosyasını destekler.
htpasswd Kurulumu
htpasswd aracı apache2-utils paketinin bir parçasıdır. Registry sunucunuzda bu paketi kurun:
sudo apt install apache2-utils -y
Kullanıcı ve Parola Dosyası Oluşturma
Kimlik doğrulama dosyasını saklamak için bir dizin oluşturalım:
mkdir -p ~/auth
cd ~/auth
Şimdi htpasswd kullanarak bir kullanıcı (örneğin registryuser) ve parola oluşturun. İlk kullanıcıyı oluştururken -c (create) bayrağını kullanın. Daha sonraki kullanıcıları eklerken -b bayrağını kullanın (veya -c kullanmadan sadece -B ile etkileşimli parola girin).
htpasswd -Bc ~/auth/htpasswd registryuser
Komut size bir parola girmenizi isteyecektir. Güçlü bir parola seçin. registryuser yerine istediğiniz bir kullanıcı adını kullanabilirsiniz.
Registry’yi Kimlik Doğrulama ile Çalıştırma
Önceki registry kapsayıcısını durdurup kaldıralım:
docker stop registry
docker rm registry
Şimdi registry’yi hem HTTPS hem de temel kimlik doğrulama ile çalıştırın:
docker run -d \
-p 5000:5000 \
--restart always \
--name registry \
-v ~/certs:/certs \
-v ~/auth:/auth \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry:2
Bu komutta ek olarak:
* -v ~/auth:/auth: Host makinedeki ~/auth dizinini kapsayıcı içindeki /auth dizinine bağlar.
* -e REGISTRY_AUTH=htpasswd: Kimlik doğrulama yöntemini htpasswd olarak ayarlar.
* -e REGISTRY_AUTH_HTPASSWD_REALM: Kimlik doğrulama için bir “realm” adı belirler (isteğe bağlı).
* -e REGISTRY_AUTH_HTPASSWD_PATH: htpasswd dosyasının kapsayıcı içindeki yolunu belirtir.
Kimlik Doğrulamayı Test Etme
Şimdi bir Docker istemcisinden registry’nize giriş yapmayı deneyin:
docker login YOUR_REGISTRY_IP_OR_DOMAIN:5000
registryuser kullanıcı adını ve oluşturduğunuz parolayı girmeniz istenecektir. Başarılı bir şekilde giriş yaptıktan sonra, imajları çekip gönderebilirsiniz.
docker pull alpine
docker tag alpine YOUR_REGISTRY_IP_OR_DOMAIN:5000/my-alpine
docker push YOUR_REGISTRY_IP_OR_DOMAIN:5000/my-alpine
Eğer authentication required hatası alırsanız, kullanıcı adınızı, parolanızı ve htpasswd dosyasının doğru yapılandırıldığını kontrol edin.
Yönetim ve Bakım
Özel Docker Registry’nizi kurduktan sonra, imajları yönetmek ve bazı bakım görevlerini gerçekleştirmek isteyebilirsiniz.
İmajları Listeleme
Registry’nizde hangi imajların bulunduğunu görmek için Docker Registry API’sini kullanabilirsiniz. Kimlik doğrulama gerektiren bir registry için kullanıcı adınızı ve parolanızı belirtmeniz gerekir:
curl -u registryuser:password https://YOUR_REGISTRY_IP_OR_DOMAIN:5000/v2/_catalog
Belirli bir imajın etiketlerini (tag’lerini) listelemek için:
curl -u registryuser:password https://YOUR_REGISTRY_IP_OR_DOMAIN:5000/v2/my-alpine/tags/list
registryuser:password kısmını kendi kimlik bilgilerinizle değiştirmeyi unutmayın.
İmajları Silme
Varsayılan olarak, Docker Registry’den imajları silme özelliği devre dışıdır. Bunu etkinleştirmek için registry’yi yeniden yapılandırmanız gerekir.
1. Silme Özelliğini Etkinleştirme:
Registry kapsayıcısını durdurup kaldırın ve REGISTRY_STORAGE_DELETE_ENABLED=true ortam değişkenini ekleyerek yeniden başlatın:
docker stop registry
docker rm registry
docker run -d \
-p 5000:5000 \
--restart always \
--name registry \
-v ~/certs:/certs \
-v ~/auth:/auth \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-e REGISTRY_STORAGE_DELETE_ENABLED=true \
registry:2
2. İmajı Silme (Manifest Digest ile):
Bir imajı silmek için, o imajın manifest digest’ine ihtiyacınız vardır. Öncelikle imajın manifest’ini inceleyin:
docker manifest inspect YOUR_REGISTRY_IP_OR_DOMAIN:5000/my-alpine
Çıktıda Digest alanını bulun (örneğin, sha256:xxxxxxxxxx). Bu digest değerini kullanarak imajı silebilirsiniz:
curl -v -u registryuser:password -X DELETE \
https://YOUR_REGISTRY_IP_OR_DOMAIN:5000/v2/my-alpine/manifests/sha256:xxxxxxxxxx
3. Çöp Toplama (Garbage Collection):
Bir imajı sildikten sonra, disk alanını geri kazanmak için çöp toplama (garbage collection) işlemi yapmanız gerekir. Bu işlem, silinen imajlara ait katmanları (layers) fiziksel olarak diskten kaldırır.
Önemli: Çöp toplama işlemi sırasında registry’nin durdurulması önerilir. Aksi takdirde veri bozulması riski olabilir.
docker stop registry
docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml
docker start registry
Eğer registry’yi durdurmak mümkün değilse ve depolama backend’iniz eşzamanlı erişime izin veriyorsa, --force bayrağını kullanabilirsiniz, ancak bu riskli olabilir:
docker exec registry bin/registry garbage-collect --force /etc/docker/registry/config.yml
Depolama Alanı (Storage) Yapılandırması
Varsayılan olarak, Docker Registry imajları kapsayıcı içinde /var/lib/registry dizinine depolar. Ancak, kapsayıcı silindiğinde verilerin kaybolmaması ve daha iyi yönetim için harici bir birim (volume) bağlamak en iyi uygulamadır.
Mevcut registry kapsayıcısını durdurup kaldırın:
docker stop registry
docker rm registry
Şimdi registry’yi harici bir birim ile çalıştırın. Örneğin, host makinede /data/registry dizinini kullanmak için:
sudo mkdir -p /data/registry
docker run -d \
-p 5000:5000 \
--restart always \
--name registry \
-v /data/registry:/var/lib/registry \
-v ~/certs:/certs \
-v ~/auth:/auth \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-e REGISTRY_STORAGE_DELETE_ENABLED=true \
registry:2
Bu komutta -v /data/registry:/var/lib/registry kısmı, host makinedeki /data/registry dizinini registry kapsayıcısının depolama dizinine bağlar. Artık imaj verileriniz host makinede kalıcı olarak saklanacaktır.
Docker Registry, yerel dosya sisteminin yanı sıra Amazon S3, Azure Blob Storage, Google Cloud Storage gibi bulut depolama çözümlerini de destekler. Bu, özellikle yüksek erişilebilirlik ve ölçeklenebilirlik gerektiren üretim ortamları için faydalıdır. Bu depolama çözümlerini kullanmak için ek ortam değişkenleri veya yapılandırma dosyaları gereklidir.
Yedekleme ve Geri Yükleme
Registry verilerinizi yedeklemek, herhangi bir felaket durumunda imajlarınızı kaybetmemenizi sağlar.
Yedekleme:
Registry’nizi durdurun ve depolama dizinini (örneğin, /data/registry) sıkıştırarak başka bir konuma kopyalayın:
docker stop registry
sudo tar -czvf registry_backup_$(date +%Y%m%d%H%M%S).tar.gz /data/registry
docker start registry
Geri Yükleme:
Yeni bir sunucuya geri yüklemek için:
1. Yeni sunucuya Docker’ı kurun.
2. Registry kapsayıcısını yukarıdaki gibi harici bir birimle (örneğin, /data/registry) çalıştırın.
3. Registry’yi durdurun (docker stop registry).
4. Yedeklediğiniz .tar.gz dosyasını /data/registry dizinine açın.
5. Registry’yi başlatın (docker start registry).
Güvenlik İpuçları ve En İyi Uygulamalar
Özel bir Docker Registry kurmak, güvenlik sorumluluğunuzu artırır. İşte bazı ek güvenlik ipuçları:
* Her Zaman HTTPS Kullanın: HTTP üzerinden asla hassas imajları aktarmayın. Kendinden imzalı sertifikalar yerine, mümkünse Let’s Encrypt gibi güvenilir bir CA’dan sertifika alın.
* Güçlü Kimlik Doğrulama: htpasswd kullanıyorsanız, güçlü ve benzersiz parolalar seçin. Daha ileri düzey kimlik doğrulama çözümleri (örneğin, LDAP, OAuth2 entegrasyonu) için bir ters proxy veya daha gelişmiş bir registry çözümü (Harbor, Nexus) düşünebilirsiniz.
* Güvenlik Duvarı (Firewall): Registry’nizin 5000 numaralı portuna (veya kullandığınız porta) erişimi sadece yetkili IP adresleriyle (örneğin, CI/CD sunucuları, geliştirme makineleri) sınırlayın. UFW (Uncomplicated Firewall) kullanıyorsanız:
sudo ufw allow from YOUR_CLIENT_IP_OR_SUBNET to any port 5000
sudo ufw enable
Genel erişimi kısıtlamak için:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh # SSH erişimi için
sudo ufw allow from YOUR_CLIENT_IP_OR_SUBNET to any port 5000
sudo ufw enable
* Düzenli Güncellemeler: Ubuntu işletim sisteminizi ve Docker Engine’i düzenli olarak güncelleyin. Bu, bilinen güvenlik açıklarına karşı korunmanıza yardımcı olur.
* Log İzleme: Registry kapsayıcısının loglarını düzenli olarak izleyin (docker logs registry). Şüpheli aktivite veya hata mesajları olup olmadığını kontrol edin.
* Ters Proxy (Reverse Proxy): Nginx veya Caddy gibi bir ters proxy kullanmak, ek güvenlik katmanları (örneğin, WAF), yük dengeleme, daha kolay Let’s Encrypt entegrasyonu ve gelişmiş trafik yönetimi sağlar.
* Disk Alanı İzleme: Registry’nizin depolama alanını düzenli olarak kontrol edin. Disk dolduğunda imaj gönderme işlemleri başarısız olacaktır.
Sorun Giderme
Kurulum sırasında veya sonrasında karşılaşabileceğiniz bazı yaygın sorunlar ve çözümleri:
* x509: certificate signed by unknown authority: Bu hata, Docker istemcinizin registry sertifikasına güvenmediği anlamına gelir. İstemci makinede sertifikayı doğru bir şekilde güvenilir olarak eklediğinizden ve Docker servisini yeniden başlattığınızdan emin olun. Sertifikanın Common Name’inin (CN) istemcinin bağlantı kurduğu adresle eşleştiğini kontrol edin.
* http: server gave HTTP response to HTTPS client: İstemci HTTPS üzerinden bağlanmaya çalışırken, registry HTTP üzerinden hizmet veriyor. Registry’nin HTTPS ile doğru bir şekilde yapılandırıldığından emin olun.
* authentication required: Yanlış kullanıcı adı veya parola girildi veya htpasswd yapılandırması yanlış. docker login komutunu doğru kimlik bilgileriyle kullandığınızdan ve registry kapsayıcısının htpasswd dosyasını doğru yoldan okuduğundan emin olun.
* Firewall Engeli: Registry’nin portuna (varsayılan 5000) erişimin güvenlik duvarı tarafından engellenip engellenmediğini kontrol edin. ufw status veya iptables -L komutlarıyla kontrol edebilirsiniz.
* Disk Alanı Dolu: Registry’nin depolama alanı dolmuş olabilir. df -h ile disk kullanımını kontrol edin ve gereksiz imajları silerek çöp toplama işlemi yapın.
* Registry Kapsayıcısı Çalışmıyor: docker ps komutuyla registry kapsayıcısının durumunu kontrol edin. Eğer çalışmıyorsa, docker logs registry ile logları inceleyerek hatanın nedenini bulmaya çalışın.
Sonuç
Ubuntu 22.04 üzerinde özel bir Docker Registry kurmak, şirket içi geliştirme ve dağıtım süreçleriniz için önemli bir adımdır. Bu rehberde, Docker’ı kurmaktan başlayarak, HTTPS ile güvenliği sağlamaya, temel kimlik doğrulama eklemeye ve registry’yi yönetmeye kadar tüm adımları detaylı bir şekilde ele aldık. Güvenli bir özel registry, imajlarınız üzerinde tam kontrol sağlamanıza, ağ trafiğini optimize etmenize ve hassas verilerinizi korumanıza olanak tanır.
Kurulumdan sonra, registry’nizin bakımını düzenli olarak yapmayı, güvenlik güncellemelerini takip etmeyi ve ağ güvenlik duvarı kurallarınızı gözden geçirmeyi unutmayın. İlerleyen zamanlarda, CI/CD entegrasyonları, daha gelişmiş kimlik doğrulama yöntemleri (örneğin, OAuth2) veya Harbor gibi daha kapsamlı bir registry çözümü gibi ek özellikler araştırmanız gerekebilir. Kendi özel Docker Registry’nizle, Docker tabanlı iş akışlarınızı daha güvenli ve verimli hale getirebilirsiniz.