Docker imajlarını oluştururken kullanılan Dockerfile’lar, bu imajların nasıl oluşturulacağını tanımlayan betiklerdir. İşte bu Dockerfile içerisinde kullanılan temel komutların detaylı bir açıklaması:
Dockerfile Komutları
FROM : Her Dockerfile’ın başlangıcında gelir. Temel alınacak imajı belirtir.
Örnek:
1 2 3 |
FROM ubuntu:20.04 |
LABEL : İmaja meta bilgi eklemek için kullanılır.
Örnek:
1 2 3 |
LABEL version="1.0" maintainer="Ahmet Yılmaz <ahmet@example.com>" description="My Nginx Image" |
EXPOSE : Konteynerin dışa açacağı portları belirtir.
Örnek:
1 2 3 |
EXPOSE 80 |
ENV : Konteyner içerisinde kullanılacak ortam değişkenlerini tanımlar.
Örnek:
1 2 3 4 |
ENV MY_DATABASE=sample_db ENV MY_USER=admin |
ADD : Yerel dosya/dizin veya bir URL’den dosyayı imaja ekler.
Örnek:
1 2 3 4 |
ADD local-file.txt /destination/ ADD http://example.com/remote-file.txt /destination/ |
COPY : ADD komutuna benzer, ama daha basit. Sadece yerel dosya/dizini imaja kopyalar.
Örnek:
1 2 3 |
COPY local-file.txt /destination/ |
ADD ve COPY Arasındaki Farklar:
Temel İşlevsellik:
- ADD: Yerel bir dosya/dizini veya bir URL’yi Docker imajına ekler. URL kullanılırsa, belirtilen adres üzerindeki dosyayı otomatik olarak indirir.
- COPY: Sadece yerel bir dosya veya dizini Docker imajına kopyalar.
Sıkıştırma Dosyaları:
- ADD: Bir tar arşivi gibi sıkıştırılmış dosyaları imaja eklerken otomatik olarak çözer.
- COPY: Sıkıştırılmış dosyaları olduğu gibi kopyalar, otomatik çözme işlemi yapmaz.
Genel Tavsiye: Eğer özel bir nedeniniz yoksa (örn. otomatik arşiv çözme veya URL’den dosya eklemek gibi) genellikle COPY komutunu kullanmanız önerilir, çünkü işlevi daha basit ve açıktır.
RUN : İmaj oluşturulurken çalışacak komutları tanımlar.
Örnek:
1 2 3 4 5 |
RUN apt-get update RUN apt-get install -y nginx RUN mkdir /app && cd /app |
CMD : Konteyner çalıştırıldığında varsayılan komutu belirtir.
Örnek:
1 2 3 |
CMD node server.js |
ENTRYPOINT : CMD’den farklı olarak, ENTRYPOINT ile belirtilen komut değiştirilemez.
Örnek:
1 2 3 4 |
ENTRYPOINT ["cat"] CMD ["/destination/local-file.txt"] |
CMD ve ENTRYPOINT Arasındaki Farklar:
Varsayılan Komut ve Argümanlar:
- CMD: Konteyner çalıştırıldığında varsayılan olarak çalışacak komut ve argümanları belirtir. Eğer Docker run komutu ile başka bir komut belirtilirse, CMD komutu geçersiz kılınır.
- ENTRYPOINT: Konteynerin başlangıç komutunu belirtir ve bu komut, Docker run ile belirtilen komutla değiştirilemez.
Kullanım Senaryoları:
- CMD: Eğer bir konteynerin varsayılan bir komutu olmasını istiyorsanız (ama bu komutu gerektiğinde değiştirmek istiyorsanız) CMD’yi kullanmalısınız.
- ENTRYPOINT: Konteynerin bir komut dosyası veya uygulama gibi davranmasını istiyorsanız ve kullanıcının bu komutu değiştirmesini istemiyorsanız ENTRYPOINT kullanmalısınız.
Birlikte Kullanım:
- CMD ve ENTRYPOINT birlikte kullanılabilir. Bu durumda, ENTRYPOINT komutu sabit bir komut olarak kalırken, CMD komutunda belirtilen argümanlar ENTRYPOINT’e eklenir.
Örnek:
1 2 3 4 |
ENTRYPOINT ["cat"] CMD ["/my_file.txt"] |
Bu Dockerfile ile oluşturulan konteyneri çalıştırdığınızda, varsayılan olarak “cat /my_file.txt” komutu çalışacaktır. Eğer Docker run sırasında başka bir dosya belirtirseniz, o dosya cat komutuyla ekrana yazdırılır, fakat “cat” komutu değiştirilemez.
VOLUME : Konteynerde bir bağlama noktası oluşturur.
Örnek:
1 2 3 |
VOLUME /myvolume |
USER : Konteynerin hangi kullanıcı ile çalışacağını belirtir.
Örnek:
1 2 3 |
USER username[:department] |
WORKDIR : Docker komutlarının çalışacağı dizini belirtir.
Örnek:
1 2 3 |
WORKDIR /destination |
ARG : Build sırasında dışarıdan alınan değerleri tanımlar.
Örnek:
1 2 3 |
ARG MY_VERSION=latest |
ONBUILD : Bir imaj başka bir Dockerfile’da temel olarak kullanıldığında çalışacak komutları belirtir.
Örnek:
1 2 3 |
ONBUILD RUN echo "Bu bir onbuild komutudur." |
HEALTHCHECK : Konteynerin sağlığını kontrol etmek için kullanılır.
Örnek:
1 2 3 |
HEALTHCHECK CMD curl --fail http://localhost:80/ || exit 1 |
SHELL : RUN, CMD, ENTRYPOINT için varsayılan kabuğu (shell) değiştirir.
Örnek:
1 2 3 |
SHELL ["/bin/bash", "-c"] |
.dockerignore Dosyası
.dockerignore dosyası, Docker imajı oluşturulurken Dockerfile’ın yanında bulunan ve bazı dosya veya dizinleri dikkate almayarak imaj oluşturma sürecinden hariç tutan bir dosyadır. Bu dosya, .gitignore dosyasına benzer bir işlevselliğe sahiptir, ancak Docker imajları için kullanılır.
Örnek .dockerignore Dosyası:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# Yedek dosyaları hariç tut *.bak # Git ve SVN dizinleri .git/ .svn/ # node_modules dizini (Node.js projeleri için) node_modules/ # Özel yapılandırma dosyası config.yml # Log dosyaları *.log |
Bu örnekte, .bak uzantılı dosyalar, .git ve .svn dizinleri, node_modules dizini, config.yml dosyası ve tüm .log dosyaları Docker image oluşturma sürecinden hariç tutulmaktadır.
Dockerfile Dosyasından Image Oluşturma
Dockerfile dosyasından bir Docker imajı oluşturmak için docker build komutunu kullanmalısınız. Bu komut, belirttiğiniz Dockerfile’daki yönergeleri takip eder ve sonuç olarak bir Docker imajı üretir.
Terminal veya komut satırını açın ve Dockerfile’ın bulunduğu dizine gidin. Ardından aşağıdaki komutu çalıştırarak Docker imajını oluşturabilirsiniz:
1 2 3 |
docker image build -t my-hub-name/my-image-name:tag . |
Burada:
- -t my-image-name:tag ile oluşturulan imaja bir isim (my-image-name) ve bir etiket (tag) atanır. Etiket belirtilmezse varsayılan olarak latest olarak ayarlanır.
- Son karakter olan . , Dockerfile’ın bulunduğu mevcut dizini ifade eder.
Oluşturduğunuz imajın mevcut imajlar arasında olup olmadığını kontrol etmek için:
1 2 3 |
docker images |
Bu komut, sistemdeki tüm Docker imajlarını listeler. Oluşturduğunuz imajın da bu listede yer aldığını görmelisiniz.
Dockerfile Yazım Şekilleri
Dockerfile’da iki farklı yazım şekli mevcuttur: shell ve exec formatı.
1. Shell Formatı
Bu format, komutları ve argümanları tek bir string içerisinde yazmayı gerektirir ve bu komutlar shell (/bin/sh -c) aracılığıyla çalıştırılır.
Örnekler:
1 2 3 4 |
CMD echo "Merhaba, Docker!" ENTRYPOINT echo "Merhaba, Docker!" |
Avantajlar ve Dezavantajlar:
- Shell formatı, ortam değişkenlerini kullanmayı ve shell işlemlerini kolaylaştırır.
- Ancak bu format, komutun PID 1 olarak çalışmasını engeller, bu da sinyallerin doğru bir şekilde yönetilmediği anlamına gelir. Konteyneri durdurmak istediğinizde problemlere neden olabilir.
2. Exec Formatı
Bu format, komutu ve argümanları JSON benzeri bir dizi içerisinde ayrı ayrı elemanlar olarak belirtir. Bu format shell olmadan komutu doğrudan çalıştırır.
Örnekler:
1 2 3 4 |
CMD ["echo", "Merhaba, Docker!"] ENTRYPOINT ["echo", "Merhaba, Docker!"] |
Avantajlar ve Dezavantajlar:
- Exec formatı, komutun PID 1 olarak çalışmasını sağlar, bu da sinyallerin doğru bir şekilde yönlendirilmesini garantiler. Bu nedenle, bir uygulamanın konteyner olarak çalışmasını istediğinizde bu formatı kullanmanız önerilir.
- Ancak, bu format ortam değişkenlerini ve shell özelliklerini doğrudan desteklemez. Bu gibi özelliklere ihtiyaç duyarsanız, komutunuzu bir shell script içerisine yazarak bu scripti çalıştırmalısınız.
Umarım “Dockerfile Komutları” başlıklı yazım sizin için faydalı olmuştur.
Şu yazılar da ilginizi çekebilir.
Docker Container Nedir? Docker Container Komutları
Dockerfile Nedir? Dockerfile Neden Önemlidir?
Yeni bir yazımda görüşmek üzere.
Happy coding!