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, 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:
- Bir dosya oluşturun ve bu dosyaya
Dockerfileadını verin. - Dosyanın başına
FROMkomutunu yazın ve bu komut ile container'ın çalışacağı temel image'ı belirtin. Örneğin,FROM ubuntu:latestkomutu ile Ubuntu'nun en son sürümünü kullanacağını belirtmiş olursunuz. RUNkomutları ile container içerisinde çalıştırılacak komutları belirtin. Örneğin,RUN apt-get updatekomutu ile container içerisinde apt-get paket yöneticisini güncelleyebilirsiniz.COPYkomutları ile container içerisine dosya veya dizin kopyalayabilirsiniz. Örneğin,COPY index.html /var/www/htmlkomutu ileindex.htmldosyası container içerisindeki/var/www/htmldizinine kopyalanabilir.EXPOSEkomutu ile container'ın hangi portlardan erişilebileceğini belirtin. Örneğin,EXPOSE 80komutu ile container'ın 80. portundan erişilebileceğini belirtmiş olursunuz.CMDkomutu 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.

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:latestgibi.MAINTAINER: Bu komut, Dockerfile'ın yaratıcısının adını ve e-posta adresini belirtir. Örneğin,MAINTAINER İsmet BALAT <[email protected]>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 nginxgibi.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 80gibi.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=secretpasswordgibi.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/containergibi.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 rootgibi.WORKDIR: Bu komut, container üzerinde komutların çalıştırılacağı varsayılan dizini belirtir. Örneğin,WORKDIR /var/wwwgibi.ARG: Bu komut, build sırasında kullanılacak değişkenleri tanımlar. Örneğin,ARG version=latestgibi.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ğinSHELL ["/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:
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.
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:
