Docker Image ve Container Oluşturma


Daha önce java projesinden jar oluşturmuştuk. Şimdi oluşturulan JAR'dan docker image oluşturacağız ve docker image'ı çalıştırarak container oluşturacağız.


--Dockerfile dosyasını oluşturuyoruz.

FROM openjdk:8-jre-alpine3.9

COPY HelloDocker.jar /HelloDocker.jar

CMD ["java", "-jar", "/HelloDocker.jar"]


--Dikkat Dockerfile dosyası bu şekilde olmalı ve aynı klasörde olmalı


--Aşağıdaki komut ile localde image oluşturuyoruz.

docker build -t hello-docker .


--image çalıştırmak için


docker run hello-docker



--eğer web uygulaması olsaydı image içinde port expose yoksa run ederken verilebilir varsa imageda belirtilen port üzerinden erişilebilir

docker run -p 8080:8080 hello-docker

--url:

localhost:8080


--containerları listelemek için

docker container ls -a


--container durdurmak için

docker stop <container_id>

docker stop 78ef4679e8f7


--container silmek için

docker container rm <containerid1> <containerid2>

docker container rm 78ef4679e8f7

docker run hello-docker


--image listelemek için

docker images 


--image silmek için

docker image rm <imageid1>

docker image rm <imageid1> -f

docker image rm <imageid1> --force




spacer

Get https://registry-1.docker.io/v2: x509: certificate signed by unknown authority. HATASI ve ÇÖZÜMÜ

 Get https://registry-1.docker.io/v2: x509: certificate signed by unknown authority.


Step 1: openssl s_client -showcerts -connect ${DOMAIN}:${PORT}</dev/null2>/dev/null|openssl x509 -outform PEM >ca.crt

openssl s_client -showcerts -connect registry-1.docker.io:443 </dev/null 2>/dev/null|openssl x509 -outform PEM >ca.crt


Step 2: sudo cp ca.crt /etc/docker/certs.d/${DOMAIN}/ca.crt

sudo cp ca.crt /etc/docker/certs.d/registry-1.docker.io/ca.crt


Step 3: cat ca.crt | sudo tee -a /etc/ssl/certs/ca-certificates.crt

Step 4: sudo service docker restart

spacer

Chrony ile Centos 7 üzerinde NTP (Network Time Protocol) Ayarlarının Yapılması

Chrony, NTP (Network Time Protocol) uygulaması sağlar.

Chrony, genellikle kapatılan veya ağ bağlantısı kesilen sistemler için tasarlanmıştır.

– Ana yapılandırma dosyası /etc/chrony.conf'dur.

– Parametreler /etc/ntp.conf dosyasındakilere benzer. 


Centos 7 için:


Aşağıdaki komut ile chrony kurulur.

# yum install chrony


Aşağıdaki komut ile service başlatılır.

# systemctl start chronyd


Aşağıdaki komut ile service işletim sistemi açıldığında otomatik başlatılır.

# systemctl enable chronyd


Chrony ayarlarını görme

# cat /etc/chrony.conf


Chrony cenksronizasyonu doğrulamak için aşağıdaki komut kullanılır.

# chronyc tracking

Reference ID    : 500497FC (fw2.xtx.cloud)

Stratum         : 3

Ref time (UTC)  : Fri Jul 02 07:15:00 2021

System time     : 0.002935822 seconds fast of NTP time

Last offset     : +0.000645257 seconds

RMS offset      : 0.005158648 seconds

Frequency       : 2.782 ppm slow

Residual freq   : +0.016 ppm

Skew            : 5.452 ppm

Root delay      : 0.065357722 seconds

Root dispersion : 0.016287375 seconds

Update interval : 64.8 seconds

Leap status     : Normal


Burada Leap status değeri "Normal" olmalıdır. Eğer "Not synchronised" ise senkrozide edilmelidir.


Chrony kaynaklarını görme

# chronyc sources

210 Number of sources = 4

MS Name/IP address         Stratum Poll Reach LastRx Last sample

===============================================================================

^+ tilia.zsx.hu                  2   6   377    44  -6144us[-6150us] +/-   73ms

^* fw2.xtx.cloud                 2   6   377    44  -5812us[-5819us] +/-   51ms

^+ callisto.netbunker.org        2   6   377    45  -7168us[-7175us] +/-   93ms

^+ time.cloudflare.com           3   6   377    43    +12ms[  +12ms] +/-   46ms


# chronyc sourcestats

210 Number of sources = 4

Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev

==============================================================================

