Devops

Docker 101 – Temel Kavramlar ve Uygulama

Bu yazımda Docker’ın nasıl uygulama geliştirme kısmında avantaj sağladığını, Docker kullanarak bir uygulamayı nasıl konteynerize edeceğimizi öğreneceğiz. Bir uygulama yazıldıktan sonra, tüm bağımlılıkları ile nasıl docker üzerinde çalışabilir ve uygulamaların bulunduğu ortamdan bağımsız şekilde izole edilerek taşınması(shipping) yapılabilir olabildiğince açıklamaya çalışacağım.

Neden Docker?


Geleneksel uygulama dağıtım yöntemlerinde genellikle monolitik tasarlanan uygulamanın doğrudan sanal sunuculara kurulmasını gerektirir. Bu süreçte, işletim sistemi, gerekli kütüphaneler ve bağımlılıklar manuel olarak yapılandırılır. Eski monolit uygulama yapıları ftp ile sunucudan sunucuya taşınırdı. Yeni sunucuya aktarılan dosyalar yeni sunucuda doğrudan çalışmazdı çünkü eski uygulamaya göre dizayn edilmediği için sorunlar oluşurdu. Bu durumda hem developer, hem de sistem yöneticileri arasındaki iletişim eksikliğinden dolayı taşıma veya geliştirip test etme süreçleri uzun sürerdi.


Docker, uygulamayı ve tüm bağımlılıklarını bir konteyner (container) içinde paketler ve Donanım düzeyi değilde, işletim sistemi düzeyinde sanallaştırır. Bu, uygulamanın geliştirildiği ortamla(development), üretim ortamı(production) arasında %100 uyumluluk sağlar. En önemli rekabet avantajı budur. Uygulamasını, docker ile paketleyebilen(dockerize eden), docker üzerinde test eden ve ortamlarına taşıyan ekip, her zaman uygulamasını daha hızlı deploy eder hale gelir
“Bir kez yaz, her yerde çalıştır” prensibiyle farklı platformlarda aynı şekilde çalışır.

Dockerizasyon, Docker containerları içinde uygulamaların oluşturulması, yapılandırılması ve dağıtılması sürecini ifade eder. Docker, geliştiricilerin uygulamaları ve bağımlılıklarını izole edilmiş ve taşınabilir containerlara paketlemesine olanak tanıyan ve çeşitli ortamlarda tutarlı davranış sağlayan popüler bir konteynerleştirme platformudur.

Docker Mimarisi

Docker mimarisi içerisinde oluşturacağımız temelde bilmemiz gereken 2 şey olacak. Image ve Container

Image, uygulama kodunu ve çalışma zamanı bağımlılıklarını içeren ‘self-contained’ bir birimdir. Docker image, container oluşturmak için bir şablon/template olarak düşünülebilir.

Image, container’ın çalışması için gereken tüm library’leri, bağımlılıkları ve dosyaları içerir. Bir Docker image, paylaşılabilir ve taşınabilirdir. Böylece aynı image’ı tıpkı windowsta bir oyunun kısayol .exe dosyası gibi aynı anda birden fazla ortama dağıtabilirsiniz.

Container, Docker image’ının çalışması için Bir image, container olarak başlatıldığında, hafif, izole edilmiş bir ‘runtime environment’ haline gelir. Her container’ın kendi dosya sistemi, işlemleri ve network ağı vardır ve bu da birden fazla container’ın birbirleriyle çakışmadan aynı ana bilgisayarda aynı çekirdekte çalışmasına olanak tanır.

—————

Docker Engine  containerları oluşturup çalıştıran ana yazılımdır. İki bileşeni vardır:

1. Docker Daemon: Containerlar ve image’ları yönetir.

2. Docker CLI: Docker ile komut satırından iletişim kurmanızı sağlar.

Docker Registery Registry, Docker image’larının saklandığı bir depodur. Örneğin, Docker Hub, en popüler ve açık kaynaklı bir Docker Registry’dir.


Dockerizing

Docker bağlamında Dockerizing, Docker container içinde uygulama oluşturma, yapılandırma ve dağıtma sürecini ifade eder. Docker, geliştiricilerin uygulamaları ve bağımlılıklarını izole edilmiş ve taşınabilir containerlara paketlemelerine olanak tanıyan ve çeşitli ortamlarda tutarlı davranış sağlayan popüler bir containerleştirme platformudur. Dockerizing, bir uygulamayı ve ilişkili bileşenlerini, kod, runtime, sistem araçları, librari’leri ve tüm ayarlar dahil olmak üzere uygulamanın çalışması için gereken her şeyi kapsülleyen(izole eden) bir Docker image’a dönüştürme sürecidir.

——

