0% found this document useful (0 votes)
141 views36 pages

Docker

sadadasd

Uploaded by

sinanozata0
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
141 views36 pages

Docker

sadadasd

Uploaded by

sinanozata0
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

Docker

Yazılımları ve tüm bağımlılıklarını kapsülleyen, taşınabilir ve tutarlı çalışan


"konteyner" adı verilen birimlerde çalıştırılmasını sağlar. Docker konteynerleri,
yazılımın çalıştırıldığı ortamı soyutlayarak, farklı ortamlarda aynı şekilde çalışmasını
garantiler.

💡 Peki nedir bu konteyner ?


Konteyner, yazılım uygulamalarını ve bağımlılıklarını bir arada paketleyip
çalıştırmak için kullanılan izole bir ortamdır. Konteynerler, uygulamanın
çalışması için gereken her şeyi (kod, kitaplıklar, yapılandırma dosyaları,
bağımlılıklar vb.) içerir ve bu sayede uygulamalar her ortamda tutarlı bir
şekilde çalışabilir.

Örneğin bir projede MongoDB kullanmak istiyorsunuz, ancak MongoDB'yi


bilgisayarınıza doğrudan kurmak istemiyorsunuz. Docker kullanarak MongoDB'yi
bir konteynerde çalıştırırsınız. Bu, MongoDB'nin kendi izole ortamında çalışmasını
sağlar. MongoDB konteynerini başlattığınızda, MongoDB'nin tüm özelliklerini
kullanabilirsiniz. İşiniz bittiğinde konteyneri kapatırsınız. Bu, MongoDB'nin
çalışmasını durdurur ve tüm kaynakları serbest bırakır. Konteyner silindiğinde,
MongoDB tamamen kaldırılır ve bilgisayarınızda hiçbir iz bırakmaz.

Senaryo 1: Yazılım Test Ortamı


Durum: Bir yazılım şirketi, yeni bir yazılım sürümü çıkarmadan önce yazılımı test
etmek istiyor. Şirketin farklı test makineleri var ve her makine farklı işletim
sistemleri ve konfigürasyonlarla çalışıyor.
Docker ile: Şirket, test ortamını bir Docker konteynerine koyar. Bu konteynerde
yazılım ve tüm gerekli bağımlılıklar bulunur. Test mühendisleri, aynı Docker
konteynerini kullanarak yazılımı farklı makinelerde aynı şekilde test edebilirler.

Docker 1
Böylece, her makinede tutarlı test sonuçları elde edilir ve sürüm öncesi sorunlar
minimuma indirilir.

Senaryo 2: Çapraz Platform Geliştirme


Durum: Bir geliştirici, uygulamanın hem Windows hem de Linux üzerinde
çalışmasını sağlamak istiyor.
Docker ile: Geliştirici, uygulamanın her iki işletim sisteminde de çalışmasını
sağlayacak iki ayrı Docker konteyneri oluşturur. Her konteyner, belirli bir işletim
sistemini simüle ederek uygulamanın farklı platformlarda nasıl çalıştığını test
etmeye olanak tanır.

Senaryo 3: Veri Yedekleme ve Geri Yükleme


Durum: Bir şirket, veritabanı yedeklerini düzenli olarak almalı ve gerektiğinde geri
yüklemelidir.
Docker ile: Şirket, veritabanı yedekleme ve geri yükleme işlemlerini
otomatikleştiren bir Docker konteyneri oluşturur. Bu konteyner, yedekleme işlemini
gerçekleştirir ve yedekleri güvenli bir şekilde saklar. Ayrıca, veritabanını geri
yüklemek için bu konteyneri kullanarak verileri geri alabilir.

Senaryo 4: Geliştirme ve Dağıtım Süreçlerini Otomatikleştirme


Durum: Bir yazılım geliştirme süreci, uygulamanın sürekli entegrasyon ve sürekli
dağıtım (CI/CD) gerektiriyor.
Docker ile: Şirket, uygulamayı sürekli olarak test eden ve dağıtan bir Docker
konteyneri oluşturur. Bu konteyner, her kod değişikliği sonrası otomatik testler
yapar ve başarılı olursa yeni sürümü otomatik olarak dağıtır.

Docker ‘a neden ihtiyaç duyabilirsin ?


Docker, çeşitli senaryolarda uygulamaları, bağımlılıkları ve araçları izole bir şekilde
çalıştırmak için kullanılır. İşte Docker'ın sağladığı bazı avantajlar:

Taşınabilirlik: Aynı Docker konteyneri farklı ortamlarda çalıştırılabilir.

Tutarlılık: Uygulamalar, her ortamda aynı şekilde çalışır.

Yalıtım: Uygulamalar, birbirinden bağımsız olarak çalıştırılır.

Docker 2
Verimlilik: Geliştirme, test ve dağıtım süreçleri kolaylaşır ve
otomatikleştirilebilir.

Geliştirme: Farklı projeler ve sürümler için ayrı ortamlar oluşturulabilir.

💡 Yazının devamında Konteyner kelimesi Container olarak kullanılacaktır.

Aslında container yapıları 10 seneden fazladır bilinmekte ve birden fazla container


türü bulunmakta. Docker bu türlerden LXC container türünü kullanmaktadır.

Peki container zaten daha öncede varsa neden Docker kullanıyoruz ?


Çoğu teknoloji ve yazılım dili paketleme aşamasında aslında low-level dediğimiz
makine diline çevrilir. Yazdığımız bir for döngüsü makine dilinde 20 satır koda
dönüşebilir. Makine dili oldukça zordur ve anlaşılması güçtür ve container
yapılarıda low-level bir iştir ve yönetimi oldukça zordur. Docker bu konuda devreye
giriyor ve bizim oluşturduğumuz modern dilde high-level yapıları low-level yapıya
çevirmede birçok araç sunuyor.

💡 Low level dil : Bilgisayarın doğrudan anlayabileceği ve işleyebileceği en


temel komutları içeren programlama dilleridir. Makine dili veya assembly
gibi diller düşük seviye diller olarak kabul edilir.

High level dil : İnsanlar tarafından daha anlaşılır ve okunabilir olan,


