31 Ağustos 2019 Cumartesi

Docker Giris

Bir docker file olusturup icine komutlar yazalim ve daha sonra calistiralim. Dockerfile isimleri su sekilde ve harflerde ayni duzende olmalidir : Dockerfile

Her bir komut yeni bir layer olusturur.

nano Dockerfile diyerek bir docker file olsuturduk. Icine yazacagimiz komutlar asagidaki gibi olsun.


from ubuntu:16.04

cmd apt-get -y update

cmd echo Hello World

simdi ise kaydedip cikalim. Once dockerfile i build edelim asagidaki komutla

docker build -t img_example .

Sending build context to Docker daemon  2.048kB
Step 1/3 : from ubuntu:16.04
 ---> 5e13f8dd4c1a
Step 2/3 : cmd apt-get -y update
 ---> Running in 8b7283465728
Removing intermediate container 8b7283465728
 ---> 4a2d9530a53f
Step 3/3 : cmd echo Hello World
 ---> Running in b9cd40bf569c
Removing intermediate container b9cd40bf569c
 ---> 78036c5dc14e
Successfully built 78036c5dc14e
Successfully tagged img_example:latest

Seklinde cikti verir. simdi ise dockerfile i run edebiliriz asagidaki komutla .


docker run img_example

Hello World

ciktiisni verir. Gordugumuz gibi once bir docker file olusturup icine komutlar yazdik ve build ederek img_example adinda bir image olusturduk. Daha sonra ise bu image i run ederek container olusturduk.

Konsola 

docker images

yazdigimizda calisan image lari goruruz. Demin olsuturdugumuz img_example ise listede yer aliyor.

DockerHub dan image cekmek icin pull komutu kullanilir. Ornegin hello-world isimli image i cekmek icin

docker pull hello-world

komutunu kullaniriz.

Calisan container lari gormek icin

docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES


komutunu yazariz. Eger container imiz sadece isini yapip bittiyse (yukaridaki img_example da oldugu gibi sadece hello world yazdiysa) o zaman burada bir sonuc alamayiz. Bu zamana kadar calismis olan tum container lari gormek icinse

docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS               NAMES
5c13beabc37d        img_example         "/bin/sh -c 'echo He…"   40 minutes ago      Exited (0) 39 minutes ago                          nostalgic_mestorf
0a8eedfe8db8        img_expose2         "/bin/sh -c 'echo He…"   About an hour ago   Exited (0) About an hour ago                       gifted_curran
24ec81246355        hello-world         "/hello"                 About an hour ago   Exited (0) About an hour ago                       upbeat_knuth
ced196ddfa65        5bd8ab9d6558        "nginx -g 'daemon of…"   26 hours ago        Exited (0) 23 hours ago                            cont_nginx-A
25af563802d9        busybox:latest      "sh"                     26 hours ago        Exited (137) 23 hours ago                          mybusybox
6ff3b01be5d0        img_apache          "/usr/sbin/apache2 -…"   6 days ago          Created                                            cont_apache
df6749d93413        img_run-env         "bash"                   6 days ago          Exited (0) 6 days ago                              cont_run-env
a19f93320a4f        nginx:latest        "nginx -g 'daemon of…"   7 days ago          Exited (0) 6 days ago                              web-server-nginx
a623a065a0a3        hello-world         "/hello"                 7 days ago          Exited (0) 7 days ago                              relaxed_maxwell

yazariz. Burada calismiyor olsa da bir ara calismis olan container lari gorebiliriz.

Sonlanmis olan bir container i tekrar baslatmak icinse docker ps -a komutundan id sini kopyalayip

docker start -a 5c13beabc37d

yazarak yeniden baslatabiliriz.

Container i silmek icinse

docker rm 5c13beabc37d

ile container_id sini yazarak silebiliriz. Eger container calisir halde ise once stop edip daha sonra silebiliriz. Stop etmek icinse

docker stop 5c13beabc37d

yazariz.


Docker CLI - Cheat Sheet (Kopya Kağıdı)

