Skip to main content
search

Docker File Nedir?

Bir önceki yazımızda Docker’ın nasıl kullanıldığını, yüklendiğini ve en çok kullanılan Docker komutlarından bahsetmiştik. Bu yazımızda ise Docker file, image, kullanılan komutlar, veri saklama ve Docker Compose’dan bahsedeceğiz.

Docker file, image oluşturmak için gerekli işletim sistemi, database, kurulucak araçlar, uygulamanın çalışması için gerekli dosyalar ve kütüphaneleri içeren dosyadır.

Örnek Script:


FROM nginx:latest
COPY index.html /usr/share/nginx/html 
COPY index.html /usr/share/nginx/html 
CMD [“nginx”, “-g” “daemon off;”]

Web sunucusu nginx: lates

kopyalanacak dosyalar: index.html ve Linux.png

port: 80 olarak belirlenmiştir. Bu Docker dosyası Docker üzerinden build edildiğinde, adımları tek tek gerçekleştirerek image dosyasını oluşturacaktır.

Docker File ve Image Nasıl Oluşturulur?

Docker file oluşturmak için kullanabileceğimiz belli taglar bulunmaktadır.

Bunlar:

FROM: Kullanılacak sistem belirtilir.
RUN: Belirtilen komutları image içerisinde çalıştırır.
LABEL: Image dosyasına aranabilir meta tagları eklememizi sağlar.
COPY: Belirtilen dosyaları image içerisinde belirlenen hedefe kopyalar.
EXPOSE: Container’ın docker içinde çalışacağı port adresi belirlenir.
WORKDIR: Sonrasında gelen komutları verilen klasör içerisindeymiş gibi çalıştırır.
CMD: İlk önce çağrılır. Çalışma sırasını düzenler. İçine yazılan komut ve parametreleri çalıştırır.
ENV: Image içerisine dışarıdan veri girileceği zaman kullanılır.

Kendi Image Dosyamızı Nasıl Hazırlarız?

  1. Docker file oluşturulalım.

FROM nginx
ENV AUTHOR=DockerEnv
WORKDIR /usr/share/nginx/html
COPY Color_docker.html /usr/share/nginx/html
CMD cd /usr/share/nginx/html && sed -e s/DockerEnv/"$AUTHOR"/ Color_docker.html > 
index.html ; nginx -g 'daemon off;'

 2. Background değişikliği yapabileceğimiz bir html dosyası hazırlayalım.

<html>
<head><style>
body {background-color: DockerEnv;}
</style></head>
<body></body>
</html>

3. Klasör içinde terminal açıp, build komutunu girerek image dosyasını oluşturalım.


$ Docker build -t myimage .

Görüldüğü üzere Docker File içerisindeki tüm adımlar tek tek gerçekleşti ve “myimage” adında bir Docker image oluşturmuş olduk.

4. Docker image, run komutu kullanılarak container haline getirilir.


$ Docker run -d -p 8880:80 -e AUTHOR=”blue” myimage 

Kullanılan Komutlar Nelerdir?

run: image’ı çalıştırmak için kullandığımız komut
-d: –detach in kısa halidir. Container arka planda başlatılır.
-p: docker container’ a bir port verir. Buradaki 80 portu docker içinde geçerlidir, tarayıcı üzerinde görüntülenemez. Bu yüzden 8880 portunu 80 portuna expose ettik, artık localhost:8880 portuna giderek tarayıcı üzerinde görüntüleyebiliriz.
-e: Docker file içerisindeki ENV AUTHOR ile dışarıdan almak istediğimiz veriyi gönderdik.

Son olarak çalıştıracağımız image adını girdik.

Aşağıdaki görseldeki tüm adımları tamamlamış olduk.

Docker

Localhost:8880 portunu tarayıcıdan açtığımızda arka plan renginin mavi olduğunu görüntüledik.

docker

Docker Container İçerisindeki Verilerin Saklanması

Container içerisine sonradan yüklenen her şey container silindiği anda tamamen yok olacaktır. Bunu önlemenin birkaç yolu vardır:

1. Bind Mount

Kendi bilgisayarımızdan belirleyeceğimiz klasörü kaynak olarak gösterebiliriz. Örnek syntax;


$ Docker run -d –mount type=bind, source=/tmp/docker/mydocuments/temp , target=/myte

Ancak Bind Mount genelde yazılım aşamasında kullanılır. Bunun sebebi dosyaların kolayca değişebilmesi ve hassas dosyalara erişimin açık olmasıdır.

2. Volume

Bir kaynak klasörü göstermek yerine sadece isim verilir. Docker /var/lib/docker/volumes/ içerisine oluşturur ve yönetir. Oluşturmak için:


$ Docker volume create mydocuments

Volumeleri listelemek için:


$ Docker volume ls

İstenen volüme’ü görüntülemek için:


$ Docker volume inspect mydocuments

 

docker

Çalıştırma sırasında:


 $ Docker run -d –mount source=mydocuments, target =/mytemp myimage

Canlıya çıkmış ürünlerde kullanılması önerilir. Kolayca back-up alınabilir.

3. Tmpsf Bellek hafızasını kullanarak verileri saklar, yer belirtmeye gerek yoktur.


 $ Docker run -d –mount type=tmpfs , target =/mytemp myimage

Docker Compose Nedir?

Docker compose ile basit yapıdaki uygulamalarımızı herhangi bir işletim sistemi veya web sunucusu image’ında çalıştırabiliriz; ancak daha kompleks uygulamalarda birbirinden farklı image’lara ihtiyacımız olabilir. Compose ile birlikte birden fazla Container tanımı tek bir dosyada yapılabilir. Bunun için basit bir yml dosyası oluşturmamız yeterlidir. Bu dosya ile birlikte tek bir komut ile uygulamanızın ihtiyaç duyduğu tüm gereksinimleri ayağa kaldırarak uygulamayı çalıştırabiliriz.

Redis ve Python’a ihtiyaç duyduğumuz bir uygulamanızda gerekli image’ları container haline getirip birbirlerine bağımlı hale getirebiliriz. Böylelikle uygulamamız ayağa kalkmadan önce gerekli her şey hazır olacaktır.

Python uygulamamız:


import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)

@app.route('/')
def hello():
count = get_hit_count()
return 'Sayfanın görüntülenme sayısı: {} \n'.format(count)

Docker File


FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

Yml Dosyası


version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"

requirements.txt:


flask
redis

Dosyalarımız ve isimleri aşağıdaki şekilde olmalıdır.

Docker Dosyalari

Compose Run komutu ile compose örneğimizi başlatabiliriz.


$ Docker-compose up -d

Komut yml dosyasına ulaşarak gerekli image’ları indirir ve container olarak başlatır. Artık projeyi yml dosyasında belirttiğimiz gibi 5000 portunda görüntüleyebiliriz.

Fırat Çelik

Yazılım Test Mühendisi

Close Menu