tilia.zsx.hu                6   3   324     +9.021     24.634  -4882us   756us

fw2.xtx.cloud              13   8   591     -0.839      4.409  -5922us   754us

callisto.netbunker.org     13   6   589     -1.034      6.783  -6752us  1022us

time.cloudflare.com         6   3   324     -4.189     45.626    +12ms  1397us


Chrony durdurma

# systemctl stop chronyd


ntpdate kurma

# yum install install ntpdate


# sudo ntpdate time.nist.gov

 2 Jul 10:26:53 ntpdate[15213]: adjust time server 132.163.97.6 offset 0.006322 sec


Yine aşağıdaki komutla NTP'nin enabled ve synchronized olması gerekir.

# timedatectl

      Local time: Fri 2021-07-02 10:27:38 +03

  Universal time: Fri 2021-07-02 07:27:38 UTC

        RTC time: Fri 2021-07-02 07:27:38

       Time zone: Europe/Istanbul (+03, +0300)

     NTP enabled: yes

NTP synchronized: yes

 RTC in local TZ: no

      DST active: n/a



Reference:

https://www.thegeekdiary.com/centos-rhel-7-configuring-ntp-using-chrony/


spacer

Kubectl Örnek Deployment

En çok kullanılan kubectl komutları ve örnek bir deployment nasıl yapılır adım adım bakalım.


--kubectl yapısı

kubectl [command] [type] [name] [flags]

--podları gösterir

kubectl get pods

--deploymentları gösterir

kubectl get deployment

--my-service adındaki service'e dair bilgileri gösterir

kubectl get service my-service

--nginx imageını kullaranara nginx adında deployment oluşturur

kubectl create deployment nginx --image=nginx

--yaml manifesto ile deploymet oluşturulur

kubectl apply -f nginx.yaml

--nginx adındaki deployment'a dair tanımlamaları gösterir

kubectl describe deployment nginx

--nginx adında deploymentı siler

kubectl delete deployment nginx

--mevcut contexti gösterir

kubectl config get-context

--başka bir contexe geçilir

kubectl config use another-cluster-context


--kubectl versiyonunu gösterir

kubectl version

--component status yani etcd scheduler ve controller manager'ın health statusunu gösterir

kubectl get cs


--belirtilen image'ı kullanarak 8080 port üzerinden hello-k8s adında bir deployment çalıştırıyoruz

kubectl run hello-k8s --image=gcr.io/google_containers/echoserver:1.4 --port=8080

--deploymenta bakalım (eğer replica verilmezse 1 adet oluşturur)

kubectl get deployments

--hello-k8s adındaki deployment'ı NodePort tipinde expose et yani servise oluştur. otomatik bir port 31181 gibi bir port atayacak

kubectl expose deployment hello-k8s --type=NodePort

--şimdi de oluşturulan bu servise bakalım

kubectl get services

--hello-k8s-555c87cddd-5wvxt podunun 31181 portuna (cluster port) gelen istekler node'un 8080 portuna yönleniyordu.

--dışarıdan yani kubernetesin dışından direkt 8080 ile erişilmesi için port yönlendirme yapmamız gerekiyor

kubectl port-forward hello-k8s-555c87cddd-5wvxt 8080:8080

--port forwarding durdurulunca 8080 çalışmayacak ve yine kubernetesin kendi portu 31181 üzerinden hizmet vermeye devam edecek

--iş yükümüz arttı ve artık bize 1 pod yetmiyorsa 2 poda çıkarmak istiyorsak scale ile replicas=2 yapmalıyız

kubectl scale deployment.v1.apps/hello-k8s  --replicas=2

--tekrar podlara baktığımızda artık hello-k8s deployment için 1 değil 2 pod olduğunu göreceğiz

kubectl get pods

--herhangi bir nedenden podlardan birinin düştüğü ve işlevini yerine getiremediği durumda kubernetes replicas=2 olduğu için otomatik olarak sürekli arzu edilen 2 pod olması için için yeniden pod oluşturacaktır.

--şimdi manuel olarak bir podu silelim

kubectl delete pod hello-k8s-555c87cddd-f8j7

--tekrar podlara bakalım ve başka bir name ile pod oluşturduğunu ve 2 pod olduğunu görelim

kubectl get pods

--deployment üzerinden de replica(pod) sayısını görebiliriz

kubectl get deployments

--contextleri gösterir

kubectl config get-contexts

--docker-for-desktop olan contexe geçer

kubectl config use-context docker-for-desktop

spacer

Java projesinden jar (java archive) dosyası oluşturma