Dockerfile, bir Docker image’ını oluşturmak için talimatlar içeren bir metin dosyasıdır.
sadece bir imajın nasıl inşa edileceğini tanımlayan bir yapılandırma dosyasıdır. Uygulamanızın çalışabilmesi için gereken tüm adımlar, bağımlılıklar ve yapılandırmalar bu dosyada belirtilir

Docker-compose, birden fazla konteyneri birlikte çalıştırmak için kullanılan bir araçtır. docker-compose.yml dosyası, birden fazla Docker konteyneri için yapılandırma bilgilerini içerir. Bu dosya, birden fazla servis, ağ, hacim ve diğer yapılandırmaları tanımlar, böylece birden fazla konteyneri tek bir komutla başlatabilir ve yönetebilirsiniz. Eğer kendi uygulamanızın bir registery’de image’ı yoksa dockerfile olmadan compose yapılamaz. Ancak image’ınız bir registeryde varsa veya resmi dockerhub image’larını kullanıyorsanız Dockerfile kullanmanıza gerek yok.


Adım Adım Uygulama

Eğer windows veya Mac kullanıyorsanız https://docs.docker.com/desktop/ linkinden docker desktop kurulumu yapıp devam edebilirsiniz. Böylece hem docker engine hem de kullanışlı bir arayüzü ile devam edebilirsiniz.

Linux ortamlarında çalışıyorsanız docker resmi documentation sayfasından kurulum talimatlarını takip edebilirsiniz.

Örneğimizde Nginx Go ve mariadb ile çalışan bir uygulamayı dockerize ederek image haline getirip daha sonrasında image üzerinden container çalıştırarak lokal ortamda çalıştıracağız.

İlk önce repo üzerinde uygulamamızı git clone komutu ile indirelim

git clone https://github.com/kocdeniz/dockerize-tutorial.git

2. Ardından ilgilendiğiniz belirli dizine gidin:

cd dockerize-tutorial

Artık makinenizde nginx-golang-mysql örneğine ve tüm gerekli dosyalara sahip olacaksınız.

Dizin şunları içermelidir:

• Docker Compose yapılandırması >> compose.yml

• Golang uygulama kodu >> backend

• Nginx yapılandırması >>> proxy

• MySQL kurulum dosyaları >> db

Dockerfile’da Bulunan Temel Talimatlar


FROM

RUN

WORKDIR

EXPOSE

COPY

CMD 

Bir Dockerfile’ın ilk talimatı genellikle FROM olur. Bu talimat, hangi temel imajın kullanılacağını belirtir. Örneğin, bir Node.js uygulaması için node imajı kullanılabilir.

FROM --platform=$BUILDPLATFORM golang:1.18-alpine AS builder


Bu satırda, golang:1.18-alpine imajını kullanarak, belirtilen platforma göre Go uygulaması derlemek için bir builder aşaması başlatır ve platform bağımsız bir build işlemi gerçekleştirilmesini sağlar ($BUILDPLATFORM ile).

İndirdiğimiz uygulamamızın yapısı bu şekilde

.
├── backend
│   ├── Dockerfile
│   ├── go.mod
│   ├── go.sum
│   └── main.go
├── db
│   └── password.txt
├── compose.yaml
├── proxy
│   └── nginx.conf
└── README.md

compose komutlarının olduğu compose.yml içeriğinde üç ana servisi tanımlayan bir yapılandırma dosyasını içeriyor: backend, db ve proxy

Uygulamayı dağıtırken, docker compose proxy servisini 80 numaralı portunu dosyada belirtilen şekilde ana bilgisayarın 80 numaralı portuna eşler. Ana bilgisayarda 80 numaralı portun zaten kullanımda olmadığından emin olun.

services:
backend:
build:
context: backend
target: builder

db:
image: postgres

proxy:
image: nginx
volumes:
– type: bind
source: ./proxy/nginx.conf
target: /etc/nginx/conf.d/default.conf
read_only: true
ports:
– 80:80


docker compose up -d komutu ile , bu docker-compose.yml dosyasını kullanarak tanımlanan tüm servisleri başlatıp konteynerleri arka planda çalışacak şekilde (detached mode) ayağa kaldıralım

 docker compose up -d

Yukarıdaki komut tamamlanması biraz uzun sürecek gerekli imajları pull edip containerları build edecek ve çalıştıracak. Oluşturulan containlerları listelemek için aşağıdaki komutu kullanalım:

docker compose ps

http://localhost/ ile çalışan uygulamayı gözlemleyebilirsiniz.

Sonuç olarak bir uygulamayı dockerize ederek image haline getirip içerisindeki servisleri container ile bağımsız çalışmasını sağlamış olduk.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu