Dockerfile Komutları
Merhaba bu yazımda sizlere ‘Dockerfile’ komutları hakkında bilgi vereceğim. Aslında buradaki bilgileri unuttuğum zaman daha hızlı hatırlayabilmek için aldığım notlar bütünü ve elimden geldikçe açıklayıcı yazmaya çalıştım, keyifli okumalar.
Dockerfile komutlarını birazdan açıklamak temel olarak açıklamak ile beraber bir örnek Dockerfile üzerinden diğer komutlarıda sizlere açıklayacağım.
Komutlar
FROM : Base Image göstermek için kullanılır . Küçük boyutlu image dosyasını kullanmak daha sağlıklıdır. Image son sürümü kullanmak faydalı değildir;
Örneğin ‘mcr.microsoft.com/dotnet/aspnet:latest’ ile bir uygulamanın 3.versiyonu ile geliştirdiysek ‘mcr.microsoft.com/dotnet/aspnet:3.1’ Docker’ını kullanmalıyız.
Not : Dockerfile base image ile başlar. Base Image işletim sistemi, docker image veya uygulamaya ait bir base image olabilir.
- RUN : Uygulama içerisinde çalıştırmak istediğimiz komutlar yani bu uygulamaya ait bağımlılıkların tanımlandığı yerdir. Diğer bir tabiriyle Docker Image alınırken çalıştırılmasını istediğimiz komutlar yazılır. Run ile yazılan her komut bir katmandır. Birden fazla run komutu yazılabilir. Run komutları alt alta yazarsak her run komutu bir katman olacağından image boyutu artacaktır. Bunun bash komutunun bize sağladığı and (&&) operatörünü kullanılarak uygulamanın ihtiyacı olan bağımlılıklar tek satırda and(&&) kullanılarak yazılır.
CMD : Docker konteynır ayağa kalktığında çalıştırılacak komutlar cmd komutu ile yazılır. konteynır ayağa kalktığında ilk bu komut içerisindeki değer çalışır. Yazılım dünyasında main fonksiyonu gibidir. Dockerfile içerisinde tek bir CMD komutu olmalıdır. Birden fazla CMD komutu yazıldığında en son satırdaki cmd komutunu devralır ve o komut satırı çalışır.
VOLUME : Konteynır içerisinde kalıcı depolama alanı belirtmek için kullanılır.
USER : Hangi kullanıcı üzerinden işlem yapılacağını belirlemek için kullanılır.
Örnek Dockerfile
Yukarıdaki örneği inceleyelim ;
1- İlk satırda Base Image ile Base Docker belirtilmiş.
2- MAINTAINER satırında Dockerfile dosyasını oluşturan kişi hakkında bilgileri içerir. Bu örnekte Dockerfile’ ı kimin yazdığının isim ve mail bilgisi verilmiş.
3- Env. Konteynır’ a ortam değişkeni tanımlamak için kullanılır. Env. ile bir Env. Variable Docker içerisinde tanımlanmış.
Kullanım şekli : ENV <key> <value>
4- ‘#’ ile Bir açıklama satırı yazılmış.
5- COPY ile bir dosya bir Dockere kopyalanmış. İkinci kısımda verilen kısma ilk kısımdaki dosya kopyalanmış. Belirtilen dosyaları konteynır içerisinde belirlenen hedefe kopyalar.
Kullanın şekli : COPY <host_kaynak_dosya> <container_dosya_yolu>
6- RUN ile terminal kodları çalıştırılmış. Burada ilk iki satırda ; ‘apt-get’ paket yöneticisinin update ve upgrade edildiğini görüyoruz. Sonraki satırlarda gerekli dependencies indirildiğini görüyoruz. Sonraki satırda ise bazı yazılımların indirildiğini görüyoruz.
7- EXPOSE kodu ile bir port açılmış. Port yapılandırmasının gerçekleştiği yerdir. Default olarak TCP portunu kullanır. Konteynır dış dünya ile iletişimi verdiğimiz port üzerinden yapar. Konteynır’ ın docker içinde çalışacağı port adresi belirlenir.
Kullanım şekli :
EXPOSE port_number veya EXPOSE port_number/protocol (TCP | UDP)
8- ADD kodu ile yine bir dosya kopyalanması yapılmış. Burada host sunucudan Docker’a doğru ya da internetten bir dosya docker image içerisine eklenebilir.
Kullanım şekli : ADD <host_kaynak_dosya> <container_dosya_yolu>
9- RUN ile terminal kodu çalıştırılmış ve bir yetki tanımı verilmiş.
10- Son olarak CMD ile Docker sürecinin başlayacağı kod verilmiş.
LABEL : Image sahibi veya farklı metadata detayları eklemek için kullanılır.
Kulanım şekli : LABEL <key> <value>
ENTRYPOINT : Konteynır çalıştığında varsayılan parametre tanımlamak için kullanılır. Daha esnek bir kullanıma sahiptir. Kısaca parametre sabitlemek için kullanılır.
Kullanım şekli : ENTRYPOINT <path>
WORKDIR : Konteynır’ ın çalışma dizini belirtmek için kullanılır.
Kullanım şekli : WORKDIR <path>
ARG : Konteynır çalışacak arg tanımlarız. ARG en güzel örnek uygulamamıza ait birden fazla ortamımız olabilir. Ortamdan kastım test ve master ı şu an kabul edelim. Test sunucusunda tuttuğumuz DB özellikleri ile master da tuttuğumuz DB özellikleri farklılık gösterir. İşte biz burada hangi ortama göre image alınacaksa burada onu tanımlarız.
https://docs.docker.com/engine/reference/builder/ buradan daha detaylı bir şekilde inceleyebilirsiniz.