Dockerfile Komutları Nelerdir, Nasıl Hazırlanır?
1

Dockerfile, basit bir metin dosyasıdır. Uygulamaların imajını oluşturmak için bu dosya kullanılır. docker build komutu ile bu dosya içerisindeki Instruction’lar (komut) Docker Daemon tarafından okunup adım adım çalıştırılarak imaj oluşturulur. Bu dosya içerisindeki her bir komut satırı bir katmana karşılık gelmektedir. İmajlar da Dockerfile’ın içerisindeki komut satırlarından yani katmanlardan oluşur. Dockerfile nasıl hazırlanır, temel olarak kullanılan komutlar nelerdir inceyelim.

FROM: Baz alacağımız imajı çekmek için bu komut kullanılır. Bu satırdan sonra yazılan komutlar bu imaj tarafından kullanılır. Bu yüzden Dockerfile’daki ilk komut FROM olmalıdır. Dockerfile birden fazla imaj içerebileceğinden bu komut birden fazla kullanılarak Base imajlar Docker Hub üzerinden çekilebilir.

NOT: Base imaj, kullanacağımız tüm imajları kapsayıcı bir imajdır. Örneğin, Centos gibi hazır bir imaj olabilir, ihtiyaçlara göre bu hazır imaj düzenlenebilir veya sıfırdan kendi Base imajımızı oluşturup kullanabiliriz.

Kullanışı:

FROM baseImage
FROM baseImage:tag
FROM baseImage@digest

MAINTAINER: Imajı oluşturan kişinin adını veya mailini yazmak için bu komut kullanılır.

Kullanışı:

    MAINTAINER name

RUN: Yeni bir katman ve imaj oluşturarak parametre olarak aldığı komutları çalıştırır. Genellikle yazılım paketlerini indirmek için kullanılır.

Kullanışı:

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

WORKDIR: Bu komut ile Working Directory’i değiştirilir. Container içerisinde belirtilen bu Path’e geçiş yapılır. Eğer belirtilen Path mevcut değilse öncelikle oluşturulur sonrasında bu Path’e geçiş yapılır.

Kullanışı:

WORKDIR /path/to/workdir

WORKDIR relative/path

COPY: Host üzerindeki dosyaları veya klasörleri kaynak adresinden imaj sistemdeki hedef adrese kopyalanması sağlar.

Kullanışı:

COPY tilda.txt /absolute/path

COPY tilda.txt relative/to/workdir

ADD: COPY komutu ile aynı işlemi yapar. Buna ek olarak internet üzerindeki dosyaların indilerek imaj sistemdeki hedef adrese kopyalanmasını sağlar.

NOT: Container içerisine eklenmesini istemediğimiz dosyalar
.dockerignore
isimli dosya içerisinde belirtilebilir. .dockerignore örneğini yazının devamında örnek üzerinde göreceğiz.

Kullanışı:

ADD http://example.com/tilda.tar.gz /absolute/path

ADD tilda.txt /absolute/path

ADD tilda.txt relative/to/workdir

CMD: Default çalıştırabilir bir imaj oluşturur. Container için Default bir parametre veya komut geçmek istenildiği zaman kullanılır. Kullanıcı isterse imajı çalıştırırken bu Default komutu veya parametreyi ezebilir. Dockerfile içerisinde sadece bir tane CMD komutu kullanılabilir. Birden fazla kullanılıyorsa da en son kullanılan CMD komutu geçerli olacaktır.

Kullanışı:

CMD [ “/bin/ls”, “-l” ]

ENTRYPOINT: Çalıştırılabilir bir imaj oluşturulur. Imaj çalıştırıldığında bu komut aracığıyla spesifik olarak verilen komutları ve parametreleri kullanarak yaşam döngüsüne devam eder. Kullanıcı imajı çalıştırdığında –entrypoint parametresini geçmeden bu komutu veya parametreleri direkt olarak ezemez. CMD ile bu yönden farklıdır.

Kullanışı:

    ENTRYPOINT [ “/opt/app/run.sh”, “–port”, “8080” ]

Eğer hem Default parametre geçmek isteyip hem de spesifik bir komut çalıştırma ihtiyacı duyulursa ENTRYPOINT ve CMD komutları beraber kullanılabilir. Yazının ilerleyen kısımlarında bunu uygulamalı olarak göreceğiz.

Bir diğer detay ise bu iki komut iki farklı kullanım şekline sahip. Shell ve Exec format olarak iki kullanım şekli mevcut. Performans açısından genellikle Exec formatı önerilir.

CMD echo “MSHowto”      à (Shell Form)

CMD [“echo”, ” MSHowto”] à (Exec Form)

ENTRYPOINT echo ” MSHowto” à (Shell Form)

ENTRYPOINT [“echo”, ” MSHowto”] à

(Exec Form)

EXPOSE: Container çalıştığında hangi portu dinlemesi gerektiğini bu komut aracağıyla belirtiriz.

