İmajlar kısmında konteynerlarda değişiklikler yaptık ve bunları commit ederek yeni bir imaj oluşturduk. Docker yaptığımız bu işlemleri, bir komut dosyasından alarak tek seferde build etmemizi sağlayan, Dockerfile yöntemini sunar. Dockerfile, basit bir dil kullanır. Her satırda imajı oluşturacak işlemleri sıralarız ve sonunda build işlemini çalıştırıp imajımızı oluştururuz. Dockerfile bir dizinde ya da bir git adresinden alınabilir. Şimdi basit bir örnek olarak nginx kurup içine bir test dosyası atalım ve bir web sunucu imajı oluşturalım.

Önce bir dizin oluşturalım. Dizine yeni imajın adını vereceğim. İçine de bir test sayfası oluşturacağım.

mkdir webserver_test
cd webserver_test
echo "Merhaba Docker" > index.html

Aynı dizin içinde oluşturacağım Dockerfile dosyamın içeriği şu şekilde olacak.

FROM ubuntu
MAINTAINER Volkan Oransoy
RUN apt-get update -qq && apt-get install -y -qq nginx
ADD ./index.html /usr/share/nginx/html/index.html
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
CMD /usr/sbin/nginx -c /etc/nginx/nginx.conf

Aslında kendini açıklayan bir dosya. Ubuntu base imajını kullanıyorum ve sırası ile kurulum basamaklarını yazıyorum. RUN bir komutu çalıştırır. ADD dizinimizdeki dosyayı, konteyner içinde istediğimiz bir yere kopyalar. EXPOSE, konteynerdeki bir portu host sisteme açar. Tüm olası komutları bu linkten görebilirsiniz. https://docs.docker.com/reference/builder/ Artık imajımızı derleyebiliriz.

[root@localhost webserver_test]# docker build -t="volkan/webserver_test" .
Uploading context 3.584 kB
Uploading context
Step 0 : FROM ubuntu
 ---> c4ff7513909d
Step 1 : MAINTAINER Volkan Oransoy
 ---> Using cache
 ---> 4f5c0781af99
Step 2 : RUN apt-get update -qq && apt-get install -y -qq nginx
 ---> Running in 7eecab194545
 ---> 2b488da9730e
Removing intermediate container 7eecab194545
Step 3 : ADD ./index.html /usr/share/nginx/html/index.html
 ---> ec39e576bfe2
Removing intermediate container 1ad1076d6089
Step 4 : RUN echo "daemon off;" >> /etc/nginx/nginx.conf
 ---> Running in d69c5e310535
 ---> b91b50c73a5a
Removing intermediate container d69c5e310535
Step 5 : EXPOSE 80
 ---> Running in e460355c4e6b
 ---> 6c335024d712
Removing intermediate container e460355c4e6b
Step 6 : CMD /usr/sbin/nginx -c /etc/nginx/nginx.conf
 ---> Running in 0b3412b44174
 ---> 82231898e608
Removing intermediate container 0b3412b44174
Successfully built 82231898e608

Görüldüğü gibi adım adım imajımızı oluştudu docker. Her adımda bir commit yaparak katman katman işlemlerimizi tamamladı. Şimdi oluşturduğum imajdan bir konteyner çalıştırıyorum. Buradaki -p anahtarı, konteynerdeki bir portu, host sistemdeki bir port ile eşleştirir.

[root@localhost webserver_test]# docker run --name webserver1 -d -p 80:80 volkan/webserver_test
033b74ac9d87743b53606d75d787982ba18daa57e946ebfd54171b69922af4ea

[root@localhost webserver_test]# docker ps
CONTAINER ID        IMAGE                          COMMAND                CREATED              STATUS              PORTS                NAMES
033b74ac9d87        volkan/webserver_test:latest   /bin/sh -c '/usr/sbi   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp   webserver1

Buraya kadar bir hata almadı iseniz, host sisteminizin 80 portunda, docker konteynerinizde çalışan bir nginx sunucu size cevap verecektir.

Capture4

Eğer Dockerfile’ı ve kullanacağınız dosyaları, github veya bitbucketa atarsanız, Docker Hub size Automated Build adlı özelliğini sunuyor. Docker Hub, her git commitde, reponuzdaki değişikliği algılıyor ve imajınızı tekrar derliyor. Böylelikle Docker Hub’a imajınızı commit etmek yerine, Dockerfile’ınızı git reponuza commit ediyorsunuz. Güzel değil mi? 🙂

Devam edeceğiz….

Docker ile uygulama sanallaştırma – IV Dockerfile

5 thoughts on “Docker ile uygulama sanallaştırma – IV Dockerfile

  • 14 October 2014 at 22:00
    Permalink

    Üstadım emeğine sağlık, bayıldım bu seriye. Devamı ne zaman geliyor?

    Reply
    • 6 November 2014 at 21:29
      Permalink

      Hocam devamı gelecek ama vakit ayıramadık. 🙂 En kısa zamanda diyelim…

      Reply
  • 24 October 2014 at 11:28
    Permalink

    dockers ile alakalı tecrübelerinizi vakit ayırıp, paylaştığınız için yürekten teşekkürler..

    Reply
  • 21 March 2015 at 12:22
    Permalink

    Serinin devamını bekliyorum.
    Host diskini nasıl bağlıyoruz?
    Test için süper, Vagrant gibi çok kaynak tüketmiyor peki canlı ortamlarda kullanmaya başladınız mı? stabil mi?

    Reply
    • 7 April 2015 at 00:16
      Permalink

      Host için volume direktifini kullanmak lazım. Testler için gerçekten iyi. Productionda bir iki ortamda kullanıyoruz. Versiyon 1.0 ile productionda kullanılabilir durumda. Zaten kullanılan bir çok teknoloji olgunlaşmış durumda.

      Reply

Leave a Reply

Your email address will not be published. Required fields are marked *