Dockerfile Nedir? Dockerfile Komutları Nelerdir?

Dockerfile, Docker container'larının oluşturulması için kullanılan yapılandırma dosyasıdır. Dockerfile, uygulamanın nasıl çalıştırılacağını ve hangi bağımlılıklarının yükleneceğini belirtir. Docker, bu Dockerfile'ı kullanarak bir container oluşturur ve bu container'ı image adı verilen dosya haline getirir. Bu image, daha sonra herhangi bir sistemde çalıştırılabilir.

Dockerfile, dosya sistemini tanımlayan bir betik dosyasıdır. Dockerfile, satır satır yapılandırma komutlarından oluşur ve her komut, bir dosya veya dizin oluşturmak, bir dosya veya dizinin içeriğini değiştirmek gibi bir işlemi gerçekleştirir. Dockerfile, uygulamanın nasıl çalıştırılacağını ve hangi bağımlılıklarının yükleneceğini belirtir ve bu sayede, Docker container'ı oluştururken uygulamanın çalışması için gereken her şey dikkate alınır. Dockerfile, ayrıca container'ın içerisinde çalışan süreçleri ve bu süreçlerin nasıl yönetileceğini de belirtir.

Dockerfile işlem süreci

Dockerfile, birçok farklı yapılandırma komutundan oluşur. Örneğin, FROM komutu ile bir container'ın çalışacağı temel image'ı belirtilebilir. RUN komutu ile container içerisinde çalıştırılacak komutlar belirtilebilir. COPY komutu ile container içerisine dosya veya dizin kopyalanabilir. EXPOSE komutu ile container'ın hangi portlardan erişilebileceği belirtilebilir.

Dockerfile Nasıl Oluşturulur?

Basit bir Dockerfile oluşturmak için aşağıdaki adımları izleyebilirsiniz:

  1. Bir dosya oluşturun ve bu dosyaya Dockerfile adını verin.
  2. Dosyanın başına FROM komutunu yazın ve bu komut ile container'ın çalışacağı temel image'ı belirtin. Örneğin, FROM ubuntu:latest komutu ile Ubuntu'nun en son sürümünü kullanacağını belirtmiş olursunuz.
  3. RUN komutları ile container içerisinde çalıştırılacak komutları belirtin. Örneğin, RUN apt-get update komutu ile container içerisinde apt-get paket yöneticisini güncelleyebilirsiniz.
  4. COPY komutları ile container içerisine dosya veya dizin kopyalayabilirsiniz. Örneğin, COPY index.html /var/www/html komutu ile index.html dosyası container içerisindeki /var/www/html dizinine kopyalanabilir.
  5. EXPOSE komutu ile container'ın hangi portlardan erişilebileceğini belirtin. Örneğin, EXPOSE 80 komutu ile container'ın 80. portundan erişilebileceğini belirtmiş olursunuz.
  6. CMD komutu ile container çalıştırılırken çalıştırılacak komutları belirtin. Örneğin, container çalıştığında nginx komutunu çalıştırıyoruz ve "-g" ve "daemon off;" parametrelerini kullanıyoruz.
FROM ubuntu:latest

RUN apt-get update

COPY index.html /var/www/html/

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

Bu adımlar tamamlandıktan sonra, Dockerfile oluşturulmuş olacak ve docker build komutu ile bu Dockerfile kullanarak bir container oluşturulabilir. Örneğin, docker build -t my-app . komutu ile Dockerfile'ın bulunduğu dizinde bir container oluşturulabilir. Bu container'ın adı my-app olacaktır ve docker run komutu ile bu container çalıştırılabilir.

docker build komutu ile Dockerfile dosyasının bulunduğu dizin root dizin kabul edilir

Dockerfile Komutları ve Açıklamaları

