Ubuntu 18.04 Üzerinde Özel Bir Docker Registry Kurulumu
Docker, uygulamaları izole edilmiş ve taşınabilir kapsayıcılarda paketlemek ve çalıştırmak için devrim niteliğinde bir platformdur. Docker ekosisteminin temel bileşenlerinden biri olan Docker Registry, Docker imajlarını depolayan ve dağıtan merkezi bir hizmettir. Docker Hub, Docker imajları için varsayılan ve en popüler genel kayıt defteridir, ancak birçok kuruluş kendi özel imajlarını güvenli, kontrollü ve dahili bir ortamda yönetmek ister. Bu ihtiyaç, özel Docker Registry kurulumlarını zorunlu kılar.
Bu makalede, Ubuntu 18.04 işletim sistemi üzerinde güvenli (HTTPS destekli) ve kimlik doğrulamalı özel bir Docker Registry’nin nasıl kurulacağını adım adım ele alacağız. Kendi özel imajlarınızı yönetmenin faydaları arasında geliştirme sürecinde daha fazla kontrol, ağ trafiği optimizasyonu, güvenlik politikalarına uyum ve hassas imajların genel ağa maruz kalmamasının sağlanması yer alır. Bu kurulum, küçük ekiplerden büyük kurumsal altyapılara kadar çeşitli senaryolarda kullanılabilir.
Ön Koşullar
Özel Docker Registry kurulumuna başlamadan önce aşağıdaki ön koşulların yerine getirildiğinden emin olun:
* Ubuntu 18.04 Sunucusu: En az 2 GB RAM ve 2 CPU çekirdeğine sahip bir Ubuntu 18.04 sunucusu. Makine, internet erişimine sahip olmalı ve kararlı bir ağ bağlantısı bulunmalıdır.
* Sudo Yetkileri: Kurulum adımları için sudo yetkisine sahip bir kullanıcı hesabınız olmalıdır.
* Docker Kurulumu: Sunucunuzda Docker Engine’in kurulu ve çalışır durumda olması gerekmektedir. Eğer kurulu değilse, sonraki bölümde kurulum adımlarını bulabilirsiniz.
* Açık Portlar: Docker Registry için 5000 (HTTP) ve/veya 443 (HTTPS) portlarının dışarıdan erişilebilir olması gerekmektedir. Güvenlik duvarınızda bu portları açmanız gerekebilir (örneğin UFW).
* Alan Adı veya IP Adresi: Güvenli (HTTPS) bir kurulum için bir alan adına (örneğin registry.example.com) veya genel erişilebilir bir IP adresine ihtiyacınız olacaktır. Let’s Encrypt gibi hizmetlerle sertifika alacaksanız bir alan adı zorunludur. Geliştirme ortamları için self-signed sertifikalar kullanırken IP adresi de yeterli olabilir.
* htpasswd Aracı: Kimlik doğrulama için kullanılacak htpasswd aracının kurulu olması gerekmektedir. Bu araç apache2-utils paketi ile birlikte gelir.
Docker ve Gerekli Araçların Kurulumu
İlk olarak, sunucunuzu güncelleyelim ve Docker ile kimlik doğrulama için gerekli olan apache2-utils paketini kuralım.
1. Sistem Güncellemesi:
sudo apt update
sudo apt upgrade -y
2. Docker Kurulumu:
Eğer Docker sunucunuzda kurulu değilse, aşağıdaki adımları izleyerek kurabilirsiniz:
# Gerekli paketleri kurun
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y
# Docker'ın GPG anahtarını ekleyin
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Docker APT deposunu ekleyin
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# Paket listesini güncelleyin
sudo apt update
# Docker Engine'i kurun
sudo apt install docker-ce docker-ce-cli containerd.io -y
# Kullanıcınızı docker grubuna ekleyin (Docker komutlarını sudo olmadan çalıştırmak için)
sudo usermod -aG docker $USER
# Değişikliklerin etkili olması için oturumu kapatıp açın veya aşağıdaki komutu çalıştırın
# newgrp docker
Kurulumu doğrulamak için hello-world imajını çalıştırabilirsiniz:
docker run hello-world
Çıktıda “Hello from Docker!” mesajını görmelisiniz.
3. apache2-utils Kurulumu:
Kimlik doğrulama için htpasswd aracına ihtiyacımız olacak.
sudo apt install apache2-utils -y
Temel Docker Registry Kurulumu (HTTP)
İlk olarak, herhangi bir güvenlik önlemi olmadan temel bir Docker Registry’yi HTTP üzerinden çalıştıralım. Bu, kurulumun temelini anlamak ve daha sonra güvenli hale getirmek için iyi bir başlangıç noktasıdır.
1. Registry Kapsayıcısını Çalıştırma:
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.
* -d: Kapsayıcıyı arka planda (detached mode) çalıştırır.
* -p 5000:5000: Host’un 5000 numaralı portunu kapsayıcının 5000 numaralı portuna bağlar.
* --restart=always: Kapsayıcının her zaman yeniden başlatılmasını sağlar (sistem yeniden başlatıldığında bile).
* --name registry: Kapsayıcıya registry adını verir.
* registry:2: Kullanılacak Docker imajı ve etiketi.
2. Kurulumu Doğrulama:
docker ps
Çıktıda registry adında bir kapsayıcının çalıştığını görmelisiniz.
3. Test Etme (İmaj Gönderme/Çekme):
Şimdi bir Docker imajını bu kayıt defterine gönderip geri çekerek test edelim.
# Bir imajı etiketleyin (örneğin hello-world)
docker tag hello-world localhost:5000/my-hello-world
# İmajı kayıt defterine gönderin
docker push localhost:5000/my-hello-world
# İmajı yerel depodan silin
docker rmi localhost:5000/my-hello-world
# İmajı kayıt defterinden çekin
docker pull localhost:5000/my-hello-world
Bu adımlar başarılı olursa, temel kayıt defteriniz çalışıyor demektir. Ancak, bu kurulum güvenliksizdir. Docker varsayılan olarak HTTP üzerinden güvenli olmayan kayıt defterlerine bağlanmayı reddeder. localhost için özel bir istisna vardır, ancak uzak bir sunucudan erişim sağlamak için Docker daemon yapılandırmasına insecure-registries eklemeniz gerekir ki bu da önerilmez. Üretim ortamları için mutlaka HTTPS kullanmalısınız.
Güvenli Bir Docker Registry Kurulumu (HTTPS)
Üretim ortamlarında Docker Registry’nizi HTTPS üzerinden çalıştırmak zorunludur. Bu, imajlarınızın aktarımı sırasında şifrelenmesini sağlar ve kimlik bilgilerinizin güvenliğini artırır. HTTPS için bir SSL sertifikasına ihtiyacımız olacak.
1. SSL Sertifikası Oluşturma
İki farklı yöntemle SSL sertifikası oluşturabiliriz: Self-Signed Sertifika (geliştirme ortamları için) veya Let’s Encrypt ile Sertifika (üretim ortamları için).
* Self-Signed Sertifika (Geliştirme Ortamı İçin):
Bu yöntem, hızlı testler ve geliştirme ortamları için uygundur. Üretim ortamlarında tarayıcılar veya Docker istemcileri tarafından güvenilmeyen bir sertifika olduğu için ek yapılandırma gerektirir.
# Sertifikaları depolamak için bir dizin oluşturun
sudo mkdir -p /opt/registry/certs
# Özel anahtar ve sertifika oluşturun
sudo openssl req -newkey rsa:4096 -nodes -sha256 -keyout /opt/registry/certs/domain.key -x509 -days 365 -out /opt/registry/certs/domain.crt
Bu komutu çalıştırdığınızda bazı bilgiler girmeniz istenecektir. En önemlisi Common Name (e.g. server FQDN or YOUR name) kısmına Docker Registry’nize erişmek için kullanacağınız alan adını (örneğin registry.example.com) veya IP adresini girmelisiniz. Bu değer, istemcinin sertifikayı doğrularken kullandığı adla eşleşmelidir.
* Let’s Encrypt ile Sertifika (Üretim Ortamı İçin):
Let’s Encrypt, ücretsiz, güvenilir ve otomatikleştirilmiş SSL sertifikaları sağlar. Bu yöntemi kullanmak için geçerli bir alan adınızın olması ve bu alan adının sunucunuzun IP adresine yönlendirilmiş olması gerekir.
# Certbot'u kurun
sudo apt install certbot -y
# Sertifikayı alın (domain.com yerine kendi alan adınızı yazın)
# --standalone seçeneği, Certbot'un sertifikayı almak için geçici bir web sunucusu çalıştırmasını sağlar.
# Eğer sunucunuzda halihazırda bir web sunucusu (Nginx/Apache) çalışıyorsa, --webroot seçeneğini kullanmanız gerekebilir.
sudo certbot certonly --standalone -d your_domain.com
Certbot sizden e-posta adresi ve hizmet koşullarını kabul etmenizi isteyecektir. Başarılı olursa, sertifikalar /etc/letsencrypt/live/your_domain.com/ dizininde oluşturulacaktır.
Şimdi bu sertifikaları Docker Registry’nin kullanacağı dizine kopyalayalım:
sudo mkdir -p /opt/registry/certs
sudo cp /etc/letsencrypt/live/your_domain.com/fullchain.pem /opt/registry/certs/domain.crt
sudo cp /etc/letsencrypt/live/your_domain.com/privkey.pem /opt/registry/certs/domain.key
Let’s Encrypt sertifikaları 90 gün geçerlidir ve Certbot otomatik yenileme mekanizmalarını kurar.
2. Registry’yi HTTPS ile Çalıştırma
Sertifikalarımız hazır olduğuna göre, mevcut HTTP kayıt defterini durdurup silip, HTTPS destekli yeni bir kapsayıcı başlatalım.
1. Mevcut Registry’yi Durdurma ve Silme:
docker stop registry
docker rm registry
2. HTTPS Destekli Registry’yi Çalıştırma:
docker run -d -p 443:5000 --restart=always --name registry \
-v /opt/registry/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry:2
* -p 443:5000: Host’un 443 (HTTPS varsayılan) portunu kapsayıcının 5000 numaralı portuna bağlar.
* -v /opt/registry/certs:/certs: Host üzerindeki sertifika dizinini kapsayıcı içindeki /certs dizinine bağlar.
* -e REGISTRY_HTTP_TLS_CERTIFICATE ve -e REGISTRY_HTTP_TLS_KEY: Registry’ye kullanılacak sertifika ve anahtar dosyalarının yolunu bildirir.
3. Güvenlik Duvarı Ayarı:
Eğer UFW kullanıyorsanız, 443 portunu açmanız gerekebilir:
sudo ufw allow 443/tcp
4. Self-Signed Sertifika İçin İstemci Tarafı Güven Yapılandırması:
Eğer self-signed sertifika kullandıysanız, Docker istemcinizin bu sertifikaya güvenmesi gerekir. Her Docker istemcisinde (geliştirme makinelerinizde) aşağıdaki adımları yapmanız gerekmektedir:
* Sunucudaki domain.crt dosyasını istemciye kopyalayın:
sudo scp user@your_registry_domain.com:/opt/registry/certs/domain.crt /usr/local/share/ca-certificates/registry-cert.crt
* Sertifika yetkililerini güncelleyin:
sudo update-ca-certificates
* Docker daemon’ı yeniden başlatın:
sudo systemctl restart docker
Let’s Encrypt gibi genel olarak güvenilen bir CA’dan sertifika aldıysanız bu adımlara gerek yoktur.
5. HTTPS Test Etme:
Şimdi registry’ye giriş yapmayı deneyerek HTTPS bağlantısını test edebilirsiniz. Henüz kimlik doğrulama eklemediğimiz için giriş başarısız olacaktır, ancak bağlantının kurulduğunu görmelisiniz:
docker login your_registry_domain.com
“Login Succeeded” yerine bir hata alırsanız, sertifika veya bağlantı ayarlarınızı kontrol etmelisiniz.
Kimlik Doğrulama Ekleme
Özel Docker Registry’nize erişimi kontrol etmek için kimlik doğrulama eklemek çok önemlidir. Registry, htpasswd dosyasını kullanarak temel kimlik doğrulama (Basic Authentication) yapabilir.
1. htpasswd Dosyası Oluşturma
1. Kimlik doğrulama dosyasını depolamak için bir dizin oluşturun:
sudo mkdir -p /opt/registry/auth
2. İlk kullanıcıyı oluşturun:
sudo htpasswd -Bc /opt/registry/auth/htpasswd registry_user
registry_user yerine istediğiniz kullanıcı adını yazın. Bu komut, htpasswd dosyasını oluşturacak (-c) ve ilk kullanıcı için bir parola belirlemenizi isteyecektir. -B bcrypt algoritmasını kullanır, bu da daha güvenlidir.
3. Daha fazla kullanıcı ekleyin (isteğe bağlı):
sudo htpasswd -B /opt/registry/auth/htpasswd another_user
Yeni kullanıcılar eklerken -c (create) bayrağını kullanmayın, aksi takdirde mevcut dosyanın üzerine yazılır.
2. Kimlik Doğrulamalı Registry’yi Çalıştırma
Şimdi mevcut registry’yi durdurup silerek, kimlik doğrulama ve HTTPS destekli yeni bir kapsayıcı başlatalım.
1. Mevcut Registry’yi Durdurma ve Silme:
docker stop registry
docker rm registry
2. Kimlik Doğrulamalı Registry’yi Çalıştırma:
docker run -d -p 443:5000 --restart=always --name registry \
-v /opt/registry/certs:/certs \
-v /opt/registry/auth:/auth \
-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
* -v /opt/registry/auth:/auth: Host üzerindeki kimlik doğrulama dizinini kapsayıcı içindeki /auth dizinine bağlar.
* -e REGISTRY_AUTH=htpasswd: Kimlik doğrulama yöntemi olarak htpasswd kullanılacağını belirtir.
* -e REGISTRY_AUTH_HTPASSWD_REALM: Kimlik doğrulama için görünen alanı belirler.
* -e REGISTRY_AUTH_HTPASSWD_PATH: htpasswd dosyasının kapsayıcı içindeki yolunu belirtir.
3. Kimlik Doğrulama ile Test Etme
Şimdi docker login komutunu kullanarak kimlik doğrulamalı kayıt defterinize giriş yapmayı deneyelim.
1. Giriş Yapma:
docker login your_registry_domain.com
Kullanıcı adı olarak registry_user (veya oluşturduğunuz başka bir kullanıcı adı) ve belirlediğiniz parolayı girin. “Login Succeeded” mesajını görmelisiniz.
2. İmaj Gönderme ve Çekme:
# Bir imajı etiketleyin
docker tag hello-world your_registry_domain.com/my-secure-image
# İmajı güvenli kayıt defterine gönderin
docker push your_registry_domain.com/my-secure-image
# İmajı yerel depodan silin
docker rmi your_registry_domain.com/my-secure-image
# İmajı kayıt defterinden çekin
docker pull your_registry_domain.com/my-secure-image
Bu adımlar başarılı olursa, özel ve güvenli Docker Registry’niz başarıyla kurulmuş demektir.
3. Çıkış Yapma:
docker logout your_registry_domain.com
Veri Depolama Alanını Yapılandırma
Varsayılan olarak, Docker Registry kapsayıcı içindeki /var/lib/registry dizininde imaj verilerini depolar. Kapsayıcı silinirse, tüm imajlarınız kaybolur. Bu nedenle, verilerin kalıcı olması için bir host dizinini bu konuma bağlamak (mount etmek) önemlidir.
1. Veri Depolama Dizini Oluşturma:
sudo mkdir -p /opt/registry/data
2. Kalıcı Depolamalı Registry’yi Çalıştırma:
Mevcut registry’yi durdurup silin ve tüm önceki yapılandırmalarla birlikte kalıcı depolama alanını da ekleyerek yeniden başlatın.
docker stop registry
docker rm registry
docker run -d -p 443:5000 --restart=always --name registry \
-v /opt/registry/data:/var/lib/registry \
-v /opt/registry/certs:/certs \
-v /opt/registry/auth:/auth \
-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
* -v /opt/registry/data:/var/lib/registry: Host üzerindeki /opt/registry/data dizinini kapsayıcı içindeki /var/lib/registry dizinine bağlar. Bu sayede imaj verileri host üzerinde kalıcı olarak depolanır.
Artık Docker Registry’niz güvenli, kimlik doğrulamalı ve kalıcı veri depolama ile çalışır durumdadır.
Registry Yönetimi ve Bakımı
Özel Docker Registry’nizi kurduktan sonra, onu etkili bir şekilde yönetmek ve bakımını yapmak önemlidir.
1. İmajları Listeleme
Registry’de bulunan imajları listelemek için Docker Registry API’sini kullanabilirsiniz. Bunun için bir curl komutu yeterlidir:
curl -u registry_user:password https://your_registry_domain.com/v2/_catalog
registry_user:password yerine kendi kimlik bilgilerinizi yazın. Bu komut, registry’deki tüm imajların listesini JSON formatında döndürecektir.
2. İmajları Silme ve Çöp Toplama (Garbage Collection)
Bir Docker imajını registry’den silmek, doğrudan bir docker rmi komutuyla olmaz. Docker istemcisindeki docker rmi yalnızca yerel depodaki imajı siler. Registry’deki imajları silmek için Registry API’sini kullanmanız ve ardından çöp toplama (garbage collection) çalıştırmanız gerekir.
İmajı silmek için (API üzerinden):
Bu işlem biraz karmaşıktır ve imajın manifest digest’ini bilmeyi gerektirir. Genellikle, imajı silmek yerine sadece etiketini kaldırmak ve daha sonra çöp toplama yapmak tercih edilir. Ancak tam bir silme işlemi için:
1. İmajın manifest digest’ini alın:
curl -I -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
-u registry_user:password https://your_registry_domain.com/v2/your-image-name/manifests/your-tag-name
Docker-Content-Digest başlığındaki değeri kopyalayın.
2. Manifesti silin:
curl -X DELETE -u registry_user:password https://your_registry_domain.com/v2/your-image-name/manifests/<DIGEST>
yerine kopyaladığınız digest değerini yapıştırın.
Çöp Toplama (Garbage Collection) Çalıştırma:
Yukarıdaki silme işlemi veya bir imajın etiketini kaldırmak, imaj katmanlarını diskten hemen silmez. Bu katmanlar, başka imajlar tarafından kullanılabileceği düşünülerek “dangling” (sarkık) olarak işaretlenir. Disk alanını geri kazanmak için düzenli olarak çöp toplama çalıştırmanız gerekir.
ÖNEMLİ: Çöp toplama işlemi sırasında registry’ye yazma işlemleri yapılmamalıdır. En güvenli yol, işlemi yaparken registry’yi durdurmaktır.
1. Registry’yi durdurun:
docker stop registry
2. Çöp toplama işlemini çalıştırın:
Bu komut, kapsayıcının mevcut diskini kullanarak, ancak yeni bir geçici kapsayıcı içinde çalıştırılır. Mevcut registry’nin bağlandığı tüm birimleri (volume) kullanır.
docker run --rm --volumes-from registry \
-v /opt/registry/certs:/certs \
-v /opt/registry/auth:/auth \
-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 garbage-collect /etc/docker/registry/config.yml
Bu komut, registry’nin yapılandırma dosyasını (/etc/docker/registry/config.yml) kullanarak diskteki gereksiz katmanları temizler.
3. Registry’yi yeniden başlatın:
docker start registry
Bu işlemi düzenli aralıklarla (örneğin aylık veya haftalık olarak) yaparak disk alanınızın verimli kullanılmasını sağlayabilirsiniz.
3. Yedekleme Stratejisi
Registry’nizdeki veriler çok değerlidir. Düzenli yedeklemeler yapmak felaket kurtarma planınızın bir parçası olmalıdır. Yedeklemeniz gereken ana dizinler şunlardır:
* /opt/registry/data: Tüm Docker imaj verilerini içerir.
* /opt/registry/certs: SSL sertifikalarını içerir.
* /opt/registry/auth: htpasswd dosyasını içerir.
Bu dizinleri periyodik olarak güvenli bir yedekleme konumuna kopyalayabilirsiniz. Örneğin:
sudo tar -czvf /path/to/backup/registry_backup_$(date +%Y%m%d).tar.gz /opt/registry
4. İzleme
Registry’nizin sağlığını ve performansını izlemek önemlidir:
* Disk Kullanımı: /opt/registry/data dizininin disk kullanımını takip edin. Disk dolduğunda yeni imaj gönderilemez.
* Kapsayıcı Durumu: docker ps komutuyla registry kapsayıcısının çalışır durumda olduğundan emin olun.
* Kapsayıcı Logları: docker logs registry komutuyla registry kapsayıcısının loglarını kontrol edin. Hata mesajları veya anormal davranışlar olup olmadığını gözlemleyin.
Sonuç
Bu makalede, Ubuntu 18.04 üzerinde güvenli, kimlik doğrulamalı ve kalıcı depolama ile özel bir Docker Registry’nin nasıl kurulacağını ayrıntılı bir şekilde ele aldık. Kendi özel Docker Registry’nizi kurarak, Docker imajlarınız üzerinde tam kontrol sahibi olursunuz. Bu, özellikle hassas veya tescilli imajlarınız varsa, ağ trafiğini optimize etmek, güvenlik politikalarına uymak ve geliştirme süreçlerinizi daha verimli hale getirmek için kritik öneme sahiptir.
Kurulum sürecinde HTTP üzerinden basit bir registry’den başlayarak, HTTPS ile güvenliği artırdık ve htpasswd ile kimlik doğrulama ekledik. Son olarak, veri kalıcılığı için host birimlerini bağlama ve registry’nin bakımı için önemli yönetim adımlarını inceledik. Bu adımları takip ederek, ekibinizin ihtiyaçlarına uygun, sağlam ve güvenilir bir özel Docker Registry altyapısı kurabilirsiniz. Gelecekte, S3 gibi bulut depolama entegrasyonları veya gelişmiş kullanıcı arayüzleri gibi ek özellikler ekleyerek registry’nizin yeteneklerini daha da genişletebilirsiniz.