soyutlamalar sağlayan ve genellikle daha karmaşık yapıları yönetmek için
tasarlanmış dillerdir. Python, Java, C#, JavaScript gibi modern
programlama dilleri yüksek seviye diller örneğidir.

Genel olarak özetlersek


Docker containerları, birbirinden bağımsız çalışan kapsüller oluşturmamıza olanak
tanır. Bu kapsüllerin her biri farklı bağımlılıklara ve kütüphanelere sahip olabilir. Örn
bir proje için 3 ayrı container yapısı oluşturdunuz ;
[Link] : Web Server : Node & [Link]

[Link] : Frontend : Nextjs

Docker 3
[Link] : Veri Tabanı : mongoDB
İlerleyen süreçte ExpressJs ‘in en son sürümüne geçmeniz gerekiyor fakat en son
sürüme geçerseniz mongoDB ‘de ki bazı alanlarınızı da güncellemek zorunda
kalacaksınız. Çünkü mongoDB, express’in eski versiyonunda çalışan bazı
özellikleri barındırıyor. İşte burada Docker ‘ın en önemli özelliği devreye giriyor. Siz
container yapısında bu teknolojileri çalıştırdığınız için şöyle diyebilirsiniz :
[Link] ‘ım da ki mongoDB, ExpressJS ‘in eski sürümde çalışsın, [Link]
‘da ki ExpressJS en son sürüme güncellensin. Birbirinden izole şekilde çalışan
container ‘lar ile artık bir güncellemenin peşinden sürüklenen diğer
güncellemelerden kurtulmuş olursunuz.

Sanal Makineler ve Docker


Aslında container lar biraz sanal makine mantığına benzerdir. Bilgisayarınızın
içerisinde yine farklı bir alan oluşturup, burada bağımsız işlemler
gerçekleştiriyorsunuz.

Docker bulunduğu işletim sisteminin çekirdeğini kullanırken, her sanal makinenin


ayrı bir işletim sistemi vardır. Bir Docker container ‘ı çalıştırmak için zaten hali
hazırda çalışan bir sistem üzerinden çalıştırmaya başlatırsınız, fakat Sanal
makineler ‘de ek olarak sanal makinenin işletim sisteminin ayağa kalmasını
beklemek zorundasınız.

Ayrı bir işletim sistemine gerek duymaksınız çalışan Docker container ları bu
nedenle sanal makinelere göre daha az RAM, CPU, Depolama ile daha
performanslı işlemler gerçekleştirebilir.

Docker Image
Uygulamanızın ve onun çalışması için gereken her şeyin (kod, runtime,
kütüphaneler, bağımlılıklar, ayarlar) paketlenmiş halidir. Bir Docker image, bir ya da
daha fazla katmandan oluşur ve bu katmanlar bir araya gelerek uygulamanızın
çalıştığı container'ı oluşturur. Docker image'ları, belirli bir işletim sistemi, yazılım
sürümleri ve uygulama yapılandırmaları dahil olmak üzere her şeyin tam bir anlık
görüntüsünü içerir.

Docker Image ve Container Arasındaki Fark

Docker 4
Docker Image: Bir Docker container oluşturmak için kullanılan salt-okunur bir
şablondur. Image'lar, bir uygulamanın ve onun bağımlılıklarının anlık
görüntüsünü temsil eder. Docker image'ları, bir Dockerfile kullanarak
oluşturulur.

Docker Container: Docker image'larından oluşturulan çalışan örneklerdir.


Container'lar, uygulamanızın izole edilmiş ortamda çalışmasını sağlar.
Container'lar aynı image'dan birden fazla oluşturulabilir ve her biri kendi
bağımsız çalışma ortamına sahiptir.

Image ‘leri bir template olarak düşünebiliriz. Günün sonunda container ‘ların nasıl
çalışacağı, hangi adımları izleyeceğini ve hangi şekle bürüneceğini planlayan
yapılardır. Kabaca bir React uygulamasında kaynak kodlarına Docker Image dersek
sunucuya yüklenmiş ve çalıştırılmış, bir domain ile giriş yaptığımızda karşımıza
çıkan projenin çalışır son haline ile Docker Container diyebiliriz.

Docker image'ları genellikle bir Dockerfile kullanılarak oluşturulur. Dockerfile, bir


image oluşturmak için gereken talimatları içeren metin dosyasıdır. İşte temel bir
Dockerfile örneği:

# Base image olarak [Link] kullanıyoruz


FROM node:18-alpine

# Çalışma dizinini oluştur ve ayarla


WORKDIR /app

# [Link] ve [Link] dosyalarını kopyala


COPY [Link] [Link] ./

# Bağımlılıkları yükle
RUN yarn install

# Uygulama dosyalarını kopyala


COPY . .

# Uygulamayı üretim için derle


RUN yarn build

Docker 5
# Uygulamanın dinleyeceği portu belirt
EXPOSE 3000

# Container başlatıldığında çalışacak komutu belirt


CMD ["yarn", "start"]

Docker Hub
Docker imajlarını depolamak, paylaşmak ve dağıtmak için kullanılan merkezi bir
platformdur. Docker Hub, geliştiricilerin ve ekiplerin kendi Docker imajlarını
oluşturup diğer kullanıcılarla paylaşmasını sağlar. Aynı zamanda, popüler yazılım
imajlarının resmi sürümlerini bulabileceğiniz bir kaynaktır. Birçok popüler yazılımın
(örneğin, MySQL, Nginx, Redis) resmi Docker imajları Docker Hub'da bulunabilir.

npm ‘de nasıl geliştiriciler paket oluşturur ve yayınlar, ardından biz bu paketleri
yarn add, npm install .vb komutlar kullanarak kendi bilgisayarımıza indirip entegre
ediyorsak benzer bir mantıkla DockerHub ‘da geliştiriciler tarafından yayınlanan
Docker image deposu diyebiliriz.

Kitaplık Örneği
Kitaplık Metaforu:

Docker Hub: Büyük bir dijital kitaplık.

Docker İmajları: Kitaplar.

Geliştiriciler: Kitapları yazan ve okuyan kişiler.

