Docker’a Giriş 4
Docker Stats
Bir container’da hangi processlerin çalıştığını görmek istiyorsak:
➜ ~ docker top containeradi
Docker host üstündeki container’ların ne kadar kaynak harcadığını göremek istiyorsak:
➜ ~ docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
949e4dc6da6d web 0.00% 10.94MiB / 15.48GiB 0.07% 1.01kB / 0B 0B / 0B 9
7e3ab1f9bbd2 proxyserver 1.41% 40.39MiB / 15.48GiB 0.25% 1.53kB / 0B 0B / 0B 30
Tek bir container’ın ne kadar kaynak harcadığını görmek istersek:
➜ ~ docker stats web
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
949e4dc6da6d web 0.00% 10.94MiB / 15.48GiB 0.07% 1.01kB / 0B 0B / 0B 9
Container Cpu ve Memory Limitleri
Containerlar üzerinde çalıştıkları hostların herhangi bir kısıtlama olmadan kaynaklarını kullabilirler. Bu sebepten bir container diğer containerların çalışmasını engelleyecek şekilde kaynak tüketimi kullanabilirler. Kaynak tüketimini sınırlayarak bu tarz sorunların önüne geçebiliriz.
RAM kullanımını sınırlamak için
— memory=limit
➜ ~ docker run -d --memory=250m nginx
59f079d2dbc3f5ca1921ec0dbce43aadcb7dad0cd7e5c306b07ed6ed90f9ea8e
➜ ~ docker stats 59f079d2dbc3
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
59f079d2dbc3 cool_meitner 0.00% 6.672MiB / 250MiB 2.67% 656B / 0B 0B / 0B 9
SWAP alanı da belirterek memory dolduğunda diskten kullanımını da sağlayabiliriz.
➜ ~ docker run -d - memory=250m - memory-swap=100m nginx
Kaç CPU kullanacağını belirlemek içinse:
➜ ~ docker run -d - cpus="2" - name web2 nginx
Örneğin bir buçuk CPU kullan demek istersek:
➜ ~ docker run -d - cpus="1,5" - name web2 nginx
Direk CPU core’u belirterekte ayarlama yapabiliriz. Aşağıdaki komut şu anlama gelmektedir. CPU 0 ve CPU 3'ü kullan demektir.
➜ ~ docker run -d - cpuset-cpus="0,3" - name web2 nginx
Environment Variables
Ortam değişkenleri, işletim sistemimizde bulunan veya uygulamanın kapsayıcısında çalışan uygulamamızın dışındaki değişkenlerdir. Ortam değişkeni, bir değere eşitlenen bir addır.
➜ ~ docker run -it --env VAR1=deneme1 --env VAR2=deneme2 ubuntu bash
Enviroment Variables büyük harf küçük harf duyarlıdıdır.
Host makine üzerindeki enviroment’i container’da kullanmak istiyorsak:
docker run — it — env HOSTÜZERİNDEKİENVIROMENT image bash
➜ ~ printenv
NAME=ENT-EMANET
➜ ~ docker run -it --env NAME ubuntu bash
root@2eb156e4f2b0:/# printenv
HOSTNAME=2eb156e4f2b0
NAME=ENT-EMANET
PWD=/
HOME=/root
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/printenv
root@2eb156e4f2b0:/#
Diyelim ki birden fazla enviroment varible’larımız var. Bunları tek tek yazmak yerine bir dosyaya enviromentleri kaydedip kullanmak için
docker run -it — env-file dosya_ismi ubuntu bash
Docker Image İsimlendirme ve Tag Yapısı
Docker imagelerilerine verilen isimler yada tagler o imajın depolandığı yeride belirtir.
Docker run ederken isimle run edebileceğimiz gibi image id’si ile run edersekte aynı işi yapabiliriz.
Docker Image İsimlendirme Yapısı
docker.io/ ubuntu :20.04
Registery URL Repository Tag
Register URL: Bu URL default olarak docker.io şeklinde çalışmaktadır. Burada register URL’den kasıt docker imajlarının çekilecek olduğu URL’dir. Özel depolardan da docker login komutuyla belirterek docker hostumuza ekleyebilir ve özel depolardan da imaj çekebiliriz. Aşağıda örnek bir docker deposu bulunmaktadır.
docker login registry.deneme.com:443
Repository ise
Tag container’ların versiyonlandırılabilmesi için adlandırılan kısımdır. Bir container ayağa kaldırırken tag girmeden container imaj ismini yazarsak varsayılan olarak latest tagli imajı çekecektir.
Docker Image’ı Oluşturma
Docker file, imagelar yaratabilmemize olanak sağlayan içerisinde kendine özgü kuralları olan bir dille yazılan bir text dosyasıdır.
FROM | Oluşturulacak imajın hangi imajdan oluşturulacağını belirten talimat. Dockerfile içerisinde geçmesi mecburi tek talimat budur. Mutlaka olmalıdır.
FROM ubuntu:18.04
RUN | İmaj oluşturulurken shell’de bir komut çalıştırmak istersek bu talimat kullanılır. Örneğin apt-get install xxx ile xxx isimli uygulamanın bu imaja yüklenmesi sağlanabilir.
RUN apt-get update
LABEL | İmaj metadata’sına key=value şeklinde değer çiftleri eklemek için kullanılır. Örneğin team=development şeklinde bir etiket eklenerek bu imajın development ekibinin kullanması için yaratıldığı belirtilebilir.
LABEL version:1.0.8
WORKDIR | cd xxx komutuyla ile istediğimiz klasöre geçmek yerine bu talimat kullanılarak istediğimiz klasöre geçer ve oradan çalışmaya devam ederiz.
WORKDIR /usr/src/app
COPY | İmaj içine dosya veya klasör kopyalamak için kullanırız
COPY /source /user/src/app
USER | gireceğimiz komutları hangi kullanıcı ile çalıştırmasını istiyorsak bu talimat ile onu seçebiliriz.
USER poweruser
CMD | Bu imajdan container yaratıldığı zaman varsayılan olarak çalıştırmasını istediğiniz komutu bu talimat ile belirlersiniz.
CMD java merhaba
ADD | COPY ile aynı işi yapar yani dosya ya da klasör kopyalarsınız. Fakat ADD bunun yanında dosya kaynağının bir url olmasına da izin verir. Ayrıca ADD ile kaynak olarak bir .tar dosyası belirtilirse bu dosya imaja .tar olarak sıkıştırılmış haliyle değil de açılarak kopyalanır.
Ör: ADD https://wordpress.org/latest.tar.gz /temp
ENV | Imaj içinde environment variable tanımlamak için kullanılır
Ör: ENV TEMP_FOLDER=”/temp”
ARG | ARG ile de variable tanımlarsınız. Fakat bu variable sadece imaj oluşturulurken yani build aşamasında kullanılır. Imajın oluşturulmuş halinde bu variable bulunmaz. ENV ile imaj oluşturulduktan sonra da imaj içinde olmasını istediğiniz variable tanımlarsınız, ARG ile sadece oluştururken kullanmanız gereken variable tanımlarsınız.
Ör: ARG VERSION:1.0
VOLUME | Imaj içerisinde volume tanımlanamızı sağlayan talimat. Eğer bu volume host sistemde varsa container bunu kullanır. Yoksa yeni volume oluşturur.
Ör: VOLUME /myvol
EXPOSE | Bu imajdan oluşturulacak containerların hangi portlar üstünden erişilebileceğini yani hangi portların yayınlanacağını bu talimatla belirtirsiniz.
Ör: EXPOSE 80/tcp
ENTRYPOINT | Bu talimat ile bir containerın çalıştırılabilir bir uygulama gibi ayarlanabilmesini sağlarsınız.
Ör: ENTRYPOINT [“/usr/sbin/apache2ctl”, “-D”, “FOREGROUND”]
HEALTHCHECK | Bu talimat ile Docker’a bir konteynerin hala çalışıp çalışmadığını kontrol etmesini söylebiliriz. Docker varsayılan olarak container içerisinde çalışan ilk processi izler ve o çalıştığı sürece container çalışmaya devam eder. Fakat process çalışsa bile onun düzgün işlem yapıp yapmadığına bakmaz. HEALTHCHECK ile buna bakabilme imkanına kavuşuruz.
Ör: HEALTHCHECK — interval=5m — timeout=3s CMD curl -f http://localhost/ || exit 1
SHELL | Dockerfile’ın komutları işleyeceği shell’in hangisi olduğunu belirtiriz. Linux için varsayılan shell [“/bin/sh”, “-c”],Windows için [“cmd”, “/S”, “/C”]. Bunları SHELL talimatı ile değiştirebiliriz.
Ör: SHELL [“powershell”, “-command”]
Docker File Oluşturma
Dockerfile isimli bir dosya oluşturuyoruz. Docker file “D” harfi kesinlikle büyük olmalıdır.
# Docker File Oluştururken Öncelikle dosyamızın ismini Dockerfile d'si büyük olacak şekilde yazıyoruz.
# Ardından FROM parametresi ile docker image'ını belirliyoruz.
# Komut çalıştırmak içinse RUN parametresini giriyoruz.
# Uygulamamızın docker image'ında nerede çalışacağını belirtmek için WORKDIR parametresini giriyoruz.
# Çalıştıracak olduğumuz dosyayı kopyalaması için COPY parametresini belirtiyoruz.
# Java uygulamamızı çalıştırması içinde CMD parametresiyle komutun nasıl çalışması gerektiğini bildiriyoruz.
FROM ubuntu:20.04
RUN apt-get update -y
RUN apt-get install default-jre -y
WORKDIR /java_app
COPY /myapp .
CMD ["java", "merhaba"]
Docker file’ımızı oluşturduktan sonra build etmek için:
docker image build -t emanetemre/merhaba -f Dockerfile .
t : Tag atama parametresidir. Container ayağa kaldırırken bu parametre ile ayağa kaldırırız.
-f : Docker file’ın ismi farklı ise bu parametre ile belirtmemiz gerekmektedir. Eğer standart olarak dosyanın adını Dockerfile olarak bıraktıysak bu parametreyi girmeye gerek olmaz.
. : Nokta ise Docker file belirtmiş olduğumuz kopyalama vb. işlemler varsa ve build alırken sorarsa herşeyi create ettiğimiz yerden al. Build context’in Dockerfile’ın olduğu yerdir demektedir. Eğer farklı bir klasördeyse . yerine bu klasörün yerini belirtmemiz gerekmektedir.