JAR, genellikle birçok Java sınıfı dosyasını ve ilişkili meta verileri ve kaynakları dağıtım için tek bir dosyada toplamak için kullanılan bir paket dosyası biçimidir. JAR dosyaları, Java'ya özgü bildirim dosyası içeren arşiv dosyalarıdır. ZIP biçiminde oluşturulmuştur ve genellikle .jar dosya uzantısına sahiptir. https://github.com/abdullahcetinkaya/HelloDocker --HelloDocker paketindeki Main sınıfını derliyoruz. --Böylece Main.class dosyası oluşturulacak. javac HelloDocker/Main.java --HelloDocker.Main sınıfını çalıştırıyoruz. java -cp . HelloDocker.Main --Şimdi de bu sınıftan bir JAR oluşturuyoruz. jar cfme HelloDocker.jar Manifest.txt HelloDocker.Main HelloDocker/Main.class --Oluşturduğumuz JAR'ı çalıştırıyoruz java -jar HelloDocker.jar Not: javac command prompt ekranında çalışmıyorsas bilgisayarınızın ortam değişkenlerini ayarlamanız gerekiyor. JAVA_HOME ve JAVA_PATH Ayarları: 1. Yöntem Bilgisayarım simgesine sağ tıklayın ve Özellikleri seçin. Açılan pencerede, sol taraftan Gelişmiş sistem ayarlarını seçin. Açılan pencerede, Gelişmiş sekmesinde Ortam değişkenleri butonuna tıklayın. Açılan pencerede, alttaki bölümden Path seçeneğini seçin ve Düzenle butonuna tıklayın. Açılan pencerede, Değişken değeri bölümündeki metinin sonuna noktalı virgül (;) koyarak, C:\Program Files\Java\jdk1.8.0_291\bin ifadesini ekleyin ve Tamam butonuna tıklayın. Sizdeki java versiyonu farklıysa path'a dikkat edin. 2. Yöntem Command Prompt ekranında java pathini aşağıdaki komut ile set edin ve aynı komut ekranında işlemlerinizi bitirin. Bu yöntem geçici bir yöntemdir komut konsolu kapatılınca set edilen ayarlar silinir. set PATH=C:\Program Files\Java\jdk1.8.0_291\bin




spacer

Windows 10 Üzerinde Docker Kurulumu

 Windows 10 üzerinde docker kurulabilmesi için sistem gereksinimleri:

