Bu yazımda sizlere nasıl docker kullanılır, nedir, nasıl çalışır bunu anlatacak ve ardından docker kullanarak Go ve Node JS projesini dockerize edeceğiz.
Docker Nedir
Docker, Linux container teknolojisini kullanarak kendini küçük yönetilebilir şekilde ayarlayan containerleri yönetmeyi amaçlayan araçtır. Go dili ile yazılmıştır. Nasıl çalıştığının detayına buradaki yazımdan ulaşabilirsiniz.
Docker Hub
Docker Hub, Docker’in varsayılan image indirme sistemidir. Bu sistem üzerinden hazır image indirebilir ve üzerinde docker komutlarımızı yazabiliriz. Genelde imagelerde Alphine OS kullanılır. Sebebi ise çok hafif ve güvenilir olması.
Neden Docker Kullanmalıyım
Docker kullanmanız için birçok sebep var, bunların en temeli container yapısı olması. Container yapısı başlı başına bir kullanım sebebi olmaktadır. Sebepleri sayacak olursak.
- Container avantajı: Bilgisayarınızda Java 17 yüklü olduğunu varsayalım. Java 11 de çalışan projeyi nasıl çalıştırırdınız? JDK yüklemek? birsürü çözüm aramak? bunun yerine dockerize edilmiş bir java programını direkt docker kullanarak çalıştırabilir, JDK veya java uyumluluğunu kontrol etmenize böylece gerek kalmaz.
- Geliştirme için: Yazılımcı bilgisayarı genelde her şeyin yüklü olduğu cihazlardır. Sizde çalışan şey başkasına atıldığında yüksek oranda çalışmayabilir çünkü onda yüklü olan şey sizde yüklü olmaz. Bunun en iyi yolu docker kullanmaktır, bu sayede dockerize edilmiş proje doğrudan docker yüklü her bilgisayarda çalışır.
- Eskiye uyumluluk: Yazılımcı bilgisayarının çok fazla kafa karıştırıcı özelliklere sahip olduğunu söylemiştik. Dolayısıyla birden fazla projeye aynı anda yönetim sağlamanın en kolay yolu docker kullanmaktır. Farklı php sürümü olsun hiç fark etmez docker içerisine alınan proje her zaman harika çalışacaktır. (IDEler üzerinde docker üzerinden proje çalıştırabilirsiniz. Kullandığınız IDEnin dökümanını okuyarak bunu nasıl yapacağınızı öğrenebilirsiniz.)
Docker Nasıl Çalışır
Docker, Linux container mantığını kullanarak image oluşturur ve imageyi en sonunda kendi kullanacağımız bir sanal işletim sistemine çevirir. Bunun için docker daemon adı verilen arkaplan servisini kullanır. Dockerfile içerisine bütün projenin ihtiyaçları yazdırılır ve daha sonrasında ise proje docker hub veya kendi belirlediğiniz bir image havuzundan indirilen imageler ile çalıştırılır. En sonunda ise size verilen imageleri kullanarak container çalıştırabilmenize olanak sağlar. Linux container sistemi olmadan önce sistemler sanal işletim sistemleri ile kontrol ediliyordu ancak bu maliyetli ve yönetimi zordu. Şimdi ise kolayca docker imageleri yönetilebiliyor.
Image
Image, Docker üzerinde kullanılan temel öğelerden birisidir. Image, çalışan bir işletim sisteminin kopyasıdır. Bu sayede çalışan işletim sistemi kopyalanabilir ve paylaşılabilir.
docker build .
Container
Container, kopyalanmış image dosyasını çalışan işletim sistemine dönüştürür ve kullanmanızı sağlar. Bu sayede image ve istediğimiz komut çalışmış olur.
docker run IMAGE
Docker üzerinde genelde detach (-d) işareti kullanarak işlemler yaparız. Çünkü arkaplanda container ayağa kalkar bu sayede CMD işlemi (sonrasında bahsedeceğim) çalıştığında arkaplanda çalışmış oluyor.
Volume
Volume, gerçek cihazınız ile container içerisindeki dosyalar ile etkileşime geçmeyi sağlar. Container silinse bile dosyalarınız kalmaya devam eder. Container üzerine eklenen opsiyonel ancak oldukça gerekli bir yapı çünkü verilerin olası kapanma durumunda saklanmasını sağlar.
Network
Network, container arasında iletişim kurmayı sağlar. Normal şartlarda docker B Kategoriye sahip IP adreslerini kullanır ve diğer containerler diğer containerler ile iletişime geçerler. Detaylı şekilde burada anlatmıştım, dolayısıyla burada çok değinmeyeceğim ancak her bir container kendine has ip ye sahip ve o ip ler arasında containerler etkileşime giriyorlar.
Temel Docker Komutları
Docker kullanmak için temel olan 6 komut vardır, bunlar;
- build: Image oluşturmaya yarar.
- run: Seçilen imageyi containere çevirir.
- ps: Çalışan containerleri listeler, -a kullanımında bütün containerleri listeler
- image ls: Oluşturulan imageleri listeler.
- exec: Oluşturulan containere komut yazılmasını sağlar.
- inspect: docker containeri hakkında bilgi almanızı sağlar.
Elbette daha fazla komut var ancak genelde bu iki komutu kullanacağız. Oluştur, çalıştır ve listele. Docker kullanırken aklımızda olması gereken en önemli mesele “-d” seçeneğidir. Image oluştururken veya container çalıştırırken -d koymanız durumunda docker her şeyi arkaplanda yapar bu sayede yönetimi kolay olmakla birlikte terminal kapandığında docker çalışmaya devam eder.
Dockerfile
Dockerfile, docker build komutunun algıladığı dosyadır. İçeirsine image oluşturulurken gireceğimiz komutları yazarız ve build çalıştırıldığında bunları başlatır. Dockerfile üzerinden yazılan kod otomatik olarak build olur. Dockerler arasında gezinmek için “-f” kullanabiliriz.
Fotoğraftaki gibi Dockerfile eklediğimizi düşünürsek
docker build -f prod .
Komutunu kullanarak çalıştırabiliriz. Yazının devamında Dockerfile üzerinden ilerleyeceğiz.
Dockerfile Komutları
Dockerfile üzerinde yazabileceğiniz 5 adet temel komut vardır. RUN, CMD, FROM, WORKFILE ve ENTRYPOINT dir.
FROM
FROM, İşletim sistemini yüklemeye yarar. İlk yazılan komut budur ve Dockerfile üzerinde birden fazla FROM çağırabiliriz. Ancak her zaman en sondaki çalışacaktır. Genelde daha az yer kaplamak için kullanırız.
FROM alphine
Scratch
Scratch, boş ve içinde herhangi bir linux dağıtımının olmadığı işletim sistemidir. Docker üzerinde bunu Go tarzında statik ve hafif kendi içinde çalışabilen ve bağımlılıkları yanında götüren yazılımlar üzerinde kullanırız çünkü normal bir işletim sistemi 50 mb ise scratch sayesinde 1 mb gibi rakamlara indirebiliriz. Tek başına kullanılmaz. İlk başta build alınır ve build sonucunda ortaya çıkan dosyalar scratch ile taşınır. Eğer ls, cd gibi komutlara ihtiyacınız varsa “busybox” kullanabilirsiniz. (ya da volume)
Alphine, Mysql ve diğerleri
Alphine, docker imageleri arasında en çok kullanılanıdır. Çünkü çok hafiftir. Kendisi içerisinde herhangi bir bağımlılık taşımadığından ve yanında herhangi bir kişisel program indirmediğinden kolayca kullanılabilir. Mysql gibi imageler aslında bu tarz işletim sistemleri içerisinde yazılan dockerfilelerin birleştirilerek push yapıldığı durumlarda olmakta. Bunlardan ileride bahsedeceğiz.
RUN
RUN, dockerfile içinde yazılan ve docker içinde çalıştırılan komuttur. İstediğiniz komutu çalıştırmaya yarar.
RUN apt install curl
CMD, ENTRYPOINT
CMD, Command kelimesinin kısaltımıdır. Docker imagesine her şeyi yükledikten sonra container çalıştırma esnasında herhangi bir parametre verilmezse CMD komutu çalışır. Eğer bir parametre verilirse ENTRYPOINT komutu çalıştırılır.
WORKDIR
CMD komutu çalışırken çalışacak dizini ayarlamanızı sağlar.
COPY
Seçili klasördeki dosyaları kopyalar
Dockerfile Cache
Docker, her Dockerfile komutunu yazdığınızda satırlara bakar ve aynı olan satırları önbellekten yükler. Daha önce bunu nasıl yaptığını anlattığımdan detayına değinmeyeceğim fakat burada şunu bilmeliyiz ki ard arda tekrarlı koddan kaçınmalıyız. Örneğin
RUN apt install -y curl
RUN apt install -y lsof
Yerine,
RUN apt install -y curl lsof
Yazmalıyız. Eğer böyle yazarsak komut sadece bir kere önbelleğe alınır bu sayede hem image önbellek alımında yer kazanmış hemde docker build yazdığımızda daha hızlı çalışmasını sağlamış oluruz.
Canlı Örnekler
Bu kısımda sizlere GO (statik) ve Node JS (dinamik) kullanarak iki örnek gösterecek ve bu iki örnek içindeki farklara göre bilgilerimizi detaylandırmış olacağız. Neden iki farklı kodlama dilini seçtiğimi anlatmakta fayda var, docker boyutu ne kadar düşük olursa o kadar yönetilmesi kolay olur. Çünkü sunucuya gönderirken, test ederken her anlamda boyut küçük olursa aktarım indirme de hızlı olacaktır.
GO İle Kullanım
GO, yeni çıkan ve gerçekten harika özelliklere sahip bir dil. Bu özelliklerin en önemlisi bütün her kullanılan kütüphanelerle birlikte kendisini tek programa çevirebiliyor olması. Bu özelliği kullanarak projemizi docker üzerinde çalıştıracağız. Go üzerinde yönetim çok daha basittir hatta google mühendislerinin geliştirdiği ko aracı sayesinde docker dahi kullanmadan go projelerini build ederek sunuculara aktarabilirsiniz.
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "Hello World\n")
})
http.ListenAndServe(":8090", nil)
fmt.Printf("HTTP Sunucusu başlatıldı!")
}
Sunucu kodumuz bu şekilde,
FROM golang:1.18-alpine
COPY . app
WORKDIR app
RUN go mod download
RUN go build
CMD ./go_http
Dockerfile dosyamızda bu şekilde, ancak dikkat edilmesi gereken en büyük husus docker build yaptığımız zaman image en son halinde go projesinin sdksı ve çeşitli ihtiyaç dışı programlar barındırmakta. Bu yüzden docker image 300 MB ye yakın yer kullanmakta. Bunu çözmenin en iyi yolu scratch kullanmak. Dockerfile dosyamızı aşağıdaki şekilde güncelleyelim;
FROM golang:1.18-alpine as BUILD_IMAGE
COPY . app
WORKDIR app
RUN go mod download
RUN go build
FROM scratch
COPY --from=BUILD_IMAGE /app/go_http /go_http
CMD ["/go_http"]
Bu sayede kolay bir şekilde projenin boyutunu düşürmüş olduk
Node ile kullanım
Normalde node js ile oluşturulan projeler her programlama dillerinde olduğu gibi bir kere çalışır ve sonlanırlar. Ancak bir web serveriniz bulunuyor ise bunun istenmeyen bir durum olduğunu belirtmek istemekte fayda var. Çünkü projeniz hata verirse tekrar başlamadığı için docker run veya exec yazmanız gerekecek. Bunu önlemenin en iyi yolu pm2 gibi araçlar kullanmak. Birde üstüne kendi projenizde kullandığınız kütüphanelere varsayıldığında haliyle node_modules gibi şeyler projenin boyutunu oldukça arttırıyor. C, GO gibi statik dillerin farkı burada ortaya çıkıyor.
Öncelikle projemizi hazırlayalım.
const express = require("express");
const app = express();
app.get("/", (req, res) => {
res.send("Başarılı!");
});
app.listen(5000);
Aklınıza ilk gelecek soru “bu proje çok basit, neden npm start ile başlatmıyoruz?” olacaktır. Elbette hayır. Çünkü proje ne kadar küçük olursa olsun pm2 gibi araçlar kullanmanızı şiddetle tavsiye etmemde fayda var. PM2, 2023 yılında zombie processleri kolaylıkla önleyebiliyor.
Dockerfile dosyamız aşağıdaki gibi olacaktır.
FROM node
COPY . app
WORKDIR app
RUN npm install
CMD npm start
Dockerfile dosyamız bu şekilde, ancak burada ciddi bir problem var. CMD komudunda vermiş olduğumuz “npm start” komudu doğru değil. Çünkü pm2 olmadan başlattığımızda zombie processler engelenmeyeceği ve proje dosyalarında oluşan herhangi bir sorundan ötürü proje duracağı için çok ciddi sorunlar yaratabilir. Bu yüzden Dockerfile dosyasını şu şekilde düzeltelim;
FROM node
COPY . app
WORKDIR app
RUN npm i pm2 -g
RUN npm install
CMD [ "pm2-runtime", "start", "npm", "--", "start" ]
şimdi projemiz çok daha iyi çalışacak.
docker build . -t node-project
docker run -d -p 80:5000 node-project
İlk başta projeyi build ediyoruz, ardından projeyi 80 portunda çalışacak şekilde port aktarması yapmasını sağlıyoruz. 5000 portunda çalışan projemiz dışarıda 80 portundan erişilebilir hale gelmiş oluyor.
Zombie Processes
Zombie processes, çok sık karşılaşılan bir durumdur. Bu duruma sebep olan önemli şey proje dosyalarınızı CMD komutuna yerleştirmenizdir.
Parent ve Child Process
Normalde, linux yapısında parent ve child processler olarak ikiye ayrılan yapı vardır bu yapılarda parent sizin açtığınız veya başlattığınız, child ise projenizin başlattığı programlara denir.
“init” process her zaman 1 id si ile başlar. Bu önemlidir çünkü eğer process kapanırsa bütün her şey durur. Çünkü her şey init process üzerinden çağırılır. Docker içinde init process kendi belirlediğimiz process olur ve bunuda CMD ile belirleriz. Sizinde gördüğünüz gibi init bazı programlar başlatmış. Bir altta oluşacak her işlem bizim child processimiz olacak.
Linux Child Process Doğası
Linux üzerinde child process bittikten sonra parent kısmına haber verilir. Ancak bazı durumlarda bitmesine rağmen hiç kimsenin haberi olmuyor. Bu durumda bu process init processine gönderiliyor ve kapatılıyor. Bu duruma zombie process adını veriyoruz.
Buradaki temel sorun, zombie processler linux üzerinde çokta sorun oluşturmasada docker içinde kurulan sistemde oluşturur.
Sizinde gördüğünüz gibi, init process yok! Kendimiz bunu seçebiliyoruz haliyle yaptığımız “npm start” işlemi çok sorun yaratabilir çünkü npm zombie processleri siz demedikçe öldürmez. Bu yüzden CMD işlemleri için npm kullanmamanızı öneriyorum. Eğer zombie process açığa çıkarsa bir yerden sonra ram tüketeceğinden memory leak oluşur.
Docker Compose
Docker compose, büyük projelerde yönetimi sağlamak için kullanılan yapıdır. docker run komutunun daha detaylı halidir. birden fazla docker çalıştırıp bu containerleri tek yerde yönetmenizi sağlar. Özellikle aynı network ağına bağlamak istediğinizde çok rahat düzenleyebilmeniz ve kolayca çalıştırabilmeniz – durdurabilmeniz çok faydalı olabiliyor.
Docker compose “docker-compose” şeklinde yazılarak kullanılır
Yapı
Docker Compose, YAML kullanarak yazılır.
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
redis:
image: redis
Bu örnekte göreceğiniz üzere iki farklı image ile container kuruyoruz. “services” ana katmanımız ve ondan sonrasında ise kendi adlandırdığımız container adını giriyoruz. Daha sonrasında ise içerisine volume, port ekleyebiliriz. Farkındaysanız bunun docker run yazmaktan farkı yok ancak kullanımı daha basit.
docker-compose up -d
Sadece bunu yazmamızla birlikte 2 container oluşturulmuş olacak. Bu sayede diğer insanlara kurulum yaparken uzun docker run komutları girmeye gerek kalmayacak. Eğer projeyi durdurmak istersek;
docker-compose down
Yazmak yeterli olacaktır. Harika değil mi?
Docker Güvenliği
Docker her ne kadar teoride asla gerçek cihaza erişemesede pratikte öyle değildir. Bu yüzden docker sürümünüzü her zaman güncel tutmalısınız.
Güvenilir tutmak için aşağıdaki işlemleri yapabilirsiniz;
- Docker container sınırını ayarlayın: Docker containerinin erişeceği bant genişliğini, kaynakları sınırlarsanız olası veri çalınma durumunda zararı azaltabilirsiniz.
- Docker günlüklerini izleyin: Docker günlükleri “docker logs CONTAİNER_ADI” olarak izlenebilir.
- Image dosyasına dikkat edin: Docker üzerinden onaylanmamış hiçbir image dosyasını indirmeyin, kurmayın. Docker imagelerine kolaylıkla virüs koyulabilir ve bu virüslerle kolaylıkla sisteminize sızılabilir.
- Ağ trafiğini denetleyin: Docker üzerinden farklı yerlere giden ağ bağlantılarını denetleyin.
- Yapılandırmayı doğru yapın: Docker kurulumları uğraştırıcı olabilir ancak kolaya kaçılmamalıdır. Doğru yapılandırılmayan docker containeri veri sızıntısı yaşatabilir.
Elbette düşününce bunlar çok zor yapılabilecek öneriler, bu yüzden size tavsiyem en güncel docker sürümünü kullanmalı ve image dosyasına dikkat etmeniz. Geri kalanlar için gereken işgücü var ise uygulanabilir.
Docker Orkestrasyon
Docker containerleri fazla olduğunda yönetimi zor olabiliyor. Her birine ayrı bir yönetim yapmak uğraştırıcı olduğundan en basit çözüm olarak docker üzerinde ullanabileceğiniz çeşitli orkestrasyon araçları bulunuyor.
Docker Orkestrasyonu neden kullanılmalı?
Örnek verelim, 1 adet docker imajına sahipsiniz. Bu imaj ise web siteniz olsun. Eğer siteniz yük altında ise web sitesi yavaşlayabilir. Oysa, birden fazla docker containeri yaratarak anında yüksek yükü yönetebilirsiniz. Fakat bunu manuel şekilde yapmak oldukça meşakatli. Bu yüzden yapmanız gereken altın kural bir orkestrasyon aracı kullanmak olacaktır. Orkestrasyon araçları uzun ve yüksek yüklerde yeni bir container oluşturur ve istekleri oraya yönlendirir. Bu sayede ilk container çok perfomans gerektiren işleri yaparken ikinci container kolayca sonraki istekleri cevaplayabilir.
Docker orkestrasyonu için en bilindik 2 araç vardır. Bunlar Docker Swarm ve Kubernetesdir.
Anlaşmazlık Problemi
Konsensus, grup olarak anlaşmayı simgeler. Kubernetes veya Swarm gibi araçlarda ortak problem analaşamamazlıktır. Çünkü aynı işlemleri yapan birden fazla container çalışabilir ve bu containerler arasında neredeyse hepsi aynı işlemleri yaparlar. Bu durumdan ötürü hangi containerin cevabının gerçekten doğru olduğuna karar vermekte zor olur. Swarm ve Kubernetes bu sorunu çözmek için konsensus algoritmasını kullanır. Kubernetes, bütün işlemleri etcd adı verilen bir veri deposunda tutarken, swarm ise etcd ye benzer bir şekilde çalışan kendine has veri deposunu kullanır. Veri depolarında tutulan veriler karşılaştırılır ve doğru olduğu düşünülen veri kullanılır.
Orkestrasyon Araçları
Docker Swarm
Docker Swarm docker tarafından geliştirilen açık kaynaklı bir orkestrasyon aracıdır. Yukarıda saydığımız sebeplerden ötürü ortaya çıkmış bir yazılımdır. Docker swarm için herhangi bir kurulum gerekmemekte. Aşağıdaki kodu kullanarak swarm açık mı değil mi öğrenebilirsiniz. (Eğer windows kullanıyorsanız grep yerine findstr yazmanız gerekmekte)
docker info | grep Swarm
Eğer swarm açık değil ise aşağıdaki kodla çalıştırabilirsiniz.
docker swarm init
Clustering
Swarm clustering mantığıyla çalışır. Clustering, birden fazla containerin birleştirilerek oluşturulan düğümleri toplu bir şekilde yönetmemizi sağlayan araçtır. Clusteringleri yönetmek için iki rol bulunmakta. Worker ve Manager.
Manager
Docker containerleri üzerinde bakım, kaynak yönetimi, performans ve güvenliğini yönetmeyi sağlayan araçtır. Bütün workerler managere erişebilir ve kontrol edilebilir. Docker swarm kullanıyorsanız en az 1 manager bulunmalıdır çünkü workerler manager olmadan düzgün yönetilemeyeceklerinden çalışamazlar.
Worker
Swarm cluster üzerinde bulunan düğümleri çalıştırma, yönetmeyi sağlayan araçtır. Swarm cluster üzerinden kaynak kullanırlar ve manager tarafından yönetimi sağlanır. Workerin temel amacı containerlerde hata durumu, istek olduğunda managere yönlendirilir ve manager bu isteği işleyerek workere emir verir.
Kubernetes
Kubernetes tıpkı docker swarm gibi orkestrasyon aracıdır. Kubernetesin temel amacı bulut sistemini yönetmektir. Çünkü bulut sisteminde çoklu sunuculardan veri paylaşımı yapılır. Bu durumda da hızlı dağıtım yapılır. Docker swarma kıyasla daha fazla özelliğe sahiptir. Kubernetes ne olduğunu anlatmadan önce terimleri anlamamız gerekiyor.
- Master: Kubernetesin temel düğümüdür. Kendi durumunu gözetler ve yönetir.
- Düğüm: Containerlerin gruplandırılmasını amaçlayan yapıya denir. Her düğümde kubelet adı verilen araç çalıştırılır. Düğüm, aslında fiziksel veya sanal bir makinedir.
- Kubelet: Düğümlerin sağlığını ve durumlarını izleyen araçtır.
- Pod: Düğüm içerisindeki containerlerin birbiri ile iletişime geçmesini sağlar.
Kubernetes yaşam döngüsü
Kubernetes, düğümler ve podlar ile çalışır. Kubernetes kurulumunda öncelikle master adı verilen bir düğüm oluşturulur. Master, kubernetesin kendini yönetme ve izleme görevini yapması için kullanılır. Öncelikle düğüm oluşturulur ardından bu düğümler içerisinde podlar yerleştirilir. Öncelikle podlar oluşturulurken bize manifest dosyası gerekir. Podlar için oluşturulan bu manifest dosyası düğümler arasında paylaşılır. Ardından;
- Kubernetes, pod manifestini düğümler arasında dağıtır.
- Podları oluşturmak ve yönetmek için manfiest dosyaları kullanarak podlar yaratılır.
- İşlem bitiminde veya kaynak ayırmasına gerek duyulmayan podlar kapatılır. Kaynak ayırmasına gerek olup olmadığını öğrenmek için kubelet kullanılır.
Bu işlemler sayesinde sürekli bir döngü içerisinde düğüm yönetimi sağlanır.
Kubernetes ve Docker Swarm farkları
Kubernetes docker swarmdan çoğu yönden farklıdır. Bu farkları sayacak olursak;
- Docker swarm sadece docker üzerinde çalışırken kubernetes daha fazla container aracını destekler.
- Swarm, docker engine kullanarak container oluştururken kubernetes Kubernetes CLI (kubectl) kullanır.
- Swarm, kubernetese göre daha basit özelliklere sahiptir. Kubernetes ise daha fazla karmaşık, daha fazla özelliğe sahiptir.
Hangisini kullanmalı?
Eğer bulut sistemine sahipseniz kubernetes kullanmanız daha mantıklı olur. Eğer küçük veya orta düzey bir şirketin sahibiyseniz docker swarm en etkili kullanım yöntemi olacaktır. Çünkü docker swarm kubernetese göre daha basit kullanıma sahip ve öğrenimi kolaydır.
Docker dezavantajları
- Docker, avantajları olduğu kadar dezavantajlara da sahiptir. Bunlardan en önemlisi dockerin bir daemon kullanmasıdır. Daemon kullanıyor olması arkada sürekli çalışan bir programın olması anlamına gelmekte. Fakat ne kadar büyük bir dezavantaj tartışılır.
- İkinci en büyük sorun ise zombie processler için init process bulunmamasıdır.
Her ne olursa olsun, avantajları dezavantajlarına karşı fayda sağladığından günümüzde en çok tercih edilen container yönetim aracı dockerdir.