Dockerfile'da kullanabileceğiniz bazı önemli komutlar şunlardır:

  • FROM: Bu komut, kullanacağınız temel image'i belirtir. Örneğin, FROM ubuntu:latest gibi.
  • MAINTAINER: Bu komut, Dockerfile'ın yaratıcısının adını ve e-posta adresini belirtir. Örneğin, MAINTAINER İsmet BALAT <bilgi@kerteriz.net> gibi.
  • RUN: Bu komut, container üzerinde komutlar çalıştırmak için kullanılır. Örneğin, RUN apt-get update && apt-get install -y nginx gibi.
  • CMD: Bu komut, container çalıştırıldığında çalıştırılacak komutları belirtir. Örneğin, CMD ["nginx", "-g", "daemon off;"] gibi.
  • EXPOSE: Bu komut, container üzerinde açık olan portları belirtir. Örneğin, EXPOSE 80 gibi.
  • COPY: Bu komut, host sistemindeki dosyaları veya dizinleri containerdaki belirli dizinlere kopyalar. Örneğin, COPY index.html /var/www/html/ gibi.
  • ENV: Bu komut, containerda kullanılacak ortam değişkenlerini tanımlar. Örneğin, ENV MYSQL_ROOT_PASSWORD=secretpassword gibi.
  • ADD: Bu komut, host sistemindeki dosyaları veya dizinleri containerdaki belirli dizinlere kopyalar ve ayrıca URL'leri indirir. Örneğin, ADD https://example.com/myfile.txt /path/in/container gibi.
  • ENTRYPOINT: Bu komut, container çalıştırıldığında çalıştırılacak komutları belirtir. Bu komut, CMD komutu ile birlikte kullanılır. ENTRYPOINT komutu, CMD komutunun argümanlarını alabilir. Örneğin, ENTRYPOINT ["nginx"], CMD ["-g", "daemon off;"] gibi.
  • LABEL: Bu komut, container'a ek meta veri eklemek için kullanılır. Örneğin, LABEL version="1.0" gibi.
  • USER: Bu komut, container üzerinde çalıştırılacak komutların hangi kullanıcı tarafından çalıştırılacağını belirtir. Örneğin, USER root gibi.
  • WORKDIR: Bu komut, container üzerinde komutların çalıştırılacağı varsayılan dizini belirtir. Örneğin, WORKDIR /var/www gibi.
  • ARG: Bu komut, build sırasında kullanılacak değişkenleri tanımlar. Örneğin, ARG version=latest gibi.
  • ONBUILD : Bu komut, bir container üzerinde build yapılırken, o container'ın üstünde build yapılacak container için komutları belirtir.
  • STOPSIGNAL : Bu komut, container'ı nasıl durduracağını belirtir.
  • HEALTHCHECK : Bu komut, container'ın sağlıklı olup olmadığını denetlemek için kullanılır.
  • SHELL : Bu komut, container üzerinde kullanılacak shell'i belirtir. Örneğin SHELL ["/bin/bash", "-c"] gibi.

Bu komutlar sadece bazılarıdır, Dockerfile'da kullanabileceğiniz diğer birçok komut da mevcut. Her komutun amacı ve kullanımı hakkında daha detaylı bilgiye Docker'ın resmi belgelerinden ulaşabilirsiniz. Ayrıca blogumuzdaki detaylı komut  yazılarını da inceleyebilirsiniz:

Docker CMD ve ENTRYPOINT Komutları
Docker CMD ve ENTRYPOINT komutları, Dockerfile içinde belirli bir konteyner için çalıştırılacak komutları tanımlayan iki farklı anahtardır.
Docker COPY ve ADD Komutları
Docker COPY ve ADD komutları ile dosya ve dizinleri konteynerlara kopyalayabilirsiniz.
Docker WORKDIR Komutu
Workdir komutu ile belirtilen dizine kolaylıkla geçiş yapabilirsiniz.
Docker ARG Komutu
Docker ARG komutu ile build aşamasına parametreler ile değer geçebilirsiniz.

Dockerfile Stage Kullanımı

Dockerfile'lar birkaç farklı stage olarak da ayrılabilir. Her stage birbirinden bağımsız olarak çalıştırılabilir ve bu sayede, Dockerfile'ın bir kısmını tekrar tekrar çalıştırmak gerekmez. Örneğin, bir Dockerfile'ın ilk stage'ında bir uygulamanın derlenmesi gerçekleştirilebilir, ikinci stage'ında ise derlenmiş uygulamanın çalıştırılacağı bir container oluşturulabilir. Bu yapılandırma, Dockerfile'ın daha performanslı çalışmasını sağlar.

Aşağıda, bir örnek multi-stage build için bir Dockerfile veriyorum:

# Build stage
FROM golang:latest as builder

COPY . /app
WORKDIR /app

RUN go build -o main .

# Run stage
FROM alpine:latest

COPY --from=builder /app/main /app/main

CMD ["/app/main"]

Bu Dockerfile'da, ilk olarak golang görüntüsünü kullanarak bir derleyici oluşturuyoruz ve uygulamamızı derliyoruz. Bu işlemi gerçekleştiren satırlar FROM golang:latest as builder ile başlar ve RUN go build -o main . ile son bulur. Ardından, alpine görüntüsünü kullanarak çalıştırma için bir container oluşturuyoruz. Bu satırlar FROM alpine:latest ile başlar ve CMD ["/app/main"] ile son bulur. Bu container'ın çalışması için, derleme işlemi sırasında oluşan "main" dosyasını COPY komutu ile alpine container'ına taşıyoruz.

Bu örnekte, derleme ve çalıştırma işlemleri için iki farklı görüntü kullanılmıştır, ve her iki görüntüde de farklı komutlar uygulanmıştır. Bu yüzden multi-stage build yapmış oluruz ve container büyüklüğünü azaltmış oluruz.

🔎
Multi stage Dockerfile kullanımında, sadece son FROM komutundan sonra oluşturulan image saklanır. Daha önceki satırlarda oluşturulan image'ler kaydedilmez. Böylece önceki image'lar sadece son image'in oluşturulmasında bir araç olarak kullanılmış olur.

Docker derslerine sıradaki yazı ile devam edebilirsiniz:

Docker Network Driver Tipleri
Docker Network, containerlar arasında haberleşmeyi sağlamak için kullanılan önemli bir araçtır.