Windows 10 64 bit işletim sistemi; Professional, Enterprise yada Education sürümü destekleniyor. Kurulum öncesinde Windows 10’un 2004 ve üzeri sürümü olmalı. Windows sürümünüz güncel değilse kurulum öncesi güncelleyin. Docker, Microsoft’un Windows 10 işletim sistemi için destek yaşam döngüsüne dayalı olarak Docker Desktop’ı destekliyor. Destek yaşam döngüsü (support lifecycle) erişimi için; https://support.microsoft.com/en-us/help/13853/windows-lifecycle-fact-sheet Windows 10 işletim sisteminde Hyper-V ve Containers özellikleri etkinleştirilmeli. Bilgisayarınızdaki işlemcinizin 64 bit ve SLAT (Second Level Address Translation) desteği olmalı. En az 4 GB RAM'e sahip olmalı. BIOS ayarlarında “Hardware Assisted Virtualization” ve “Data Execution Protection” seçenekleri etkinleştirilmiş olmalı. “Windows Subsystem for Linux” uygulaması kurulum öncesinde hazır olmalı. WSL2 kurulumu ve yapılandırılması Windows’a herhangi bir Linux dağıtımını yüklemeden önce, ilk olarak “Windows Subsystem for Linux” özelliğini etkin olmalı. Bu işlem için önce PowerShell’i yönetici olarak açın ve aşağıdaki komutu çalıştırın. dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart Kurulum işlemi tamamlandıktan sonra “Virtual Machine Platform” kurulumu için Powerhell’de aşağıdaki komut çalıştırılır. Kurulum işlemi başarılı olarak tamamlandıktan sonra işletim sistemini yeniden başlatın. dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart WSL2 Linux Kernel güncellemesi için “wsl_update_x64.msi” paketi kurulur. Bu paketi indirmek için adres: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi WSL 2’yi varsayılan sürüm olarak ayarlayın bu işlem için: PowerShell’i yönetici olarak açın ve yeni bir Linux dağıtımı yüklerken WSL 2’yi varsayılan sürüm olarak ayarlanması için “wsl –set-default-version 2” komutunu çalıştırın. Docker kurmak için docker sitesindeki https://www.docker.com/get-docker adresinden docker windows kurulumu indirmek gerekiyor. Başlangıçta, Docker Desktop yükleyicisi bazı paketleri indirmeye başlıyor. “Configuration” sayfasında WSL 2 Özelliklerini etkinleştirilmesi ve masaüstüne kısa yol eklenmesi için ilgili seçenekler seçilir ve kurulum işlemini başlatmak için “OK” butonu seçilir. Kurulum işlemi tamamlandıktan sonra işletim sisteminizi yeniden başlatmak için “Close and log out” butonuna basın. Kurulum bittikten sonra bizden mevcut oturumumuzu kapatmamızı istiyor. Oturumumuzu kapatıp Windowsta yeniden oturum açıyoruz. Eğer Windows makinanızda Hyper-V özelliği kurulu değilse. Docker sizin yerinize kurulumu yapmak için aşağıdaki ekranı açıyor. “Ok” seçeneğini seçtikten sonra Docker Hyper-V kurulumuna başlıyor. Hyper-V kurulumu için Windows yeniden başlatılacak. Eğer donanımsal olarak sanallaştırma makinanızda açık değilse sanallaştırma hatası alacaksınız. Bu hatayı düzeltmek için BIOS ayarlarınızdan “Hardware Assisted Virtualization” ve Data Execution Protection” özelliklerini açmanız gerekir. Makinayı yeniden başlatıp bu ayarları yapabilirsiniz. Eğer bu özellikler zaten açık ise hatasız kurulum tamamlanacak. İşletim sistemi açıldıktan sonra Docker servislerinin açılması için kısa bir süre bekleyin. Docker çalıştıktan sonra karşımıza docker hub “Login” ekranı gelir. Burda sizden Docker ID’ niz ile oturum açmanız istenir. Eğer bir ID’niz yoksa cloud.docker.com adresinden oluşturabilirsiniz. Bu ID sizin Docker Hub’ a erişmenizi sağlar. Docker Hub’dan Repository, container imajlarınıza erişebilirsiniz. Eğer bu işlemleri yapmayacaksanız hesaba giriş yapmanıza gerek yok. Docker kurulumu test etmek için bir komut satırı veya Powershell ekranı açıyoruz. “Docker version” komutunu çalıştırdığımızda bize Docker kurulumumuz ile ilgili bilgileri gösteriyor. Docker hub üzerinden hello-world image çekip bir container üzerinde çalıştığını test edebilirsiniz. --docker versiyonuna bakılıyor docker --version --hello-world imajı docker hub üzerinden indiriliyor docker run hello-world --local ortama indirilen docker imajlar listeleniyor docker image ls --hello-world containerı listeleniyor docker container ls --all https://docker-docs.netlify.app/docker-for-windows/




spacer

Pod Yaşam Döngüsü ve Probe Kavramı

Pod Statüleri:

Podlar oluşturulurlar ve sonlandırılırlar. Bu yaşam döngüsü boyunca 5 çeşit Pod statüsü vardır.

Pending:             Kubernetes tarafından pod kabul edildi anlamına gelir. İlk statüdür.

Running:             Pod ile Node ilişkilendirildi anlamına gelir. Containerler yaratılmıştır.

Succeeded:         Tüm containerler sonlandırıldı ve yeniden başlatılmayacak.

Failed:                 Tüm containerler sonlandırıldı ve sonlandırılırken en az 1 tanesi hata verdi.

Unknown:          Pod’un durumu alınamıyor anlamına gelir. Pod’un çalıştığı Node bilgisi okunamıyor.

 

Probe Statüleri:

Kubernetes Pod’un durumunu öğrenmek için probe denilen kavramı kullanır.

Probe periyodik olarak cluster üzerinde tarama (diagnostic) işlemidir.

Probelar Success, Failure ve Unknown olarak 3 şekilde dönüş değeri alırlar.

3 çeşit Probe statüsü vardır.

Liveness Probe:                 Sağlıklı çalışıyor mu? Beklendiği gibi çalışıyor mu?

Readiness Probe:             Pod request kabul edebilir mi?

Startup Probe:                  Container içindeki uygulama başarılı olarak çalışıyor mu?

 

Probe Yöntemleri:

ExecAction:                        Container içinde bir execution yapma yöntemi

TCPSocketAction:            Container’ın IP adresi ve portu kullanılarak TCP kontrolü yapma yöntemi

HTTPGetAction:               Container’a http request gönderme yöntemi








spacer