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
Dockerfile
adını verin. - 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. 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.COPY
komutları ile container içerisine dosya veya dizin kopyalayabilirsiniz. Örneğin,COPY index.html /var/www/html
komutu ileindex.html
dosyası container içerisindeki/var/www/html
dizinine kopyalanabilir.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.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.
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ğ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: