Docker
Ankara Cloud Meetup
11 Mayıs 2017
Mustafa Akın
Mustafa Akın
• 2014’ten beri 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
Container
Docker Nedir?
• Açık bir 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
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
Sanallaştırma
• KVM: Kernel based Virtual Machine
• Sanal CPU
• Sanal RAM
• QEMU: Quick EMUlator
• Sanal Disk
• Sanal CD Sürücü
• Sanal Ekran Kartı
Sanallaştırma
Sanallaştırma
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
Container Performansı
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
Namespace
• Mount: Dosya sistemi 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ı
Cgroups
• blkio: Blok cihazları, 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
İşletim sisteminde htop
Container içinde htop
Docker Demo
Docker Demo
Docker Demo
Docker Demo
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)
Docker İmajları
• Her docker 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 İmajları
Java
Ubuntu
Tomcat
Go Python
Alpine Linux
Yeni Container
Yeni Container Yeni Container Yeni Container
Docker Hub
Docker Store
docker pull
docker pull
Manuel olarak Docker imajı
oluşturmak
docker images
Dockerfile
docker build
docker build
Kaynak Limitleme
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.
Docker’da Kalıcı Veri
• Container içinde:
• docker run -d mysql —name db
• docker kill db
• docker start db
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
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
Docker Yükleme
Docker Kullanım Örnekleri
Docker Kullanım Örnekleri
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
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
İ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
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
Heroku ve 12 Factor 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
Heroku ve 12 Factor 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
Heroku ve 12 Factor 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ı
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 Yaklaşım
MEGA SPRING SERVICE
Veritabanı
Klasik Servis Ölçeklendirmesi
Oluşturuan mega 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ı
Mikro Servis Yaklaşımı
Web Sunucu
Resim İşleme
Servisi
API
Veritabanı
Mikro Servis Ö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
Statik Dosya Sunucusu
Dockerfile
FROM nginx: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 .
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 .
Resim işleme
Dockerfile
FROM java:8
RUN apt-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 .
Container’ların Çalıştırılması
• docker run -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
Docker Üzerine Gelişmiş
Sistemler
• Docker Swarm
• Kubernetes
• Mesosphere
• IBM Bluemix
• Amazon Container Service
• Google Container Engine (GKE)
Docker yükleme
• Linux: curl -SsL get.docker.com | sh
• Mac: Docker for Mac
• Windows: Docker for Windows
Mustafa Akın
@mustafaakin
mustafa91@gmail com
Teşekkürler!
Sorularınız?

Docker - Ankara Cloud Meetup

  • 1.
    Docker Ankara Cloud Meetup 11Mayıs 2017 Mustafa Akın
  • 2.
    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
  • 3.
  • 4.
    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ı
  • 8.
  • 9.
  • 10.
    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
  • 11.
  • 12.
    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
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
    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)
  • 23.
    Docker İmajları Java Ubuntu Tomcat Go Python AlpineLinux Yeni Container Yeni Container Yeni Container Yeni Container
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
    Manuel olarak Dockerimajı oluşturmak
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
    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
  • 38.
  • 39.
  • 40.
  • 41.
    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
  • 44.
  • 45.
    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
  • 50.
    Klasik Yaklaşım MEGA SPRINGSERVICE Veritabanı
  • 51.
    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ı
  • 52.
  • 53.
    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
  • 60.