Kullanışı:

EXPOSE 8080

EXPOSE 80 443 22

EXPOSE 7000-8000

ENV: Environment Variable (Değişken) oluşturmak için kullanılan bir komuttur. Key – Value şeklinde kullanılır.

Kullanışı:

    ENV TZ=Europe/Istanbul

Dockerfile Kullanarak Imaj Oluşturma ve Bir Uygulamayı Containerize Etme

Temel olarak ihtiyaç duyulan komutlara değindik. Şimdi bu komutları kullanarak Python
Flask ile geliştirmiş olduğum basit programı Container içerisinde çalıştıralım. Bu Python uygulamasının amacı bugünün tarihini ve o anın saatini getirmek. Basit bir Web uygulaması olan bu projemiz aşağıdaki gibi 5 tane dosya içeriyor.

Resim-1 Projenin içerdiği dosyalar

getDate.py dosyayı Python kodlarımızı içeren dosya. Requirement.txt içerisinde Flask’ın ihtiyaç duyduğu paketleri ve versiyon bilgilerini içeren bir dosya. Dockerfile ve .dockerignore dosyalarının ne için kullanıldığından yukarıda detaylıcı bahsetmiştik.

Resim-2 Dockerfile

Resim-3 .dockerignore

Bu projeyi Github’a yükledim. Oradan siz de bu dosyalara erişip aşağıdaki komutları kullanarak uygulamayı ayağa kaldırabilirsiniz. Linke yazının en altından erişim sağlayabilirsiniz.

Şimdi Dockerfile’ı kullanarak Python Flask uygulamamızın imajını oluşturalım.

Resim-4 docker build -t <imagename:tag> -f Dockerfile .

Oluşturmuş olduğumuz bu imajı kullanarak bir Container ayağa kaldıralım.

Resim-5 docker run -d -p ExternalPort:InternalPort <imagename:tag>

Burada gördüğünüz gibi Dockerfile içerisinde geçmiş olduğumuz CMD ve ENTRYPOINT komutları Container’ın Command kısmında gözüküyor.

Container’a docker exec komutu ile giriş yapalım ve Dockerfile’da kullandığımız komutlar işe yaramış mı bakalım.

Resim-6 docker exec -it <container_id> bash

Working Directory’i /app olarak gözüküyor. Ayrıca .dockerignore içerisinde vermiş olduğumuz yönergeler de işe yaramış. Container içerisine ADD komutu ile Dockerfile kopyalanmamış. Her şey tam da beklediğimiz gibi. Şimdi uygulamamız çalışıyor mu hemen onu kontrol edelim.

Resim-7 http://localhost:5000

Uygulamamızı 5000 portundan hizmeye sunduğumuz için http://localhost:5000 üzerinden uygulamamıza istek atabildik. Başarılı bir şekilde cevap döndüğünü gördük. Uygulamamız beklediğimiz gibi docker containireze edebildik ve o anın tarihini ve zamanını aldık.

Uygulama yaptığımız örnek proje kodlarına aşağıdaki Github linki üzerinden erişim sağlayabilirsiniz.

Github Linki : https://github.com/gokcedemir/Get-Current-Time-And-Date.git

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

www.mshowto.org

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

https://phoenixnap.com/kb/docker-cmd-vs-entrypoint

TAGs: Dockerfile, Container, Image, Python, Flask, Dockerfile nasıl hazırlanır, Dockerfile Nedir, Dockerfile Best Practices, CMD vs ENTRYPOINT, ADD vs COPY, Dockerfile Komutları

Bu İçeriğe Tepkin Ne Oldu?
  • 38
    harika_
    Harika!!
  • 6
    be_enmedim
    Beğenmedim
  • 2
    _ok_iyi
    Çok iyi
  • 0
    sevdim_
    Sevdim!
  • 1
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 2
    k_zd_m_
    Kızdım!

Gökçe Demir. 1996 İstanbul doğumluyum. Gebze Teknik Üniversitesi Bilgisayar Mühendisliği bölümü mezunuyum. Stajlarımı Logo Siber Güvenlik ve Ağ Teknolojileri A.Ş. ve Intertech'in Network Güvenlik Operasyonları bölümünde tamamladım. Üniversitenin 3. sınıfından itibaren Intertech'te Yazılım Süreçleri bölümünde Junior DevOps Mühendisi olarak 2 yıl çalıştım. 2019 yılında mezun oldum. Aynı bölümde Devops Mühendisi olarak tam zamanlı çalışmaya başladım ve bu pozisyonda çalışmaya devam ediyorum. Aynı zamanda Türkiye'nin Mühendis Kızları projesinde gönüllü olarak üniversite öğrencilerine mentorlük yapmaktayım.

Yazarın Profili
İlginizi Çekebilir

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Yorumlar (1)

  1. 03/02/2022

    Merhaba, elimizde var olan sh dosyasına göre Dockerfile nasıl oluşturabiliriz?

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir