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>