KomutAçıklaması
docker imagesLokal registry’de mevcut bulunan Image’ları listeler
docker psHalihazırda çalışmakta olan Container’ları listeler
docker ps -aDocker Daemon üzerindeki bütün Container’ları listeler
docker ps -aqDocker Daemon üzerindeki bütün Container’ların ID’lerini listeler
docker pull <repository_name>/<image_name>:<image_tag>Belirtilen Image’ı lokal registry’ye indirir. Örnek: docker pull gsengun/jmeter3.0:1.7
docker top <container_id>İlgili Container’da top komutunu çalıştırarak çıktısını gösterir
docker run -it <image_id|image_name> CMDVerilen Image’dan terminal’i attach ederek bir Container oluşturur
docker pause <container_id>İlgili Container’ı duraklatır
docker unpause <container_id>İlgili Container pause ile duraklatılmış ise çalışmasına devam ettirilir
docker stop <container_id>İlgili Container’ı durdurur
docker start <container_id>İlgili Container’ı durdurulmuşsa tekrar başlatır
docker rm <container_id>İlgili Container’ı kaldırır fakat ilişkili Volume’lara dokunmaz
docker rm -v <container_id>İlgili Container’ı ilişkili Volume’lar ile birlikte kaldırır
docker rm -f <container_id>İlgili Container’ı zorlayarak kaldırır. Çalışan bir Container ancak -f ile kaldırılabilir
docker rmi <image_id|image_name>İlgili Image’ı siler
docker rmi -f <image_id|image_name>İlgili Image’ı zorlayarak kaldırır, başka isimlerle Tag’lenmiş Image’lar -f ile kaldırılabilir
docker infoDocker Daemon’la ilgili özet bilgiler verir
docker inspect <container_id>İlgili Container’la ilgili detaylı bilgiler verir
docker inspect <image_id|image_name>İlgili Image’la ilgili detaylı bilgiler verir
docker rm $(docker ps -aq)Bütün Container’ları kaldırır
docker stop $(docker ps -aq)Çalışan bütün Container’ları durdurur
docker rmi $(docker images -aq)Bütün Image’ları kaldırır
docker images -q -f dangling=trueDangling (taglenmemiş ve bir Container ile ilişkilendirilmemiş) Image’ları listeler
docker rmi $(docker images -q -f dangling=true)Dangling Image’ları kaldırır
docker volume ls -f dangling=trueDangling Volume’ları listeler
docker volume rm $(docker volume ls -f dangling=true -q)Danling Volume’ları kaldırır
docker logs <container_id>İlgili Container’ın terminalinde o ana kadar oluşan çıktıyı gösterir
docker logs -f <container_id>İlgili Container’ın terminalinde o ana kadar oluşan çıktıyı gösterir ve -f follow parametresi ile o andan sonra oluşan logları da göstermeye devam eder
docker exec <container_id> <command>Çalışan bir Container içinde bir komut koşturmak için kullanılır
docker exec -it <container_id> /bin/bashÇalışan bir Container içinde terminal açmak için kullanılır. İlgili Image’da /bin/bash bulunduğu varsayımı ile
docker attach <container_id>Önceden detached modda -d başlatılan bir Container’a attach olmak için kullanılır
Kaynak : http://gokhansengun.com/docker-nedir-nasil-calisir-nerede-kullanilir/



Guzell bir paylasim icin : http://devnot.com/2016/container-dunyasi-ve-docker/



Bir java dosyasini docker ile calistirmak icin oncelikle HelloWorld.java adinda bir mesaj yazan class hazirladim. Daha sonra bu class ile ayni yerde Dockerfile i olusturdum. Dockerfile icerigi ise asagidaki gibi:

FROM java:8

COPY . /var/www/java

WORKDIR /var/www/java

RUN javac HelloWorld.java

CMD ["java", "HelloWorld"]


Daha sonra bu file i build etmek icin 

>> docker build -t java_image .

komutunu yazdim ve result su sekilde islendi, layerlar olustu.

Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM java:8
8: Pulling from library/java
5040bd298390: Pull complete 
fce5728aad85: Pull complete 
76610ec20bf5: Pull complete 
60170fec2151: Pull complete 
e98f73de8f0d: Pull complete 
11f7af24ed9c: Pull complete 
49e2d6393f32: Pull complete 
bb9cdec9c7f3: Pull complete 
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Downloaded newer image for java:8
 ---> d23bdf5b1b1b
Step 2/5 : COPY . /var/www/java
 ---> f487f57babf0
Step 3/5 : WORKDIR /var/www/java
 ---> Running in d5f829de0e7a
Removing intermediate container d5f829de0e7a
 ---> 4daf9cf6c419
Step 4/5 : RUN javac HelloWorld.java
 ---> Running in 4d60b3d49da8
Removing intermediate container 4d60b3d49da8
 ---> 7dea627b45be
Step 5/5 : CMD ["java", "HelloWorld"]
 ---> Running in 7877c5a6db47
