Bölüm2: Uygulamalarımızı Nasıl Dockerize Ederiz?

Hasan Kadir Demircan
4 min readFeb 1, 2020

--

Eğer docker hakkında biraz bilgi isterseniz ve ubuntu üzerinde docker nasıl kurabilirim ? Docker Bölüm1 ‘e giderek bilgi edinebilirsiniz.

Dockerfile

  • Dockerfile metin bazlı bir dosyadır.
  • Adı tam olarak Dockerfile ve uzantısız olmalı.(.txt vb olmamalı.)
  • Container yapısı bu dosyadan türetilir.
  • Image’den container oluşturma işlemini standardize etmektedir.
  • Dockerfile içindeki instruction’lar Docker Daemon tarafından okunur.
  • Bu instruction’lar ile image oluşturulur.

docker-image

  • Çalışacak uygulamamızın ve uygulama alt yapısında çalışan gerekli işletim sistemi kütüphanelerinin bulunduğu yapıdır.
  • docker image build komutu ile Dockerfile üzerinden belirlediğimiz adımları tek tek uygulayarak oluşturulan yapıdır.

docker-volume

  • Container’larda yapılan işlemlerin kalıcı olması için kullanılır.
  • Örnek olarak, veritabanı işlemleri yaptığımızda container kapatıldığında/kapandığında db’de kapanır ve tüm bilgiler silinir.
  • Buna önlem olarak kalıcı olmak istediğimiz verileri docker-volume olarak ayarlıyoruz.

docker-compose

  • Kompleks uygulamaların tanımlanmasını ve çalıştırılmasını sağlar.
  • docker-compose ile birden fazla container tanımı, container’ların birbiriyle ilişkisi, ayağa kalkma sırası gibi tanımlamalar tek bir dosyada yapılabilir.
  • Tek komut ile uygulamamızın ihtiyaç duyduğu tüm gereksinim/bağımlılıklar indilirerek uygulama ayağa kaldırılır.
  • docker-compose build ederken unutmamamız gereken şey,
  • eğer kodda bir değişikilik yaptıysak docker-compose build -no-cache diyerek sıfırdan derleyebiliriz.
  • eğer -no-cache demezsek cache’deki bilgileri kullanacağından yeni değişiklikleri göremeyiz.

Dockerize Processing

Github’da paylaştığım TodoApp uygulamamı dockerize edeceğiz.

Teknoloji olarak ui node üzerinde çalışmaktadır.

İlk olarak ui’ın Dockerfile oluşturalım.

ui Dockerfile

Dockerfile içeriğini açıklayacak olursak,

FROM komutu, diğer image’lerden bağımlılıkları çekmemize izin veren Docker komutudur.

Bağımlılıkları DockerHub üzerinden çekiyoruz.

Ui node üzerinde çalışacağı için node bağımlılığını çekiyoruz.

COPY komutu, dosyaları veya dizinleri ana makine dosya sisteminden bir image’e kopyalamak için kullanılıyor.(Artık dizinimiz home/app/ui şeklinde ilerleyecek.)

WORKDIR komutu, uygulamayı belirli bir yerden çalıştırmamız gerekeceği için, etkin dizinini belirten bir konuma ayarlıyoruz.

ENV komutu, uygulama içerisindeki environment bilgimizi tanımlamak için kullanılıyor.

RUN komutu, uygulama ilk oluşturulduğunda/build edilidiğinde çalıştırılacak komutları tanımlar. Burada bağımlılıklarımızı indirmek için kullandık.

CMD komutu, uygulamamızı ayağa kaldırmak için kullandık. İdeal olarak yalnızca bir CMD olmalı ve birden fazla varsa yalnızca sonuncusu önemli olacaktır.

EXPOSE komutu, uygulamamız hangi porttan dışarıya açılacak olduğunu belirtiyoruz.

Api için Dockerfile

api Dockerfile

Dockerfile içeriğini açıklayacak olursak,

FROM komutu ile maven bağımlılıklarını indiriyoruz.

COPY komutu ile dizinimizi kopyalayıp belirliyoruz.

WORKDIR komutu ile dizinimizi belirliyoruz.

RUN komutu ile mvn install komutunu çalıştırıp, jar’ımızı oluşturuyoruz.

MAINTAINER komutu ile yazan kişinin bilgisini verebiliriz.

EXPOSE komutu ile api’mizin portunu 8080 dışarıya ve 8080 içeriye ayarlıyoruz.

ENTRYPOINT komutu ile jar çalıştırma komutunu ve hangi properties dosyasını kullanacağını belirtiyoruz.

Dockerfile dosyalarımız hazır olduğuna göre sıra docker-compose.yml dosyamıza geldi.

Compose

docker-compose.yml

docker-compose.yml dosyasını açıklayacak olursak,

version , docker-compose version belirtiyor.

services , bu komut içerisinde api, ui, db container service isimlerini ve ayarlamalarını yapıyoruz.

db, DockerHub üzerinden mysql bağımlılığını çekiyor. Veritabanı servis adımız db olacak.(istediğimiz isimi verebiliriz.)

environmet, veritabanı kullanıcı,şifre, oluşturulacak db isimlerini veriyoruz.

ports, hangi portlarda çalışacağını belirtiyoruz.

volume, container kapansa bile db’mizin silinmemesini istediğimiz için my-db adı ile volume olarak ekliyoruz.

api, api servisimizin adını veriyoruz.(İstediğimiz ismi verebiliriz.)

build, api içerisine yazdığımız Dockerfile build edilerek image oluşturulacağını söylemiştik,

context, Dockerfile dizinini veriyoruz, biz docker-compose.yml ile api için oluşturduğumuz Dockerfile dosyası aynı dizinde olduğu için ‘ . ‘ yani bu dizinde bilgisini veriyoruz.

depends_on, api servisimiz çalışmadan önce db isimli servisin çalışmasını beklemesi gerekiyor, bunun bilgisini veriyoruz.

ports, hangi portlarda çalışacağını belirtiyoruz.

ui, ui servisimizin adını veriyoruz.(İstediğimiz ismi verebiliriz.)

build, ui içerisinde yazdığımız Dockerfile build edilerek image oluşturulması için,

context, docker-compose.yml dosyamız ile ui için oluşturulan Dockerfile klasör yapısında göre dizinini belirtiyoruz.(../ui demek , bir gerideki ui klasörü içerisinde demek)

ports, hangi portlarda çalışacağını belirtiyoruz.

depends_on, ui servimiz çalışmadan önce api servisimizin ayağa kalkmasını beklemesini söylüyoruz.

volumes, volume adını yazıyoruz.(db için volume oluşturmamız gerekiyor.)

Running

Çalışma mantığını kısaca anlatmak gerekirse,

docker-compose build komutu ile docker-compose dosyasına girilir ve belirttiğimiz Dockerfile’lar içerisindeki komutlar adım adım yapılır ve image’ler oluşturulur, bu işlem ortalama 2–3 dakika sürebilir.

docker-compose up komutu ile build ettiğimiz db, api ve ui ayağa kaldırırız.

Terminal üzerinde db, api, ui container’ları görebilirsiniz.

Ekran görüntüsü olarak,

Son olarak browser üzerinden test edelim,

Ekrandada göründüğü üzere uygulamamızı dockerize etmiş olduk 🙂

Github : TodoApp

--

--

Hasan Kadir Demircan
Hasan Kadir Demircan

No responses yet