Mantığı:
1. Kitap Oluşturma (Docker İmajı Oluşturma): Bir yazar (geliştirici), bir kitap
(Docker imajı) yazar.

2. Kitap Yükleme (Docker İmajını Yükleme): Yazar, bu kitabı dijital kitaplığa


(Docker Hub) yükler.

3. Kitap Paylaşma (Docker İmajını Paylaşma): Diğer yazarlar ve okuyucular


(diğer geliştiriciler), bu kitabı kitaplıktan (Docker Hub'dan) indirip okuyabilirler.

Docker 6
Örnek:
Yazar: Alice

Kitap: "[Link] ile Web Geliştirme"

Kitaplık: Docker Hub

Alice, "[Link] ile Web Geliştirme" adlı kitabını (Docker imajını) yazar ve bu kitabı
(Docker imajını) Docker Hub'da (dijital kitaplıkta) paylaşır. Bob ve diğer
geliştiriciler, bu kitabı (Docker imajını) Docker Hub'dan indirip kullanabilirler.

Docker ile çalışmaya başlangıç

⚠️ Önemli Not : Bu bölümden itibaren Docker'ın yöntemleri ve sadece


önemli notları yer almaktadır. Eğer temel Docker kullanımı hakkında
bilginiz yoksa, aşağıdaki alanları anlamakta zorlanabilirsiniz. Temel
Docker kullanımını öğrenmek için farklı kaynaklardan bilgi edindikten
sonra, aşağıdaki notları kullanmanız faydalı olacaktır.

ℹ️ Docker kurulumu ve temel kullanımları için işte bir kaynak : Kaynağı


incele

💡 Bilgilendirme : Aşağıda belirtilen metotları bilgisayarınızdaki terminale


yazmanız gerekir.

Docker pull
İlgili image ‘in yükleme dosyasını Docker Hub ‘dan indirir. Docker Hub sitesinden
tüm image lere göz atabilirsin.

docker pull ubuntu

Docker images (Image Listelemek)


İndirdiğin tüm image ‘leri listeler.

Docker 7
docker images

Docker run

💡 Eğer çalıştıracağınız image ‘i pull etmeden docker run ile çalıştırmak


istersen docker önce onu hub dan pull edip indirir ve daha sonra
çalıştırır.

docker run ubuntu

Docker ps
Çalışan container ‘ları listeler.

docker ps

Docker ps ile aynıdır, çalışan container ları listeler.

docker container ls

Docker ps -a
Geçmişte çalıştırılmış tüm container ‘ları listeler.

docker ps -a

Docker container ls -a
Docker ps -a ile aynıdır, geçmiş çalıştırılan container ları listeler.

docker container ls -a

Docker 8
💡 Docker ‘da çalıştırılan her container rastgele isimlendirilir ve her kapatılıp
açılmada bu isim değişir. docker run ubuntu ile container ‘ı çalıştırıp
docker ps ile çalışan container ‘ın ismini görüntüleyebilirsin.

Container isimlendirmek

// container 'ı test_name olarak isimlendirdik.


docker run --name test_name ubuntu

💡 Her docker run işleminde aslında bir tema oluştururuz. Bu container ‘ları
isimlendirmeden çalıştırmak aslında geçici tema oluşturmak demektir.
Tekrar aynı tema ile bir container çalıştırmak istediğimizde bir daha aynı
kod satırını yazmamız gerekir.

// çalıştırma teması oluşturuyorum ve isimlendiriyorum


docker run --it --name test_name ubuntu
// bir süre sonra container 'ımı kapatıyorum ve daha sonra tekra
// çalıştırmak istediğimde container adını yazmam yeterli.
docker start test_name
// karşılığında docker run --it --name test_name ubuntu şeklinde
// container 'ımı çalıştıracaktır.

Container içerisine girmek ve dosyaları listelemek

//base imajdan bir container oluşturup -it ile terminale erişiyo


// sh ile /bin/sh kabuğuna bağlanıyorum. sh belirtmezsek doğru y
docker run -it {base_imaj} sh

// ile dosyalarımı listeliyorum


ls -al

Docker 9
💡 // tüm kullanılmayan image ve container 'ları siler
docker system prune -a

Docker start
Bir container ‘ı çalıştırmak için kullanılır.

docker run --name ubuntu_test ubuntu

docker start ubuntu_test

Docker stop
Çalışan container ‘ın çalışmasını durdurmak için kullanılır

docker start ubuntu_test

docker stop ubuntu_test

💡 docker run ile oluşturulan her container bellek ‘de yer kaplar.
Kullanılmayan container ‘ın silinmesi gerekir.

Docker images silme docker container silmek (Docker rm Docker


rmi)

docker rm <container_name_or_id> // container siler


docker rmi <image_name_or_id> //images siler

Docker toplu container silme, toplu images silme

// -f silmek için onay istemez

// çalışmayan tüm containerları siler,

Docker 10
docker container prune -f

// tüm images leri siler


docker image prune -a -f

// çalışmayan container ları, imajları, ağları ve artıkları topl


docker system prune -a -f

Docker Hub ile bir image ‘nin belirli bir sürümünü indirmek (tags)
Tag ‘ları yani versiyonları Docker Hub sayfasından öğrenebiliriz. Eğer bir sürüm
belirtmezsek latest olan en son sürümü indirir.

docker pull redis:5.2.3

Detach Mode
Konsolda bir docker image ‘i çalıştırdığımızda, image çalışır ve o konsol ‘da
herhangi bir işlem yapmamız bloklanır, işlem yapabilmek için Ctrl + C yaparak
çalışmayı durdurmamız gerekir. Detach mode ile çalıştırdığımız image ‘e
arkaplanda çalışmasını söylersek konsol ‘da işlem yapmaya devam edebiliriz.

docker run -d redis

ℹ️ Yukarıda belirtilen işlemde aslında blocklama dediğimiz olay çalıştırılan


image ‘in loglarını bastırmasıdır. Yani docker run redis dediğimizde redis
çalışır ve artık o konsolda işlem yapmamız engellenir. Artık o container
‘da yapılan her değişiklik log olarak konsola yazılacağı içindir. Mesela
container ‘ı restart edersem log olarak o konsola restart logunu yazacak,
durdurursam durdurulduğuna dair log yazacak ..vb

Docker 11
💡 Sürekli olarak konsola log atan container yapılarının arkaplanda (detach
mode) çalıştırılması daha uygundur, çünkü sürekli log atmak bellekte yer
kaplar belleğin şişmesine neden olabilir.

Attach Mode
Detach mode ile arkaplanda çalışmaya zorlanan container ‘ı attach mode ile
tekrardan konsola loglaması gerektiğini belirtmek içindir.

docker attach {container_name}

Container loglarını görüntülemek

docker logs {container_name veya id}

// veya
docker container logs {container_name veya id}

Interactive Terminal (-it)


Interactive (-i)

Docker run ile çalıştırılan uygulama standart giriş akışını (STDIN) terminale
bağlamaz. Varsayılan olarak standart çıkış (STDOUT) ve standart hata (STDERR)
akışlarını bağlar ve biz sadece çıktı ve hata loglarını konsolda görebiliriz. Eğer
uygulama bir giriş bekliyor ise (Örn 28. satırda bir şifre girdisi bekliyor), imajı -i
komutu ile çalıştırarak standart giriş akışını terminale bağlayıp artık giriş
yapabiliriz.

// Aşağıdaki metot bizden bir yeni parola girdisi bekler ama biz
// için girdi veremeyiz ve container çalışıp hemen ardından hata
docker run ubuntu passwd root

// artık girdi verebiliriz.


docker run ubuntu -i passwd root

Docker 12
Terminal (-t)

pseudo-TTY (sahte terminal) oluşturmamızı ve terminalin tüm işlevlerini


kullanabilmemizi sağlar. Yukarıda -i kullanarak terminal girdilerini ve işlevlerini aktif
etmiştik. -t kullanmamak terminale özgü bazı özelliklerin çalışmamasına neden
olabilir.

Docker network

docker network create --driver bridge --subnet [Link]/24 --g

mongo-server isminde mongo imajı ile yenir bir container oluşturdum ve yukarıda
oluştruduğum custom-network üzerinden çalışmasını belirttim.

docker run --name mongo-server --net custom-network -d mongo

Farklı bir container oluşturdum ve bunu da aynı network üzerinden çalışmasını


belirttim. Bu sayade iki container aynı network üzerinden birbiri ile iletişim
kurabilecek.

docker run --name express-app --net custom-network express

history
Geçmişte çalıştırdığın komut satırlarını listeler.

history

ubuntu container oluşturmak ve nodejs kurmak

docker pull ubuntu:18.04 //belirli bir sürümü indiriyorum


docker run -it ubuntu:18.04 // çalıştırıp içerisine giriyorum
apt-get update // içerisine girdikten sonra güncellemeleri alıp

// -y ile tüm seçenekleri onaylayarak işletim sistemine curl kur


apt-get install curl -y

Docker 13
// nodejs 'in istediğim versiyonunu indiriyorum
curl -sL [Link] | bash

// indirdiğim nodejs 'in kurulumunu yapıyorum.


apt-get install nodejs -y

Basit bir nodejs örneği yapıp çalıştırmak.

cd opt //opt klasörünün içerisine giriyorum

// [Link] adında bir dosya oluşturup içerisine [Link] yaz


echo '[Link]("nodejs app ubuntu");' > [Link]

// [Link] dosyamı nodejs ile çalıştırdığımda [Link] ibare


node [Link]

Dockerfile
İmaj oluşturmak amacıyla kullanılan bir betik dosyasıdır. Dockerfile'da çeşitli
komutlar kullanılarak, bir baz imajdan başlayarak, gerekli yazılım paketleri yüklenir,
dosyalar kopyalanır, ortam değişkenleri tanımlanır ve çalıştırılacak komutlar
belirtilir. Terminalde çalıştırdığımız komutları bir Dockerfile dosyasına döküp,
süreci otomatikleştiriyoruz.

💡 Dockerfile kullanmadan bir nodejs uygulaması çalıştırırken önce bir


işletim sistemi (örn ubuntu) imajı kullanarak container oluşturup içerisine
nodejs kurarız. Peki Dockerfile kullanarak oluşturduğumuz imajda
herhangi bir işletim sistemi ismi vermediğimiz halde container ‘ımı hangi
işletim sistemi üzerine kuruyor ?

Dockerfile ‘da FROM komutundan sonra belirttiğimiz base imajlar aslında


bir pakettir. Bu paketlerin içerisinde işletim sistemi pull edilir kurulur
gerekli işlemler yapılır vs. Örneğin FROM node:16-slim komutu debian
işletim sistemine nodejs i kurmamızı sağlayan bir pakettir.

Docker 14
Dockerfile dosyası oluşturmadan önce temel komutları görelim , zaten biliyorsan
Dockerfile örneğine geçebilirsin.

FROM

Anlamı: Belirtilen imajdan başlar. Dockerfile'daki ilk komut olmalıdır.

Örnek: FROM node:14

Açıklama: [Link]'in 14 sürümünü içeren baz imajı kullanır.

RUN

Anlamı: Konteyner içinde bir komut çalıştırır. Genellikle yazılım paketlerini


yüklemek için kullanılır.

Örnek: RUN apt-get update && apt-get install -y git

Açıklama: Konteyner içinde apt-get update ve apt-get install -y git

komutlarını çalıştırır.

COPY

Anlamı: Dosyaları veya dizinleri yerel dosya sisteminden konteynere


kopyalar.

Örnek: COPY . /app

Açıklama: Mevcut dizindeki tüm dosyaları ve dizinleri konteynerin /app

dizinine kopyalar.

ADD

Anlamı: Dosyaları veya dizinleri kopyalar, ayrıca URL'den dosya indirme ve


arşivleri açma yeteneğine sahiptir.

Örnek: ADD [Link] /app/

Açıklama: Belirtilen URL'den dosyayı indirir ve /app/ dizinine kopyalar.

WORKDIR

Anlamı: Çalışma dizinini ayarlar. Bundan sonraki tüm komutlar bu dizinde


çalışır.

Örnek: WORKDIR /usr/src/app

Açıklama: Çalışma dizinini /usr/src/app olarak ayarlar.

Docker 15
CMD

Anlamı: Konteyner başlatıldığında çalıştırılacak varsayılan komutu tanımlar.


Dockerfile'da sadece bir tane olmalıdır.

Örnek: CMD ["node", "[Link]"]

Açıklama: Konteyner başlatıldığında node [Link] komutunu çalıştırır.

ENTRYPOINT

Anlamı: Konteyner başlatıldığında çalıştırılacak ana komutu tanımlar. CMD

ile birlikte kullanılabilir.

Örnek: ENTRYPOINT ["[Link]"]

Açıklama: Konteyner başlatıldığında [Link] betiğini çalıştırır.

ENV

Anlamı: Ortam değişkenlerini ayarlar.

Örnek: ENV NODE_ENV production

Açıklama: NODE_ENV ortam değişkenini production olarak ayarlar.

EXPOSE

Anlamı: Konteynerin dinleyeceği portu belirtir.

Örnek: EXPOSE 8080

Açıklama: Konteynerin 8080 portunu dinleyeceğini belirtir.

VOLUME

Anlamı: Host ve konteyner arasında paylaşılan bir disk alanı oluşturur.

Örnek: VOLUME ["/data"]

Açıklama: Host ile konteyner arasında /data dizinini paylaştırır.

Yukarıda oluşturduğumuz ubuntu, nodejs örneğini için Dockerfile dosyası


oluşturalım.

// base imajın ubuntu nun 18.04 sürümü olacağını belirttim


FROM ubuntu:18.04

Docker 16
// terminalde sırası ile komutlarımı çalıştırıyorum
// ubuntu güncelleniyor, curl indiriyorum, curl ile nodejs indir
RUN apt-get update
RUN apt-get install curl -y
RUN curl -sL [Link] | bash
RUN apt-get install nodejs -y

//terminalde /opt/note-app yoluna geçiyorum


WORKDIR /opt/node-app

// birinci arguman localimdeki klasör yolum, ikinci arguman cont


// nokta ise tüm dosyalar anlamı taşır. localimde ana dizindeki
// ana dizine kopyala anlamı taşır. localimde ki uygulamayı cont
// işlem yapabileyim.
COPY . .

// kopyalamadan sonra terminalde indexjs 'i nodejs ile çalıştırı


// aşağıdaki kodun çıktısı: node [Link]
CMD ["node","[Link]"]

// artık terminalden proje dizinine geçip docker build . yazdığı


// dosyasındaki adımları sırası ile tek tek çalıştırır.
docker build .

Yukarıdaki işlem bir container oluşturur. Bu container isimsiz olduğundan docker


images dendiğinde <none> olarak gözükür.

💡 Container ‘lar hafızada geçici yer kaplar. Kapandıkları zaman veriler ve


loglar silinir. Eğer bir database gibi kalıcı verilerin tutulması gerekiyor ise
Volume Mapping işlemi yapılmalıdır. Volume Mapping ile container ile pc
arasında paylaşımlı bir disk alanı açılır ve ilgili container ‘ın verileri
container silinene kadar saklanır. Bu sayede local ‘de mongodb çalıştırıp
veri ekledikten sonra container kapatıp tekrar açsanız bile verilerin hala
içeride olduğunu görürsünüz.

Docker 17
Layer
Docker layer (katman), Docker imajlarının oluşturulmasında kullanılan bir
mekanizmadır. Her Docker imajı, bir dizi katmandan oluşur ve her katman bir
önceki katmanın üzerine eklenir.
Örneğin run apt-get update komutu bir kere çalıştırdığında bunun için bir layer
oluşturur ve cache ‘de saklar. Tekrar aynı komutu çalıştırdığında bu işlemi tekrar
etmek yerine cache ‘den alır ve o adamı atlayarak bir sonraki adıma geçer. Bu
sayede çok daha hızlı işlemleri gerçekletirir.

alpine
Docker imajları için kullanılan hafif ve minimal bir Linux dağıtımı olan Alpine Linux'u
ifade eder. Standart bir Ubuntu imajı 100MB'tan büyük olabilirken, bir Alpine Linux
imajı genellikle 5MB civarındadır. Bu, daha hızlı indirme ve daha az disk kullanımı
anlamına gelir.

💡 Docker hub ‘dan edineceğin imajın açıklama sayfasında alpine, slim gibi
taglar ile hazırlanmış Dokerfile sürümlerini görebilirsin.

FROM node
WORKDIR /opt/node-app
COPY . .
ENV PORT=8000
CMD [ "node","[Link]"]

Çalıştığı zaman yaklaşık 1GB ‘a yakın bi dosya boyutunu ulaşır. Fakat alpine linux
tabanlı bir imaj kullanmak boyutu ve hızı kat ve kat arttırır. Çünkü daha az
bağımlılık ve daha az ek yazılım bileşeni içerir.

FROM node:14-alpine //Alpine Linux tabanlı [Link] imajı kullan


WORKDIR /opt/node-app
COPY . .

Docker 18
ENV PORT=8000
CMD [ "node","[Link]"]

Nodejs uygulaması

// [Link]
const express = require("express");
const app = express();
const PORT = [Link] || 3000;

[Link]("/", (req, res) => {


[Link]("İstek başarılı, merhaba.");
});

[Link](PORT, () => {
[Link](`Server ${PORT} portunda dinleniyor.`);
});

// Dockerfile
FROM node:14-slim
WORKDIR /opt/node-server
COPY . .
RUN npm install
CMD [ "node","[Link]" ]

.dokerignore
node_modules

Terminalde uygulama dizinime girip işlemlerimi gerçekleştiriyorum

// container 'ımı isimlendirerek oluşturuyorum.


docker build . -t simple-node-server
// localhost 'um çalıştırabilmek için port mapping yapıyorum

Docker 19
// ilk port localhost:... ile erişeceğim port, ikinci port app.j
// node serverimi dinlediğim port.
docker run -p 3000:3000 simple-node-server

[Link] // artık uygulamama erişebilirim.

Dockerfile port belirleme (EXPOSE)


Container ‘ın çıkış portunu belirtiyoruz. localhost çalışma portu değil !

FROM node:14-slim
WORKDIR /opt/node-server
COPY . .
EXPOSE 3000 // 3000. portta çalışacağını belirtiyoruz.
RUN npm install
CMD [ "node","[Link]" ]

MongoDB ve Nodejs uygulaması

// [Link]
const Mongoose = require("mongoose");

const todoSchema = new [Link]({


title: String,
description: String,
completed: Boolean,
created_at: Date,
});

[Link] = {
TodoModel: [Link]("todo", todoSchema),
};

//[Link]
"dependencies": {

Docker 20
"body-parser": "^1.19.0",
"cors": "^2.8.5",
"express": "^4.17.1",
"mongoose": "^5.11.13"
},
"devDependencies": {
"nodemon": "^2.0.7"
}

// Dockerfile
FROM node:16-slim
WORKDIR /opt/node-todo-app
COPY . .
EXPOSE 3000
RUN yarn install
CMD [ "node","[Link]" ]

[Link]
const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
const app = express();
const { TodoModel } = require("./TodoModel");
const Mongoose = require("mongoose");
const PORT = [Link] || 3000;

[Link]([Link]());
[Link]([Link]({ extended: true }));
[Link](cors());

[Link]("/", (req, res) => {


[Link]({})
.then((todoList) => [Link](200).json(todoList))
.catch((e) => [Link](500).json(e));

Docker 21
});

[Link]("/todo", (req, res) => {


const todo = new TodoModel({
...[Link],
created_at: new Date(),
});

todo
.save()
.then((savedTodo) => [Link](200).json(savedTodo))
.catch((e) => [Link](400).json(e));
});

[Link](PORT, async () => {


[Link](`Sunucu çalışıyor... ${PORT} | MongoDB'ye bağlanıl
await [Link]("mongodb://mongo-alias:27017/todos");
[Link]("MongoDB'ye bağlantı başarılı!");
});

Önce mongodb container ‘ımı ayağa kaldırıyorum. Mongo imajını Docker Hub ‘dan
ediniyorum. Loglara ihtiyacım olmadığı için detech mode ‘da çalıştırıyorum.

docker run --name mongo-server -p 27017:27017 -d mongo

Ardından projemin içerisindeki Dockerfile dosyamdan bir imaj üretiyorum. Bunun


için terminalden projemin dizine girmem gerekiyor.

docker build -t node-server .

Nodejs imajım node-server adında hazır ama container ‘ı çalıştırmadan önce diğer
container olan mongo-server ile iletişim kurabilmesi için --link ile bir alias
belirtmem gerekiyor.

Docker 22
📌 Önemli : Birden fazla container arası iletişim sağlamak için, iletişime
geçecek container ‘ı çalıştırırken link belirmem gerekiyor. --link için ;
ilk değer iletişime geçeceğim container adı
ikinci değer ise bu container ‘ı içeride hangi isimde kullanacağım.

[Link] dosyamda mongo-alias ismi ile bağlanacağımı belirttim bu nedenle nodejs


container ‘ımı çalıştırırken --link ile mongo-alias adını vermem gerekiyor.

// [Link] kullandığım isim :


await [Link]("mongodb://mongo-alias:27017/todos");

// mongo-server adındaki container 'ı içeride mongo-alias ismind


docker run --link mongo-server:mongo-alias -p 3000:3000 node-ser

💡 İmaj oluştururken -t ile isimlendiririz, container oluştururken --name ile


isimlendiririz.

CMD override
Örneğin Dockerfile dosyanızda CMD [”sleep”,”3”] şeklinde ibare mevcut. Buda
ubuntu ‘yu 3 saniye uyutuyor. eğer komut satırında container ‘ı ayağa kaldırırken
container adından sonra bir komut belirtirsen docker bunu Dockerfile ‘ında CMD
olsa bile ezip, CMD yerine kullanacaktır.

docker run ubuntu-server sleep 1

// Dockerfile dosyasındaki CMD [”sleep”,”3”] komutunu ezerek sle

ENTRYPOINT
Docker imajının veya konteynerinin çalıştırıldığında varsayılan olarak başlatacağı
ana işlemi belirlemek için kullanılır.

Docker 23
CMD komutu bir executable yani çalıştırılabilir bir metot ve ikinci parametre olarak
isteğe bağlı bir arguman (girdi) alır. Örneğin

CMD ["node","[Link]"]

ENTRYPOINT ise executable yani çalıştırılabilir bir metotun ne olacağını


belirtmemizi sağlar. CMD ‘den önce kullanılmalıdır. Artık ben CMD ‘ye belirteceğim
her şey ENTRYPOINT ‘e bir arguman olarak iletilecek.

// ENTRYPOINT olmadan
CMD ["node","[Link]"]

// ENTRYPOINT ile
ENTRYPOINT ["node"]
CMD ["[Link]"]
// node [Link] çalışır

// Farklı bir örnek


ENTRYPOINT ["sleep"]
CMD ["5"]
// sleep 5 çalışır.

CMD Override konusunda belirttiğimiz terminal satırında executable metodunu


belirtirken eğer Dockerfile dosyamda bir ENTRYPOINT belirtmiş isem artık sadece
argumanı yazmam yeterlidir.

// Dockerfile
FROM ubuntu
ENTRYPOINT ["sleep"]
CMD ["5"]

// terminal
docker build -t ubuntu-test . // imajı önce build ediyorum

// build edilen imajımı çalıştırdığımda ENTRYPOINT belirttiğim i


// 10 değerini göndermem yeterli. Dockerfile içinde CMD varsa ov

Docker 24
// sleep 10 çalışacak, eğer 10 değerini göndermez isem CMD 'deki
docker run ubuntu-test 10

💡 Eğer Dockerfile ‘ımda CMD tanımlı değilse ve container ‘ı ayağa


kaldırırken bir ETRYPOINT için bir arguman belirtmedi isem
{executable_değeri} : missing operand şeklinde bir hata alırım.

Python app

// [Link]
from flask import Flask
server = Flask(__name__)

@[Link]("/")
def hello():
return "Hello World!"

if __name__ == "__main__":
[Link](host='[Link]')

[Link] , python için bağımlılıkları temsil eder. Rastgele bir isim ve


uzantıda olabilir ama yaygın olan [Link] ‘dir.

// [Link]
Flask
Jinja2==3.0.3

//Dockerfile
FROM python:3.8-slim

// server adından bir klasör oluşturup içerisine giriyorum. Bura


WORKDIR /server

Docker 25
// localimdeki [Link] dosyamı WORKDIR ile belirttiğim
// içerisine kopyalıyorum
COPY [Link] .

// pip ile bağımlılıklarımı indiriyorum


RUN pip install -r [Link]

// üstteki komuttan sonra src klasörüme oluşan kaynak dosyalarım


COPY src/ .

// python ile ana dosyamı çalıştırıyorum.


CMD [ "python","./[Link]" ]

// docker imajımı oluşturuyorum


docker build -t python-app .
// container 'ımı çalıştırıyorum
docker run -p 3000:5000 python-app

[Link]

Docker Compose
Docker tarafından sunulan ve çoklu container uygulamalarını tanımlamak,
çalıştırmak ve yönetmek için kullanılan bir araçtır. Uygulamanızın servislerini (web
sunucusu, veritabanı, önbellek vb.) bir YAML dosyasında tanımlayabilir ve bu
servisleri tek bir komutla oluşturabilir ve çalıştırabilirsiniz.
Docker Compose ile, bir komutla tüm uygulamanızı başlatabilir, durdurabilir,
yeniden başlatabilir veya güncelleyebilirsiniz.

Docker Compose - [Link]


Docker Compose'un yönetimini sağlamak için kullanılan bir YAML formatındaki
dosyadır. Docker compose kullamak için YAML dosyasını oluşturmak gerekir.
Girinti ve çıkıntıları dikkate alır.

Docker 26
// [Link]
{key}: {value}

// eğer bir işlemin alt işlemleri varsa alt satırda bir tab bıra
services:
web:
image: node:14-alpine
command: npm start

Docker Compose - version


version anahtarı, Docker Compose dosyasının hangi Docker Compose formatının
kullanıldığını belirtir. Docker Compose formatı, zamanla güncellenmiş ve
değişiklikler geçirmiştir. Her Docker Compose dosyası bir version ile başlamalıdır
ve bu, kullanılan Docker Compose sürümünü belirtir.

Örneğin, version: '3.8' ifadesi, Docker Compose dosyasının Docker Compose


Specification Version 3.8'e uygun olduğunu belirtir. Bu sürüm numarası, Docker
Compose'un hangi özellikleri desteklediğini ve nasıl yorumlanması gerektiğini
tanımlar. Resmi siteden versiyonlara bakabilirsin.

# [Link]
version: "3.8"
...

Servisler (services): Uygulamanızın farklı parçalarını temsil eden Docker


container'ları. Web servisi denebilir.

# [Link]
version: "3.8"
servicess:
service-test-1:
service-test-2:
...

[Link] dosyası örneği :

Docker 27
version: '3.8'

services:
web:
image: node:14-alpine
command: npm start
ports:
- "3000:3000"
volumes:
- ./app:/app
environment:
MONGO_URL: mongodb://db:27017/mydatabase
depends_on:
- db

db:
image: mongo:latest
ports:
- "27017:27017"
volumes:
- mongodb_data:/data/db

volumes:
mongodb_data:

// depends_on ile bağlı olduğu diğer servisin adını belirtiyorum


// web adındaki servis db adındaki servise bağlı.

Aşağıdaki metotlar yukarıdaki servislerin altında kullanılır.

image: Docker container'ı için kullanılacak olan Docker imajını belirtir. Örneğin,
image: node:14-alpine [Link]'in 14-alpine sürümünü kullanır.

build: Dockerfile'dan imaj oluşturmak için kullanılır. Örneğin, build:


./path/to/Dockerfile Dockerfile'ın bulunduğu dizinden imaj oluşturur.

Docker 28
command: Docker container başlatıldığında çalıştırılacak komutu belirtir.
Örneğin, command: npm start bir [Link] uygulamasını başlatmak için kullanılır.

ports: Host makinedeki bir portu Docker container içindeki bir porta bağlar.
Örneğin, ports: - "3000:3000" host 3000 portunu Docker container 3000 porta
yönlendirir.

volumes: Host makinesindeki bir dizini Docker container içindeki bir dizine
bağlar. Örneğin, volumes: - ./app:/app hosttaki "./app" dizini Docker
containerdaki "/app" dizinine bağlar.

environment: Docker container başlatılırken ayarlanacak çevre değişkenlerini


belirtir. Örneğin, environment: NODE_ENV: production NODE_ENV değişkeni
production değeri ile ayarlanır.

depends_on: Servisin başlatılabilmesi için bağımlı olduğu diğer servislerin


listesini belirtir. Örneğin, depends_on: - db web servisi db servisine bağımlıdır.

restart: Docker container'ın yeniden başlatılma davranışını belirtir. Örneğin,


restart: always container sürekli yeniden başlatılır.

Basit bir nodejs örneği - (Dockerfile ‘dan yalm ‘a çekme)

// [Link]
const express = require("express");
const app = express();
const PORT = [Link] || 3000;

[Link]("/", (req, res) => {


[Link]("Hello World!");
});

[Link](PORT, () => {
[Link](`Example app listening at [Link]
});

// Dockerfile
FROM node:14-slim

Docker 29
WORKDIR /opt/node-server
COPY . .
RUN npm install
CMD ["node", "[Link]"]

# [Link]
version: "3.8"
services:
node-app:
# Container isimlendirmek isteğe bağlıdır, isim vermez i
# ismi ile kendi otomatik bir isim oluşturur.
container_name: node-app-container
# uygulamamda Dockerfile dosyam olduğu için custom bir i
# build . ile mevcut uygulamamdaki Dockerfile dosyası il
# bu sayade mevcut Dockerfile dosyamı kullanmış oluyorum
build: .
# birden fazla port tanımı yapabiliriz.
ports:
- 3000:3000

Docker Compose - Çalıştırmak, Build almak

// terminalden proje dizinene geçiyorum

// docker-compose-yml dosyasını okur, önce build alır ve sorna ç


docker-compose up

// detach mode 'da çalıştırmak


docker-compose up -d

// sadece build alır bırakır, çalıştırmaz


docker-compose build

Docker Compose - Kapatmak

Docker 30
// terminalden proje dizinene geçiyorum
docker-compose down

Docker Compose - Volume Mapping


Eğer database gibi hafızada kalıcı dosyaların tutulması gerekiyorsa, ilgili container
‘a volume mapping uygulanır. Çünkü container her kapatıldığında yapılan işlemler
ve veriler silinmesin.

# [Link]

version: "3.4"
services:
mongodb:
image: mongo
ports:
- 27017:27017
# mongodb servisimle aynı hizada volume tanımlıyorum. ilk de
# ikinci değer barındıracağım yer. (mongodb default olarak /
volumes:
- todo-app-data:/data/db
# yukarıda tanımladığım volumelerin isimlerini en dış scope 'da
volumes:
todo-app-data:

Build sıralaması, depends_on


docker-compose-yml ‘da depends_on, ilgili container ‘ın bağımlı olduğu diğer
container ‘ları belirtir. İlgili container çalıştırılmadan önce bağımlı olduğu container
‘lar çalıştırılır.

# [Link]

version: '3.8'

Docker 31
services:
node-app:
image: node:14-alpine
command: npm start
ports:
- "3000:3000"
volumes:
- ./app:/app
environment:
MONGO_URL: mongodb://db:27017/mydatabase
depends_on:
- mongodb # node-app çalıştırılmadan önce mongodb adlı con

mongodb:
image: mongo:latest
ports:
- "27017:27017"
volumes:
- mongodb_data:/data/db

volumes:

Uzak Sunucu İşlemleri (Linux, Ubuntu)

📌 Bu işlemleri buradaki videoyu izleyerek çok daha anlaşılır bir şekilde


gerçekleştirebilirsin. Aşağıdaki adımlar sadece not amaçlı oluşturulduğu
için anlamsız gelebilir.

Uzak sunucuya bağlanma (ssh bağlantısı)

// Mevcut bilgisayarınızın terminalinde

// IPv4 adresimi girererek uzak sunucuma bağlanmaya başlıyorum.


ssh root@[Link]

Docker 32
// yes diyerek adımları onaylıyorum ve parolamı giriyorum.
// artık uzak sunucumun terminaline bağlandım.

// uzak sunucumu güncelliyorum.


sudo apt-get update

Uzak sunucuya Docker , Docker Compose kurulumu

📌 Önemli Not: Eğer uygulamanızı docker-compose ile ayağa kaldırmak


isterseniz, windows işletim sisteminde docker-compose up demeniz
yeterli fakat linux vb. tabanlı sistemlerde özel izin gerektirir. Bu nedenle
sudo docker-compose up yazarak izin vermeniz gerekmektedir.

// dokcer 'ı ubuntuya yüklüyorum


sudo apt install [Link]

// docker-compose 'u da yüklüyorum


sudo apt install docker-compose

// docker versiyonunu kontrol edebilirim


docker -v

Docker ubuntu status check (systemctl)

// eğer docker status görünme kapalı ise aktif edebilirsin. defa


sudo systemctl enable docker

// docker 'ın çalıştığını kontrol ediyorum (runnin yazar)


sudo systemctl status docker

Ubuntu server istatistik (cpu,ram … kullanımı, top, htop)

Docker 33
// htop indiriyoruz. daha okunaklı verileri listeler.
sudo apt install htop

// terminale yazıyoruz
htop

ubuntu dosya aktarımı (scp ile dosya gönderimi)

// local terminalden (dosya masaüstünde ise Desktop klasörüne gi


// gönderilecek dosya adı belirtip uzak sunucudaki konumunu beli

scp [Link] ssh root@[Link]:/tmp/uygulamalarım/

// uzak sunucu parolasını girip onaylıyoruz.

Linux zip dosyası dışarı çıkarma (unzip)

📌 ls komutu ile bakıldığında dosya kırmızı isimde gözüküyor ise erişim


vermemiz gerekebilir. chmod 755 {dosya_adı} ile erişim verdikten sonra
dosyayı çıkartabilirsin.

// zip açıcı kuruyoruz


sudo apt-get install unzip

unzip {açılacak_dosya.zip} -d {çıkarılacak_klasör_adı}

ngnix domain yönlendirme (reverse proxy)


Eğer daha önce nginx yoksa, ilk kez kullanıyorsan :

// uzak sunucu terminalinden

Docker 34
// ngnix yoksa yükleyin
apt install nginx

unlink /etc/nginx/sites-enabled/default

💡 Eğer zaten daha önce [Link] dosyasını oluşturduysan


sadece cd /etc/nginx/sites-available ile dizine ulaş ve vi reverse-
[Link] ile içeriğini düzenle.

[Link] dosyası düzenleme


cd /etc/nginx/sites-available dizine gir.

vi [Link] ile dosya yazma işlemini başlat

Ardından gerekli düzenlemeleri yaptıktan sonra Ctrt + C ile instert modu kapat.

:wq yazarak çıkış yap

server_name alanına domain adresinin ismini gir ve ardından [Link] ‘den sonra
uygulamanı çalıştırdığın portu belirt.

server {
listen 80;
listen [::]:80;
server_name [Link]; // domain ismi
server_name_in_redirect off;

access_log /var/log/nginx/[Link];
error_log /var/log/nginx/[Link];

location / {
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwar
proxy_set_header Host $host;
proxy_pass [Link] // dışarıya aktar

Docker 35
}
}

config dosyasını kopyalıyoruz.

ln -s /etc/nginx/sites-available/[Link] /etc/nginx/s

Ardından ngnix değişiklikleri kaydettiğinden emin olmak için tekrar başlatıyoruz.

nginx -t
systemctl restart nginx
systemctl status nginx

Docker 36

You might also like