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