Mustafa Akın
• 2014’tenberi Docker kullanıcısı, Docker üzerine
sistemler
• Container Scheduling üzerine Bilkent CS Master
& PhD devam
• 2 yıldır Havelsan’da Bulut Bilişim üzerinde
çalışma ve proje
• Mayıs itibariyle OpsGenie DevOps
• Linux & Golang
Docker Nedir?
• Açıkbir platform
• Taşınabilir, hafif çalıştırma ve paketleme aracı
• Uygulamaların otomatik containerlar içinde
otomatik deploy edilmesi
• İşletim sistemi seviyesi sanallaştırma
• İzole containerlar
6.
Sanallaştırma
• 4 core,2 diskli 100 tane sunucu vs 24 core, 36
disk 10 sunucu
• Donanımı büyük ölçeklerde almak bir noktaya
kadar daha uygun ve mantıklı
• Ama büyük bir donanımı da tamamen bir
kullanıcıya ayırmak mantıklı değil
7.
Sanallaştırma
• KVM: Kernelbased Virtual Machine
• Sanal CPU
• Sanal RAM
• QEMU: Quick EMUlator
• Sanal Disk
• Sanal CD Sürücü
• Sanal Ekran Kartı
Container
• Container’lar aynıLinux kernelini paylaşır
• İzolasyon namespace ve cgroups ile sağlanır
• Microsoft da kendi container teknolojisini
geliştirdi, Windows Server 2016
Docker nasıl çalışıyor?
•İşletim sistemi size system call mimarisi sunar
• Siz gerçekten dosyayı/ağı kullanamazsınız,
işletim sisteminden rica edersiniz
• Docker namespace kullanarak system call ların
izole olmasını sağlar
• Cgroups ile de kaynak ayrımı ve takibi
yapılmasını sağlar
13.
Namespace
• Mount: Dosyasistemi bağlantı noktası izolasyonu
• UTS: Domain ve bilgisayar adı izolasyonu
• IPC: Interprocess communication izolasyonu
• PID: Process küme izolasyonu
• Network: Farklı ağ cihazları ve yönlendirme tablosu
• User: Container içinde farklı user id’ye sahip
olunması
14.
Cgroups
• blkio: Blokcihazları, disk
• cpu: CPU scheduling, görev ağırlıkları
• cpuacct: CPU kullanım raporları
• cpuset: İzin verilen CPU’lar
• devices: Fiziksel ve sanal cihazlar, webcam, GPU
• memory: RAM Limitleri ve kullanım raporları
• net_prio: Network paket önceliği
Docker Run Yapısı
•docker run -ti ubuntu:14.04 bash myscript.sh
• -ti - Flag, örnek t=terminal ve i=input aç
• ubuntu:14.04 - imaj adı
• bash - process adı
• myscript.sh - parametre(ler)
22.
Docker İmajları
• Herdocker run komutu ile yeni bir container açılır
• Docker container açmak için bir imaj adına ihtiyaç
duyar, açılan container bu imajı temel alır
• Yapılan değişiklikler o container’da kalır, orjinal
imaj bozulmaz
• Bunu hızlandırmak için COW (copy-on-write)
dosya sistemleri kullanılmaktadır (AUFS, BTRFS,
Overlay)
Docker’da Kalıcı Veri
•<Docker containerları kalıcı verilerin tutulması
için uygun değildir, bu yüzden veritabanları için
kullanılamaz> — YANLIŞ
• Kalıcı veriler container içinde tutulabildiği gibi
container dışında da volume sağlanarak
tutulabilmektedir.
35.
Docker’da Kalıcı Veri
•Container içinde:
• docker run -d mysql —name db
• docker kill db
• docker start db
36.
Docker’da Kalıcı Veri
•Container dışında:
• docker run -v /mydata:/var/lib/mysql mysql —
name db
• docker rm -f db
• docker run -v /mydata:/var/lib/mysql mysql —
name db
37.
Docker’da Kalıcı Veri
•Container dışında:
• docker volume create —name mysql-dataset1
• docker run -v mysql-dataset1:/var/lib/mysql
mysql —name db
Gerçekçi Docker Kullanım
Örnekleri
•İzole veri tabanları oluşturup ve kullanıp atmak
(MySQL, Oracle, MSSQL Linux)
• Uygulama sunucuları çalıştırma (Tomcat,
Glassfish)
• Tekrarlanabilir ortamlarda Unit Testler çalıştırma
• Entegrasyon testleri çalıştırma
• Continous Integration ortamı oluşturma
42.
Gerçekçi Docker Kullanım
Örnekleri
•Onlarca micro-servisi deploy etmek
• Deployment versiyonlamayı sağlayıp, kolaylıkla
versiyonlar arası geçiş yapabilmek
• Aynı uygulamanın birden fazla versiyonunu aynı anda
çalıştırabilmek
• Binlerce container açıyıp sistemde etki yaratmadan
kaldırabilmek
• Host’lardan bağımsız ortamlar oluşturup
tekrarlanabilirliği sağlamak
43.
İleri Docker Kullanım
Teknikleri
•Compose: Birden fazla container’dan oluşan
uygulamaların ayağa kaldırılması ve yönetimi
• Swarm: Birden fazla sunucuda bulunan Docker
kurulumlarının yönetimi ve izlenmesi
• Multi-Host Networking: Ayrı sunucularda bulunan
containerlar arasında Software Defined Networking ile
izole ağ kurulumu
• Plugins: Docker’da bulunan network, volume, IP
yönetimi, erişim hakkı yönetmi için eklentiler
Mikro servisler
• Farklıbir uygulama yazılım şekli denilebilir, klasik yöntemlerden
farklı düşünmek gerekir. Monolitik uygulamalardan vazgeçilmelidir
• Fakat, sadece havalı bir adı var diye Mikroservisler kullanılmamalı,
her uygulamaya uygun olmadığı gibi, yapılması da normalinden
fazla efor gerektirebilir.
• Uygulanabildiği alanlarda mikroservisler küçük parçaların kolay
yönetimi, ölçeklenebilmesi ve hata anında sadece ilgili servisin
değiştirilebilmesini sağlayarak hızlı geliştirme ve uygulama olanağı
sağlar.
• Kısaca, İşlevsellikler bazında uygulama küçük (mikro) servislere
ayrılmalı, mikro servisler kalıcı bigileri kendinde tutmamalı,
gerektiğinde sayıları dinamik olarak arttırılıp azaltılabilmeli
46.
Heroku ve 12Factor App
• I. Kod: Kodlar versiyon kontrolünde tutulmalı,
versiyonlardan deploy edilmeli.
• II. Bağımlılık: Kütüphaneler ve kullanılan diğer
bileşenler açıkça belirtilmeli
• III. Konfigürasyon: Konfigürasyon dışarıdan
parametre olarak alınmalı
• IV. Destekleyici servisler: Veri tabanı gibi uygulama
ile doğrudan alakası bulunmayan servisler takıp
çıkarılabilir görülmeli
47.
Heroku ve 12Factor App
• V. Build, release, run: Build alma işlemi ve çalıştırma
işlemi birbirinden açıkça ayrılmalı
• VI. Prosesler: Uygulama bir ya da birden fazla durum
barındırmayacak şekilde processler olarak çalıştırmalı
• VII. Port ilişkiledirme: Servisler portlar aracılığı ile
dünyaya sağlanmalı
• VIII. Paralel Çalıştırma: Process ler arttırılarak
kolaylıkla paralel çalıştırılabilmeli
48.
Heroku ve 12Factor App
• IX. Gözden çıkarılabilirlik: Uygulama kolayca
başlatılıp sorun olmadan kapatılabilmeli
• X. Ortam Eşliği: Uygulama geliştirme, test ve kullanım
ortamları olabildiğince benzer olmalı
• XI. Logs: Loglar uygulamalardan olay akışı şeklinde
toplanmalı
• XII. Yönetim prosessleri: Yönetim ve ayarlama için
gereken processler bir kez çalışacak şekilde
ayarlanmalı
49.
Docker ve Mikroservisler
•Aşağıdaki bileşenlerden oluşan bir web
uygulaması yazdığınızı düşünün:
• Business Logic API
• Veritabanı
• Resim İşleme Servisi
• Web Sunucu
Klasik Servis Ölçeklendirmesi
Oluşturuanmega servis için yine bir mega kaynak ayrılması gerekmektedir, fakat
sadece işlemci gücünün artması gerekse bile servisin bir kopyasının daha
düzgünce çalışabilmesi için diğer kaynakların da gereksiz yere ayrılması ile
kaynak israfı oluşur
MEGA SPRING SERVICE MEGA SPRING SERVICE
Veritabanı
Web Sunucu
Resim İşleme
Servisi
API
Veritabanı
MikroServis Ölçeklendirmesi
Her servis ihtiyaca göre ayrı sunucuya konulabilir
Resim işleme servisi sadece CPU ya daha çok bağlı iken API servisi herhangi
bir sunucuya konulabilir
Resim İşleme
Servisi
Resim İşleme
Servisi
Resim İşleme
Servisi
API
54.
Statik Dosya Sunucusu
Dockerfile
FROMnginx:latest
ADD nginx.conf /etc/nginx/config
nginx.conf
upstream api {
server api_service_1:8000;
server api_service_2:8000;
}
upstream img {
server img_service1:4000;
server img_service2:4000;
server img_service3:4000;
server img_service4:4000;
}
server {
listen 80;
location /api {
proxy_pass http://api;
}
location /img {
proxy_pass http://img;
}
}
docker build -t web .
55.
API
Dockerfile
FROM node:6
RUN mkdir-p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install
COPY . /usr/src/app
EXPOSE 8000
CMD [ "npm", "start" ]
docker build -t api .
56.
Resim işleme
Dockerfile
FROM java:8
RUNapt-get update
RUN apt-get install -y maven
WORKDIR /code
ADD pom.xml /code/pom.xml
RUN ["mvn", "dependency:resolve"]
RUN ["mvn", "verify"]
ADD src /code/src
RUN ["mvn", "package"]
EXPOSE 4000
CMD ["java", "-jar", "target/myapp.jar"]
docker build -t imgproc .
57.
Container’ların Çalıştırılması
• dockerrun -d web
• docker run -d —name=api1
-e MYSQL=mysqlhost:3306 api
• docker run -d —name=imgproc1 imgproc
* Kaynak ihtiyaçlarına göre birden fazla
sunucuda istenilen servisler başlatılabilir
58.
Docker Üzerine Gelişmiş
Sistemler
•Docker Swarm
• Kubernetes
• Mesosphere
• IBM Bluemix
• Amazon Container Service
• Google Container Engine (GKE)
59.
Docker yükleme
• Linux:curl -SsL get.docker.com | sh
• Mac: Docker for Mac
• Windows: Docker for Windows