18 Ağustos 2016 Perşembe

Docker imajın boyutu nasıl küçültülür?

  Dockerfile da yazdığımız her bir komut katman oluşturur. Her katmanda diskte fazladan yer gerektirir. Boyutu küçültmek için bazı şeyler yapabiliriz:

 -Komutları ayrı ayrı yazmak yerine tek bir komutta birleştimek:

RUN apt-get update && apt-get -y install curl
RUN curl https://download.elastic.co/kibana/kibana/$KIBANA_FILE --output $KIBANA_FILE
RUN tar -xzf $KIBANA_FILE -C $KIBANA_EXTRACT_DIR

 yapmak yerine :

RUN apt-get update && apt-get -y install curl && \
       curl https://download.elastic.co/kibana/kibana/$KIBANA_FILE --output $KIBANA_FILE && \
        tar -xzf $KIBANA_FILE -C $KIBANA_EXTRACT_DIR


 -Kullandığımız alt katmanı olabildiğince küçük boyutlu seçmek:

debian -> 125.1 MB
ubuntu -> 187.9 MB
alpine -> 4.79 MB
busybox -> 1.114 MB
fedora -> 206.3 MB
opensuse -> 96.14 MB

 -İndirilen araçları işlemini yaptıktan sonra silmek:
   
RUN apt-get update && apt-get -y install curl && \
    curl https://download.elastic.co/kibana/kibana/$KIBANA_FILE --output $KIBANA_FILE && \
    tar -xzf $KIBANA_FILE -C $KIBANA_EXTRACT_DIR && \
    apt-get clean curl && \   #curl işlemi bittiği için siliyoruz
    rm -rf /var/lib/apt/lists/*

 -Paket listelerini kaldırmak:

Dockerfile içinde RUN la birlikte install yaptıktan sonra oluşan paket listeleri 
rm -rf /var/lib/apt/lists/*
şeklinde kaldırılır

1 Ağustos 2016 Pazartesi

CMD vs ENTRYPOINT - CMD vs RUN

CMD vs ENTRYPOINT


CMD : Komutta argüman belirtmeden konteynerı çalıştırdığınızda  yürütülecek bir varsayılan komutu ayarlamamızı sağlar. Eğer bir argüman ekleyerek çalıştırıyorsak CMD göz ardı edilecektir. Çalıştırılabilir kabuk olarak  /bin/sh veya /bin/bash kullanıyor.Çalıştırırken -i -t kullanıdığımız zaman etkileşimli kabuğa düşer.    


ENTRYPOINT : Konteyner başlatıldığında çalışan bir komut belirtir. Sadece konteynerı çalıştırmak için güçlü bir mesaj gönderir.


FROM ubuntu:trusty
CMD ping localhost


$ docker run -t demo


Konteynerı başlattığında ping in otomatik olarak çalıştığını görebiliriz. Böylece esneklik kazanılır.


$ docker run demo hostname
Burda CMD geçersiz olacak ve hostname pinglenecek.


Bunu ENTRYPOINT la da yapabiliriz ama --entrypoint flagını kullanmamız gerek.
$ docker run --entrypoint hostname demo


CMD and ENTRYPOINT

Dockerfile da ENTRYPOINT yoksa CMD varsayılan argümandır. İkisi birlikte çalışıyorsa  varsayılan argüman olarak ENTRYPOINT seçilir. Böylece ENTRYPOINT konteyner başlatıldığında çalışan bir komut belirtir. CMD de ENTRYPOINT ı beslenmesi için argüman belirtir.



CMD vs RUN


RUN image i oluşturmak için çalışır. Komutu çalıştırır, işler ve sonuçlar. Böylece image üstünde katman oluşur. CMD ise build sırasında bir şey gerçekleştirmez ama image için istenilen komutu belirtir.

29 Temmuz 2016 Cuma

Dockerfile ile ilgili 2 Bilgi

ADD vs COPY

Dockerfile dosyalarının komutları olan ADD ve COPY birbirlerine çok benzerdir.

Farkları nelerdir?
COPY yerelimizdeki dosyaları kopyalar.
ADD yereldeki dosyaları, uzaktaki URL leri ve tar dosyalarını kopyalar.

COPY nin daha transparan bir yapısı olduğu için yani basit bir kopyalama işlemi yaptığı için COPY tercih ediliyor genelde.

Örnek:
COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/

ADD http://example.com/big.tar.xz /usr/src/things/
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all

Eğer URL kopyalamayı COPY ile yaparsak böyle bir hata alırız:
Source can't be a URL for COPY
 

Neden paket listeleri kurulu olarak gelmiyor?

Paketler önbellekte bulunmaz ama gerekirse indirilir. Böylelikle imagelerin büyümesi engellenir ve kazanç sağlanır.

Güncellemeye ve indirmeye örnek:
RUN apt-get update && apt-get install -y \
                 apache2

28 Temmuz 2016 Perşembe

Docker -3 (ilk image)

               
İlk imajımı oluşturdum. Apache imajı.

Dockerfile şöyle: (github linki->

FROM debian:jessie

RUN apt-get update && apt-get install -y \
    apache2

CMD ["apachectl","-D","FOREGROUND"]

EXPOSE 80

Açıklama
FROM : her dockerfile da bulunması gereken bir komut ve başlamak istediğimiz imajı belirtir.

RUN: apache'nin kurulumu ile ilgili gerekli olan satırlar.

CMD: konteyner çalıştığında çalışan bir komut olduğu için apache'nin çalışmasını sağlayan parametreler. Sadece imaj için amaçlanan bir komut.

EXPOSE: hangi portta çalışması gerektiğini açıklayan komut.

19 Temmuz 2016 Salı

Docker -2



Docker'ın genel amacı uygulamaları ayrı ayrı konteynerların içine koyup konteynerları yönetmek. Yani her konteynerın içinde sadece tek uygulamanın kodu olur. Birden fazla da uygulamanın kodu konulabilir ama genel mantık tek tek olmasıdır. Konteyenerlar işletim sistemine gerek duymaz. Buda zamandan avantaj sağlar. Konteynerlar kendi aralarında izoledirler. Yani çalışan bir konteyner diğer bir konteynerı etkilemez ve ondan haberdar değildir. İstenilirse konteynerlar birbirine bağlanabilir.


Docker istemci-sunucu mimarisi kullanır.




Docker istemci(client), docker daemonla konuşur. Docker istemci ve daemon ikiside aynı sistem üzerinde çalışabilir ya da docker istemcisini uzak bir docker daemon a bağlayabilirsiniz. Docker istemci ve daemon soketleri üzerinden ya da RESTful API üzerinden iletişim kurar.


Docker Image:
Salt okunur bir şablondur. Yazılımlarımızı yüklediğimiz bir sistemdir. Imageler konteynerları oluşturmak için kullanılır. İstersek imageleri kendimiz oluşturabilir istersek hazır olanları alıp kullanabiliriz.
 
Her bir image katmanları bir dizi içerir. Bir docker image için değişiklik yaptığımızda  yeni bir katman oluşur. Imageler konteynerların ne tuttuğunu docker'a anlatır.


Docker Konteyner:
Bir docker image'i üzerinde koştuğunuz bir dizi komutun sistemdeki diğer tüm servislerden izole çalıştığı, sanal ortamdır.


Docker Registry:
Docker imagelerinizi depoladığınız, push-pull işlemlerini yaptığınız depodur.


Docker Daemon:
Ana makine üzerinde çalışır. Daemon ile doğrudan etkileşim kurulamaz ancak docker istemci ile ulaşılabilir.


Docker İstemci(client):
Birincil kullanıcılar için docker arayüzüdür. Kullanıcılardan komutları alır ve sonra docker daemon ile iletişime geçmeyi sağlar.


Kitematic:
Docker konteynerları oluşturmak, çalıştırmak için kullanabileceğiniz ve Docker Hub görüntüleri bulmak ve çekmek için bir GUI.


Dockerfile:
Bir image oluşturulduğunda yapılacak talimatları içeren çekirdek dosyasıdır.


Dockerfile örneği:


FROM ubuntu:latest


MAINTAINER Scott P. Gallagher <email@somewhere.com>


RUN apt-get update && apt-get install -y apache2


ADD 000-default.conf /etc/apache2/sites-available/
RUN chown root:root /etc/apache2/sites-available/000-default.conf


EXPOSE 80
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]


FROM: konteyner oluştururken başlamak istediğimiz image'i belirtir. İstersek sürümünüde belirtebiliriz.
MAINTAINER: dockerfile oluşturan kişiye ait bilgiler.
RUN: çalıştırılacak komutlar.
ADD, RUN: özel yapılandırma ekleri için gerekli olan satırlar
CMD: konteyner başlatıldığında çalıştırılan komutun tanımlanmasını sağlar.

Docker Machine:
Docker hostları oluşturmayı sağlayan bir yapıdır ve Docker Engine bunun üzerine kurulur.


Docker Engine:
Bir istemci-sunucu uygulaması. Deamon oluşturur ve docker nesnelerini yönetir. Docker nesneleri: image, konteyner, network...


Bazı Docker komutları


docker versiyonunu gösterir:
docker version


tüm komutlar hakkında bilgi almak için:
docker --help


bir komut hakkında bilgi almak için:
docker <command> --help


image için arama:
docker search <image_name>

image indirmek için:
docker pull <image_name>


image silmek için:
docker rmi <image_name>


hostaki imageleri görmek için: 
docker images
çalışan konteynerları görmek için:
docker ps


tüm konteynerları görmek için(çalışmayanlarda dahil):
docker ps -a


konteynerı calıştırmak için:
docker run -i -t <image_name>:<tag> /bin/bash/


docker run -d -p <host_port>:<container_port> <image_name>:<tag>


-d konteynerları sürekli olarak çalışmasını sağlar. Tek sefer çalıştırmak için -it kullanılabilir. -p host portları ile konteyner portlarını eşleştirmeyi sağlar.


konteyner silmek için:
docker rm <container_id>

konteyner üzerinde shell komutu çalıştıramak için:
docker exec -it <container_id> /bin/bash
bu sekilde bağlandığımızda root ile konteyner ssh üzerinden bağlanmış oluyoruz.


Konteynerları başlatmak için:
docker start <container_id>

konteynerı durdurmak için:
docker stop <container_id>

29 Haziran 2016 Çarşamba

Docker -1

Docker, bir uygulamanın her platformda çalışabilmesini sağlayan ve gerekli olan her şeyi paketleyen bir sistemdir. Açık kaynak Apache 2.0 lisansıyla lisanslanmıştır.


Docker yazılımını yükledikten sonra dockher hubta hazır bulunan imageleri çalıştırabilirsiniz. Eğer kendi imagenizi oluşturup herkesle paylaşmak isterseniz, docker hub hesabı ve image deposu oluşturup oluşturduğunuz imageleri buraya atabilirsiniz.


Sanal makinelerden farkı nedir?


Sanal makineler gibi benzer bir kaynak izolasyon ve tahsis faydaları vardır. Ama sanal makinelere göre çok daha küçük, çok daha verimli konteyner yapılar olduğu için taşınabirliği daha fazladır.









Docker yapısında, sanallaştırmanın sahip olduğu Hypervisor yapısına sahip değildir. Hypervisor yerine Engine sistemi aracılığıyla işletim sistemi araçlarına erişmektedir. Böylece daha az kaynak tüketir.


Ubuntu 14.04 için Docker Kurulumu



Bazı ön koşullar vardır:


-Ubuntu sürümü için 64-bit kurulum gerekir.
-Çekirdeğin en az 3.10 olması gerekir.
Bunu öğrenmek için
uname -r


Kuruluma geçersek..


İlk olarak APT kaynaklarını güncelleyelim:
sudo apt-get update

http yöntemiyle APT çalışmalarını sağlamalı ve CA sertifikasını kuralım:
sudo apt-get install apt-transport-https ca-certificates


Yeni bir GPG anahtarı ekleyelim:
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D


/etc/apt/sources.list.d/docker.list dosyası yoksa oluşturalım
burda olan herhangi bir girdi varsa kaldıralım


Ubuntu Trusty 14.04 (LTS)  için:

deb https://apt.dockerproject.org/repo ubuntu-trusty main

girdisini kaydedip çıkalım

APT güncelleyelim:
sudo apt-get update

Varsa eski repoyu temizleyelim:
sudo apt-get purge lxc-docker
apt-cache policy docker-engine

Ubuntu Trusty için önerilen linux-image-extra çekirdek paketini indirelim:
sudo apt-get update


sudo apt-get install linux-image-extra-$(uname -r)


Ubuntu 14.04 için apparmor indirmemiz gerekli:
apt-get install apparmor


Dockerı yükleyelim:
sudo apt-get update

sudo apt-get install docker-engine

sudo service docker star

Doğru bir şekilde çalıştığından emin olmak için:
sudo docker run hello-world