Konteynerleştirme teknolojisi, bulut ortamlarında uygulamaları paketlemek ve dağıtmak için en çok kabul gören yöntem olarak yazılım geliştirme teknoloji alanında büyük ölçüde ilerlemiştir. Bu, DevOps'un tanımlayıcı özellikleri olan sürekli entegrasyon (CI) ve sürekli dağıtım (CD) ihtiyacıyla zorunlu hale gelmiştir. Yazılım geliştiricileri ve mühendisleri, yazılım mimarisinin CI/CD yönünü elde etmek için konteynerleri kullanırlar. Bir konteyner, esasen tamamen paketlenmiş, taşınabilir ve kendi kendine yeten bir bilgi işlem platformudur. Web üzerinde birkaç konteyner platformu olsa da, Docker en yaygın olanıdır.
Docker, açık kaynaklı bir konteyner platformudur ve bu da geliştirmeyi verimli ve öngörülebilir hale getirir. Docker, Docker Hub adresinde bulunan herkese açık bir Docker imaj deposu sunar. En yaygın uygulamalar için çekip kullanabileceğiniz birçok açık kaynaklı Docker imajı içerir. Herkese açık bir depo olduğundan, halkla paylaşmak üzere kendi Docker imajlarınızı eklemekte de özgürsünüz. Ancak, özel/tescilli kodunuz varsa, özel bir imaj deposu için ödeme yapmanız veya kendi imaj deposu hizmetinizi oluşturmanız gerekebilir. İşte bu noktada GitLab devreye giriyor.
GitLab sadece bir sürüm kontrol aracından daha fazlası olan, web tabanlı bir Git deposudur. Sürekli entegrasyon ve dağıtım, hata takibi, Docker imaj kayıt defterleri ve daha fazlası için DevOps araçları sağlar. Üç seçenek sunar: GitLab Community Edition (CE), GitLab Enterprise Edition (EE) ve Gitlab SaaS. GitLab CE ve GitLab EE, GitLab örneğini kendiniz indirmenize, kurmanıza ve yönetmenize olanak tanıyan kendi kendine yönetilen çözümlerdir. GitLab SaaS, GitLab inc tarafından barındırılır ve kullanmak için herhangi bir şey kurma konusunda endişelenmenize gerek yoktur.
Önceki bir eğitimde size bir CloudSigma sunucusunda GitLab örneğinin nasıl kurulacağını ve kendi Git Deponuzu nasıl barındıracağınızı. Ayrıca, GitLab runner ile sürekli entegrasyon işlem hatlarını yeni bir commit olduğunda testlerinizi otomatik olarak derlemek ve çalıştırmak için nasıl uygulayacağınızı göstermiştik. Bahsedilen eğitimleri incelemediyseniz, bu eğitimin yapı taşları oldukları için lütfen inceleyin.
Bu eğitimde, basit bir Docker imajının nasıl derleneceğini ve kendi kendine barındırılan bir GitLab örneğiyle nasıl barındırılacağını göstereceğiz (ister Community Edition ister Enterprise Edition kullanıyor olun – adımların akışı aynıdır).
Önkoşullar
Bu eğitimin her adımını takip etmek için lütfen GitLab CI runner ve kendi kendine barındırılan bir GitLab sunucusuna sahip olduğunuzdan emin olun (aşağıda açıklandığı gibi).
1. Güvenli Bir GitLab Sunucusu
Bunu kaynak kodunu depolamak, CI/CD görevlerini çalıştırmak ve Docker imaj kayıt defterini barındırmak için kullanacağız. En az 2 CPU çekirdeğine ve 4GB of RAM'e sahip bir sunucunuz olmalıdır (kendi kendine yönetilen bir GitLab örneği kurmak için GitLab tarafından önerilen miktar). Sunucuyu güvence altına almak için bir Let’s Encrypt'ten SSL sertifikası almak üzere kullanacağımızdan, sunucuya yönlendirilmiş kayıtlı bir alan adına da ihtiyacınız olacak. Aşağıda, kendi kendine barındırılan bir GitLab örneği kurmak için takip edebileceğiniz bazı bağlantılar bulunmaktadır.
- Seçtiğiniz herhangi bir alan adı kayıt kuruluşundan bir alan adı kaydedin ve bunu CloudSigma'ya yönlendirin.
- Şu adımlar için bu eğitimi takip edin: ilk Ubuntu sunucu kurulumu, root olmayan bir kullanıcı ekleme, ve Ubuntu'nun UFW güvenlik duvarını etkinleştirme.
- Son olarak, kendi kendine barındırılan bir GitLab örneğini kurmak ve yapılandırmak için bu eğitimi takip edin.
2. Bir GitLab CI Runner
Test senaryolarınıza karşı otomatik işleri çalıştırmak için bir GitLab CI runner gereklidir. Ubuntu 20.04 üzerinde GitLab Sürekli Entegrasyon işlem hatlarının nasıl kurulacağı hakkındaki eğitim, size GitLab CI sunucusuna genel bir bakış sunar ve işleri nasıl tetikleyeceğinizi gösterir. Henüz yapmadıysanız, GitLab CI runner hizmetini kurmak için eğitimdeki adımları izleyin. Eğitimde test senaryoları içeren bir Node.js demo uygulaması bulunmaktadır – bu eğitimde bunu kullanacağız.
Şimdi başlayalım!
Adım 1: Ayrıcalıklı Bir GitLab CI Runner Yapılandırma
Bir GitLab CI Runner'ın nasıl kurulacağına ilişkin eğitimde, GitLab runner'ı şu komutla yapılandırmıştık: sudo gitlab-runner register komutu, gerekli parametreleri etkileşimli olarak eklememize izin verdi. Bu, izole Docker konteynerlerinde derlemeler ve testler çalıştırmak olan önceki kullanım durumumuz için işe yaramış olsa da, Docker imajları oluşturmayı desteklemeyebilir. Docker imajları oluşturmak, çalıştırıcının Docker servisine tam erişimi olmasını gerektirir. Bu yapılandırmayı, işleri çalıştırmak için resmi docker-in-docker imajını kullanarak elde edebilirsiniz. Böyle bir yapılandırma, çalıştırıcıya bir privileged yürütme modu verilmesini gerektirir.
Docker imajları oluşturmak için privileged yürütme modunun verilmesi gerekli olsa da, bu durum güvenlik sorunlarını da beraberinde getirir. Bunun nedeni, konteynerlerin güvenlik avantajlarını ortadan kaldırmasıdır. Diğer Docker çalıştırıcılarının güvenli olduğunu düşünebilirsiniz ancak onlar da açıklandığı gibi aynı sorunlara sahiptir resmi Docker belgelerinde.
Ayrıcalıklı yürütme moduna sahip başka bir çalıştırıcı oluşturacağız. Yukarıda belirtilen güvenlik etkileri nedeniyle bu, projeye özel bir çalıştırıcı olacaktır. Bu çalıştırıcı, Node Pipeline projesinden gelen işleri kabul edecektir. Bu projeyi GitLab ile sürekli CI boru hatlarının nasıl kurulacağı hakkındaki öğreticide oluşturmuştuk..
Yapmanız gereken ilk şey, Shared Runners projede devre dışı bırakıldığını kontrol etmektir. Node Pipeline projesinin proje sayfasından, sol alt menüdeki Settings seçeneğine tıklayın ve alt menüden CI/CD seçeneğini seçin:
Mevcut çalıştırıcılar hakkındaki ayrıntıları görmek için Expand butonunu Runners bölümünde bulun ve tıklayın:
Bu proje için Disable Shared Runners seçeneğini kapatmak için anahtara tıklayın. Önceki bölümde projeye özel bir çalıştırıcı eklediyseniz, onu da devre dışı bırakın. Bu proje için işleri çalıştırmak üzere bir privileged projeye özel çalıştırıcı ekleyeceğiz. Bu, GitLab'in işleri rastgele olarak ayrıcalıklı yürütme moduyla kaydedilmemiş çalıştırıcılara ataması durumunda derleme hatalarıyla karşılaşmamamızı garanti eder. Yukarıdaki ekran görüntüsünde, Specific runners sekmesinin altında projenizin registration token görmelisiniz. Aşağıda kullanacağınız için bunu not edin.
| Note: Projeye özel bir çalıştırıcı, Admin panel > Runners bölümünden diğer projelere de atanabilir. Çalıştırıcı listesinden bir çalıştırıcı seçtiğinizde, çalıştırıcı yapılandırma sayfasına gidersiniz. Şu bölümü görmek için aşağı kaydırın: Restrict projects for this runner: |
Terminalinizi açma zamanı geldi. Ubuntu 20.04 üzerinde GitLab Sürekli Entegrasyon Boru Hatlarının Nasıl Kurulacağı hakkındaki öğreticideki adımları uygulamadıysanız, GitLab CI çalıştırıcı servisine sahip bir sunucunuz olabilmesi için bu öğreticiye ara verin ve adımları takip edin. Aksi takdirde, sonraki adımlar için GitLab CI çalıştırıcı sunucunuza GitLab CI runner server sunucusuna sudo kullanıcınız ile SSH yapın.
Ayrıcalıklı projeye özel çalıştırıcıyı kurmak için, yukarıda kopyaladığınız alan adınızı ve kayıt belirtecinizi değiştirerek terminalinizde aşağıdaki komutu girin:
|
1 2 3 4 5 6 7 |
sudo gitlab-runner register -n \ --url https://your-gitlab-instance-domain.com/ \ --registration-token your-project-specifc-registration-token \ --executor docker \ --description "docker-privileged-builder" \ --docker-image "docker:latest" \ --docker-privilegedh |
Bu çıktı başarılı bir kaydı gösterir:
GitLab örneğinizin çalıştırıcıyı algıladığını doğrulamak için tarayıcıya geri dönün ve Settings > CI/CD sayfasını yenileyin. Runners bölümünü genişletin; çalıştırıcınızı şu başlık altında görmelisiniz: Specific Runners:
İsteğe bağlı olarak, Admin Panel sayfasına giderseniz (üst bardaki Menu butonuna tıklayıp Admin), seçeneğini seçerek), ardından menü seçeneklerinden Runners seçeneğini seçin:
Hem paylaşılan hem de projeye özel çalıştırıcılar olmak üzere, GitLab instance, bağlı tüm mevcut çalıştırıcıları gösteren bu sayfaya ulaşmalısınız:
Buraya kadar, Docker imajları oluşturabilen bir çalıştırıcıyı başarıyla kurdunuz.
Step 2: Configuring GitLab’s Docker Registry
Bazı kritik iş akışları, dış hizmetlerden bağımsız olmayı gerektirir. İşte GitLab'in kendi kendine yönetilen Docker Registry özelliği burada devreye girer. Sadece güvenli olmakla kalmaz, aynı zamanda işlerinizi ve işlem hatlarınızı ihtiyaçlarınıza göre uyarlama esnekliğine sahip olmanızı sağlar. Docker Registry kurulumunu yapmak için GitLab'in yapılandırma dosyasını değiştireceksiniz. İlk olarak, GitLab örneğine SSH ile bağlanın ve ardından aşağıdaki komutla dosyayı açın:
|
1 |
sudo nano /etc/gitlab/gitlab.rb |
Aşağı kaydırarak şu bölümü bulun: Container Registry Settings:
Şu satırın başındaki yorum işaretini kaldırın: registry_external_url ve sonuna port belirterek GitLab örneğinizin alan adı olarak ayarlayın: 8888 sonuna:
|
1 |
registry_external_url 'https://your-gitlab-domain.com:8888' |
Ardından, aşağıdaki satırları ekleyerek kayıt defterinin Let’s Encrypt sertifikalarını nerede bulacağını belirtmemiz gerekiyor. Gerçek GitLab örnek alan adınızla düzenlemeyi unutmayın:
|
1 2 |
registry_nginx['ssl_certificate'] = "/etc/letsencrypt/live/your-gitlab-domain.com/fullchain.pem" registry_nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/your-gitlab-domain.com/privkey.pem" |
İşlemi tamamladıktan sonra dosyayı kaydedip kapatın. GitLab'i yeniden yapılandırmak için terminalinizde aşağıdaki komutu girin:
|
1 |
sudo gitlab-ctl reconfigure |
Ardından, komutun yürütülmesinin tamamlanması için birkaç saniye bekleyin. Başarılı olursa aşağıdaki çıktıyı görmelisiniz:
Ardından, güvenlik duvarının (ufw) aşağıdaki komutu kullanarak atadığımız kayıt defteri portuna giden trafiğe izin verdiğinden emin olmamız gerekir:
|
1 |
sudo ufw allow 8888 |
Ardından, Docker Registry uygulamasının çalıştığını, Docker yüklü başka bir makineden docker login komutunu kullanarak giriş yaparak test etmeniz gerekir. Yerel ortamınızda Docker kurulumu yapmadıysanız, zaten Docker yüklü olduğu için GitLab CI runner sunucusuna SSH ile bağlanabilirsiniz. Ardından, elbette GitLab örnek alan adınızı belirterek aşağıdaki komutu çalıştırın:
|
1 |
docker login your-gitlab-domain.com:8888 |
Çıktınızda şu şekilde bir Login Succeeded mesajı görünecektir:
Bu, kayıt defterinin başarıyla yapılandırıldığı ve çalıştığı anlamına gelir. İmajlar oluşturduğunuzda, bunlar yerel olarak GitLab sunucusunun dosya sisteminde depolanacaktır. Bu, özel bir şirket kayıt defteri için uygundur. Ancak, kayıt defterinizi herkese açık bırakmayı planlıyorsanız, daha büyük bir depolama alanına ihtiyacınız olabilir. Neyse ki GitLab, depolama klasörlerine (storage buckets) bağlanma seçenekleri sunuyor. GitLab örneğiniz için bir depolama klasörünü nasıl yapılandırabileceğinizi görmek için resmi GitLab container registry docs belgelerinden daha fazla bilgi edinebilirsiniz.
Adım 3: gitlab-ci.yml Dosyasını Değiştirme ve Docker İmajı Oluşturma
Bu adıma devam etmek için GitLab örneğinizde Node Pipeline projesinin bulunması gerekir. Projenin GitLab üzerindeki görünümü şu şekildedir:
Uygulamanızı nasıl derleyeceğini ve otomatik testleri nasıl gerçekleştireceğini öğrenmek için tetiklendiğinde GitLab CI runner'ın okuduğu dosya olarak gitlab-ci.yml dosyasından bahsetmiştik. Docker imajları oluşturmaya yönelik talimatlar eklemek için bu dosyayı değiştirmemiz gerekiyor. Bu dosyayı doğrudan GitLab arayüzü içinden düzenlemeyi seçebilirsiniz. Ayrıca yerel makinenize kopyalayıp (clone) en sevdiğiniz düzenleyiciyle düzenleyebilir, ardından bir commit yapıp GitLab'e geri push edebilirsiniz. Kısa olması açısından GitLab örneğini kullanacağız.
Dosyayı açmak için üzerine tıklayın, ardından Düzenle butonuna tıklayın:
Bu, dosyayı düzenlemeye hazır hale getirir. Dosyadaki her şeyi silin ve aşağıdaki kodu ekleyin:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
image: docker:20-dind services: - name: docker:20-dind alias: docker command: ["--tls=false"] stages: - build - test - release variables: TEST_IMAGE: gitlab-domain.com:8888/hackins/node_pipeline:$CI_COMMIT_REF_NAME RELEASE_IMAGE: gitlab-domain.com:8888/hackins/node_pipeline:latest DOCKER_HOST: tcp://docker:2375 DOCKER_DRIVER: overlay2 DOCKER_TLS_CERTDIR: "" before_script: - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN gitlab-domain.com:8888 build: stage: build script: - docker build --pull -t $TEST_IMAGE . - docker push $TEST_IMAGE test: stage: test script: - docker pull $TEST_IMAGE - docker run $TEST_IMAGE npm test release: stage: release script: - docker pull $TEST_IMAGE - docker tag $TEST_IMAGE $RELEASE_IMAGE - docker push $RELEASE_IMAGE only: - master |
Yukarıdaki kod parçacığını eklerken, vurgulanan kısmı kendi gerçek bilgilerinizle güncellemeyi unutmayın. İşiniz bittiğinde, Değişiklikleri kaydet butonuna basarak değişiklikleri kaydedin. GitLab dışında çalışıyorsanız, değişikliklerinizi commit edip push edin.
Şimdi .gitlab-ci.yml dosyasında yaptığımız değişikliklerin ne işe yaradığını anlayalım. İlk satır GitLab'a resmi Docker-in-Docker imajını kullanmasını söyler ve bunu docker-in-docker servisine (docker:dind) bağlar. Ardından build, test, ve release aşamalarını tanımlarız. build aşaması, Dockerfile dosyasındaki talimatları kullanarak imajı oluşturur ve ardından bir önceki adımda kurduğumuz Docker Registry alanına yükler.
When the build aşaması başarıyla tamamlandığında, test aşaması imajı indirir, bir konteyner olarak çalıştırır ve içinde otomatik testleri gerçekleştirmek için npm test komutunu çalıştırır. Eğer test aşaması başarılı olursa, release aşaması devreye girer. Release aşamasında imaj indirilir ve node_pipeline:latest olarak etiketlenir. Ardından tekrar registry'ye push edilir.
Bu sadece bir demo projesi için temel bir yapılandırmadır. Gerçek dünyadaki projeleriniz için başka aşamalarınız da olabilir, örneğin staging, production, vb. Düzenledikten sonra dosyayı kaydettiğinizde bir pipeline tetiklenir ve işleri çalıştırmaya başlar. Node Pipeline sayfasına geri dönün. İşin şu anda çalışmakta olduğunu görmelisiniz:
İşin çeşitli aşamalarını görüntülemek için CI gösterge simgesine tıklayın:
Yukarıdaki ekran görüntüsünde görebileceğiniz gibi, yeşil onay işareti simgelerine göre tüm aşamalar başarılı oldu. İş çıktısını görüntülemek için her bir aşamaya tıklayabilirsiniz:
Sol taraftaki menüden Packages & Registries seçeneğine tıklayın ve Container Registry:
seçeneğini belirleyin. Bu, seçilen proje için mevcut Docker imajlarını listeleyen bir sayfa açar. Derlediğimiz ve yayınladığımız imaj, listede şu etiketle görünmelidir: atanmış:
İmajın çeşitli etiketlerini görmek için tıklayın:
Yerel ortamınızda Docker yüklüyse, imajı çekebilir ve beklendiği gibi çalıştığını test edebilirsiniz. İmaj etiket adının yanındaki Kopyala simgesine tıklayın. Bu, docker pull komutuyla kullanabileceğiniz tam imaj adını panonuza kopyalayacaktır:
|
1 2 |
docker pull feetspark.com:8888/hackins/node_pipeline:latest docker run -it --rm -p 8090:8090 feetspark.com:8888/hackins/node_pipeline:latest |
Yukarıdaki komutlar imajı çekecek ve bir konteyner içinde çalıştıracaktır:
Uygulama artık şu port üzerinden sunuluyor: 8090. Tarayıcınızı açıp your-IP-address:8090 adresine giderseniz, şu sayfanın görüntülendiğini görmelisiniz:
Tarayıcınızda böyle bir sayfa görebiliyorsanız, başarıyla bir Docker imajı oluşturmuş ve bunu özel bir Docker Registry üzerinde paylaşmışsınız demektir. Gelecekte, master dalında herhangi bir değişiklik yaparsanız, .gitlab-ci.yml dosyasında tanımlanan aşamalar çalışacak ve başarılı olurlarsa, latest etiketiyle yeni bir Docker imajı yeniden oluşturulacak ve registry'ye yüklenecektir.
Sonuç
Bu projede, Docker İmajları oluşturabilmek için kendi yönettiğiniz GitLab örneğinize nasıl bir privileged GitLab runner'ı ekleyeceğinizi öğrendiniz. Ayrıca imajlarınızı barındırmak için özel bir Docker imaj kayıt defteri yapılandırdınız. Node pipeline projesini kullanarak, kurulumun her bileşenini test edebildiniz ve beklendiği gibi bağlanıp iletişim kurduklarından emin oldunuz. İmajınız kayıt defterinde kullanılabilir hale geldiğinde, onu çekebildiniz ve bir konteyner içinde çalıştığını doğrulayabildiniz.
Bu, üzerine inşa edebileceğiniz temel bilgileri veren giriş niteliğinde bir öğreticidir. Lütfen resmi GitLab hakkında daha fazla bilgi edinmek için GitLab belgelerini takip edin. Bu bağlantı şu konu hakkında bilgi sağlayabilir: GitLab Container Registry.
Docker'ı kullanmaya yönelik daha fazla kaynak için, blogumuzdaki diğer öğreticilere göz atmak isteyebilirsiniz:
- Docker Konteynerleri Arasında Veri Paylaşımı
- Ubuntu 18.04 Üzerinde Özel Bir Docker Registry Kurulumu
- Bir Docker Konteyneri ile Host Arasında Veri Paylaşımı Nasıl Yapılır
- Docker Kaynaklarını Temizleme – İmajlar, Konteynerler ve Volume'lar
Keyifli Çalışmalar!

















Yorumlar
Henüz yorum yapılmamış. İlk siz olun.