Removing intermediate container 7877c5a6db47
 ---> 4bc0d25a7db7
Successfully built 4bc0d25a7db7
Successfully tagged java_image:latest

Daha sonra ise olusan image i asagidaki komutla run ettim:

>> docker run java_image

Hello Docker World!

Ciktisini aldim. 

18 Ağustos 2019 Pazar

12 Ağustos 2019 Pazartesi

Java 8 -- STREAM EXAMPLES




Asagidaki sekilde bir kod NullPointerException verir. Cunku array initialize edilmeden index teki degerine ulasilmaya calisiliyor.



Bunu onlemek icin Optional kullanabiliriz.





Bu sekilde yazdigimizda ise 3.index bos degilse if icine girip 3.indexin degerini yazar. Bos ise nullpointerexception vermeyecek, hic bir sey yapmadan hatasiz sonlanacaktir.

Eger lambda expression tek satirsa { suslu paranteze gerek yok.
Return type ve input type a gerek yok.
method un access modifier icermesine gerek yok(public, private vs)
Lambda expression in bir degiskene atanmasi gerekir.

public void showMsg(String name){
    System.out.println("Hello "+ name);
}

Bu kod satiri su hale gelir:

OrnekClass ornekClass = name -> System.out.println("Hello "+ name);

FunctionalInterface

Sadece bir tane abstract method iceren interface dir. Interface in uzerine @FunctionalInterface eklenir.

Ayni islemin Java8 den once ve Java 8 ile nasil yapildgini gosteren 2 resim asagidadir. Java8 ile interface implementation icin farkli bir sinifa ihtiyac duymayiz, gerekli sinifta implement edebiliriz.








Function Interface

FunctionInterface bir input ve output tan olusan interface dir.

Function<T, R> seklinde T: input, R: output type i belirtir. Asagida sayinin karesini bulan bir ornek var hem java8 den once hem de java8 ile.  Kare bulmak icin bir tane input girer ve sonucta bir output aliriz. Bu yuzden FunctionInterface bize uygundur. Avantaji ise gordugumuz gibi Java8den once islemi yapmasi icin yeni bir method olusturduk. Java8 ile yeni bir method olusturmaya gerek olmadan predefined methodlarla ihtiyacimizi karsiladik.



Output: Square of number is :25
             Square of number is :25


Function Interface in apply disinda diger bir default methodu olan andThen() methoduna bakalim.  Eger bir method output unun diger bir methoda input olmasini istiyorsak andThen() kullaniriz.



Output : Function1: HELLO
              Function2: HELLO WORLD

Diger bir method ise compose() . andThen in tam tersi seklinde calisir. Once diger method calisir. Yukardaki ornek icin konusursak once function2 calisacak yani "hello WORLD" elde edicez daha sonra function1 calisip hepsini uppercase yapicak ve "HELLO WORLD" elde edicez.

Kullanimi ise ayni andThen seklinde sadece yerine compose yazilir.

Supplier Interface 

Burada ise sadece output vardir. Herhangi bir input yoktur.



Consumer Interface

Supplier in tam tersine tek bir input alir ve hic bir output dondurmez.



ForEach 




Default Interface

Java da interface genel bir taslaktir. Methodlar sadece tanimlanir. Icerikleri ise interface leri implemente eden siniflarda kodlanir. Ama interface lerin soyle bir dezavantaji var ; Interface de tanimlanan tum methodlar implemente edilmek zorunda yoksa compilation hatasi verir. Simdi soyle bir case dusunelim. Diyelim ki ilerde interface e yeni bir method eklememiz gerekiyor. Bu durumda diger tum classlar bu methodu implemente etmek zorunda yoksa compile time hatasi alir. Bu hem cok uzun olur hem de stakeholder lar tarafinda kabul edilmeyebilir. Bu durumda Java 8 ile gelen yeni bir ozellik olan default kullanabiliriz. Interface deki methodun basina default yazarak methodun default calismasini interface icersinde kodlariz. Bu sekilde bir implementasyonu oldugu icin diger class larda implemente edilmese de sorun yaratmaz, isteyen de implemente edebilir.





Static Method

Interface lerde static methodlar tanimlanabilir. Bu methodlarin icerigi interface de tanimlanmak zorundadir. Ve onu cagiran classlarda static methodlar override edilemez. Icerigi degistirelemez cunku compile hatasi verir. Static methodlar icinden non-static methodlara erisilemez. Interface de yer alan static methodlara erismek icin obje olusturmaya gerek yoktur, interfaceAdi.methodAdi seklinde erisilir.