Docker, işletim sistemi seviyesinde sanallaştırma sağlayan bir uygulamadır. Docker, "konteynır" (ing.: container) adı verilen yazılım paketlerini oluşturmak, çalıştırmak ve yönetmek için kullanılmaktadır.

Docker logo
Resim 1. Docker logo

Docker Nedir?

Docker, işletim sistemi seviyesinde sanallaştırma sağlayan bir uygulamadır. Docker, "konteynır" adı verilen yazılım paketlerini oluşturmak, çalıştırmak ve yönetmek için kullanılmaktadır. Konteynırlar birbirinden ayrı ve bağımsız halde çalışabilmektedir. Detaylı bilgi ve Docker kurulum adımları için tıklayınız.

Docker Container

Docker "konteynır", çalıştıracağı uygulamanın kodlarını, dosyalarını, bağımlılıklarını ve konfigürasyonlarını vb. içinde barındıran izole bir ortamdır. Konteynır bir uygulamanın çalışması için sadece gerekli kod ve bağımlılıkları barındırır. Böylece sanal sunuculara göre daha az yer kaplar, daha az kaynak tüketir ve daha hızlı çalışırlar. Bağımlılıkları içinde barındırdıklarından hızlı şekilde farklı ortamlara taşınabilir ve hızlıca ayağa kaldırılırlar. Docker üzerindeki tüm konteynırlar birbirlerinden tamamen izole çalışırlar. Konteynır aslında bilgisayar üzerinde izole çalışan bir süreçtir (ing: process) ve tüm konteynırlar kurulu olduğu bilgisayar çekirdeğini (ing.: kernel) paylaşırlar.

Docker Image

Docker "imaj", (ing.: image) konteynırları oluşturmak için kullanılan taslaktır. Konteynırın çalışması için gerekli bağımlılıkları, yönergeleri ve ayarları barındırır. Bir imaj ile birden fazla konteynır oluşturulabilir. Docker imaj oluşturmak için dockerfile kullanılır.

Docker Volume

Docker "volüm", (ing.: volume) konteynırların verilerini kaydeden yapıdır. Konteynırlardan ayrı olarak host bilgisayarın dosya sisteminde bulunurlar. Böylece konteynırlar silinse bile verileri kaybolmaz ve farklı konteynırlar tarafından da ereişilip kullanılabilirler.

Docker Network

Docker "ağ", (ing.: network) konteynırların birbirleriyle iletişim kurmasını sağlayan yapıdır. Konteynırlar birbirlerinden izole çalıştığından docker networkler üzerinden haberlerşirler.

Docker Komutları

Docker kurulu sürüm bilgisini gösterir;

Kod

docker --version

Docker kurulu sürüm detaylı bilgilerini gösterir;

Kod

docker info

Bilgisayardaki yüklü imajları listeler;

Kod

docker images
docker image ls

Docker imajları
Resim 2. Docker imajları

Bilgisayardaki çalışan konteynırları listeler;

Kod

docker container ls
docker ps

Çalışan Docker konteynırları
Resim 3. Çalışan Docker konteynırları

Bilgisayardaki konteynırları listeler;

Kod

docker container ls -a
docker ps -a

Durmuş tüm konteynırları listeler;

Kod

docker container ls -a --filter status=exited

Konteynırları çalıştırır;

Kod

docker container start containerID
docker container start containerName

Konteynırları durdurur;

Kod

docker container stop containerID
docker container stop containerName

Çalışan tüm konteynırları durdurur;

Kod

docker container stop $(docker container ls -q)

Konteynırı geçici olarak durdurur;

Kod

docker container pause containerName

Geçici olarak durdurulmuş konteynırı kaldığı yerden devam ettirir;

Kod

docker container unpause containerName

Konteynırları siler;

Kod

docker container rm containerID

Tüm konteynırları siler;

Kod

docker container rm $(docker container ls -aq)

Konteynır loglarını gösterir;

Kod

docker container logs containerName

Konteynır istatistiklerini gösterir;

Kod

docker container stats containerName

Konteynır detaylı inceleme için;

Kod

docker container inspect containerName

Konteynır içindeki processleri gösterir;

Kod

docker container top containerName

Çalışan konteynırların ID değerlerini getirir;

Kod

docker container ls -q

Tüm konteynırların ID değerlerini getirir;

Kod

docker container ls -aq

hello-world adlı konteynırı çalıştırır. Bilgisayarda yüklü değil ise Docker Hub sitesinden imajı indirir ve çalıştırır;

Kod

docker container run hello-world

hello-world adlı konteynırı isim vererek çalıştırır;

Kod

docker container run --name my-first-container hello-world

nginx adlı konteynırı çalıştırır. Bilgisayarın 80 portuna gelen isteği konteynırının 81 portuna yönlendirir;

Kod

docker container run --publish 80:81 nginx

nginx adlı konteynırı arka planda çalıştırır;

Kod

docker container run --publish 80:81 --detach nginx

mongodb adlı konteynıra bağlanıp içinde komut çalıştırır;

Kod

docker container exec -it mongodb bash

Konteynırı işlemci ve bellek kısıtlaması ile çalıştırır;

Kod

docker container run -d --name mongodb --cpu-shares 256 --memory 128M mongo

Konteynır kısıtlama değerlerini günceller;

Yükün yarısı kullanacak şekilde günceller;

Kod

docker container update --cpu-shares 500 alpine

İşlemci gücünün yarısı kullanılacak şekilde günceller;

Kod

docker container update --cpus 0.5 alpine

nginx adlı imajın en güncel sürümünü bilgisayara indirir;

Kod

docker image pull nginx

nginx adlı imajın 1.20 sürümünü indirir;

Kod

docker image pull nginx:1.20

nginx adlı imajı siler;

Kod

docker image rm nginx
docker image rmi nginx

mynginx adlı imaj oluşturur;

Kod

docker image tag nginx:1.20 mynginx

İmaj detaylarını gösterir;

Kod

docker image inspect dockerImageID

İmaj detaylarını gösterir;

Kod

docker image inspect dockerImageID

Konteynırda yapılan değişiklikleri kaydeder ve adı yazılan konteynırın aynı özelliklerinde imaj oluşturur;

Kod

docker container commit alpine alpine:melihsafran

Konteynır ile imaj arasındaki farkları gösterir;

Kod

docker container diff mongodb

Konteynır volume üç farklı türde oluşturulabilir.

Host volume oluşturur. Host dizinine konteyner dizinini bağlar;

Kod

docker run -v /home/host/mount/data/:/var/lib/mysql/data

Anonymous volume oluşturur. Docker arka tarafta konteyner için host sunucuda volume oluşturur ve dizini bağlar;

Kod

docker run -v /var/lib/mysql/data

Named Volume oluşturur;

Kod

docker run -v volumename:/var/lib/mysql/data

Docker Host sunucusunda bulunan volume dizinlerini listeler. Docker volume dosyaları var/lib/docker/volumes yolu altında bulunur.)

Kod

docker volume ls

Volume siler;

Kod

docker volume rm volumeID

Tüm volume dizinlerini siler;

Kod

docker volume prune

Volume dizininin bağlı olduğu konteynırları gösterir;

Kod

docker container inspect containerID

Named Volume oluşturup konteynırı çalıştırır;

Kod

docker container run -d --name mysql1 -v mysqldb1:/var/lib/mysql mysql

Oluşturulacak konteynırın Named Volume var olan volume dizinine bağlar;

Kod

docker container run -d --name mysql2 -v mysql-db1:/var/lib/mysql mysql

Bind Mount ekler. ngnix mount dizinini çalıştırılan directory ile değiştirir;

Kod

docker container run -d --name nginx -p 8080:80 -v $(pwd):/usr/share/nginx/html nginx

Docker Network, Bridge network türünde ağ oluşturur; Brigde türü ağ üzerinden konteynırlar birbiri ile iletişim kurabilir, açılan port ile host bilgisayardan konteynırlara erişilebilir.

Kod

docker network create -d bridge my-bridge-network

Host network türünde ağ oluşturur, host bilgisayar ağını kullanır;

Kod

docker network create -d host my-host-network

Overlay network türünde ağ oluşturur, bu tür birden fazla hostu birbirine bağlamak ve swarm servisleri arasında iletişim kurmak için kullanılır;

Kod

docker network create -d overlay my-overlay-network

Docker Network tanımlı ağları listeler;

Kod

docker network ls

Ağ özelliklerini gösterir;

Kod

docker network inspect my-bridge-network

bridge-net adlı ağ üzerinde cis-alpine adlı konteynırı çalıştırır;

Kod

docker container run -dit --name cis-alpine --network bridge-net alpine ash

trans-alpine adlı konteynırı bridge-net adlı ağa bağlar;

Kod

docker network connect bridge-net trans-alpine

Dockerfile İle Docker Image Oluşturma

Dockerfile, Docker imajı oluşturmak için kullanılır. Dockerfile, imaj oluşturmak için kullanılan komutları ve parametreleri içeren bir metin dosyasıdır.

Konteynırı oluşturacak temel imajı belirtir;

Kod

FROM node

İmajı oluştururken çalışacak komutları belirtir. Birden fazla run komutu yazılabilir;

shell biçimi ile;

Kod

RUN mkdir -p /home/app

ya da exec biçimi ile;

Kod

RUN ["mkdir", "-p", "/home/app"]

Host bilgisayardaki mevcut dizindekileri konteynırın içindeki yazılan dizine kopyalar;

Kod

COPY . /home/app

Konteynır oluştururken çalışacak varsayılan komutu belirtir; Konteynır çalışırken bir komut girilir ise dockerfile ile girilen varsayılan komut çalıştırılmaz. Dockerfile dosyasına bir kere yazılır.

Shell biçimi ile;

Kod

CMD node /home/app/server.js

ya da exec biçimi ile;

Kod

CMD ["node", "/home/app/server.js"]

Konteynırı başlatılırken çalışması istenen komutu belirtir; CMD komutuna benzer fakat CMD komutu parametreleri konteynırı çalışmaya başlanırken değiştirilebilir. ENTRYPOINT parametreleri değiştirilmez. Dockerfile dosyasına bir kere yazılır.

Kod

ENTRYPOINT ["echo", "Hello!"]

Dosyaları ve dizinleri konteynırın içine kopyalar; Uzak sunucudaki dosyaları url adresi ile ve sıkıştırılmış dosyaları açarak istenilen dizine kopyalar.

Kod

ADD codes /home/app

Konteynırda kullanılan ortam değişkenleri tanımlar;

Kod

ENV PORT 80

İmaj oluştururken kullanılan değişkenleri tanımlar;

Kod

ARG imageName

Konteynırın çalışacağı dizini belirtir;

Kod

WORKDIR /home/app

Konteynıra erişilecek portu tanımlar;

Kod

EXPOSE 8080

Kayıt yeri olarak kullanılacak olan volume dizinini tanımlar;

Kod

VOLUME /opt/data

Örnek Dockerfile;

Kod

# Dockerfile

FROM node:19-alpine3.16

RUN mkdir -p /home/app

COPY . /home/app

CMD ["node", "/home/app/server.js"]

İmaj oluşturmak için Dockerfile dosyasının bulunduğu dizinde;

Kod

docker build -t myApp:v1.0 .

Dockerfile ile Docker imaj oluşturma
Resim 4. Dockerfile ile Docker imaj oluşturma

Oluşturulan imajından konteynırı çalıştırmak için;

Kod

docker run myApp:v1.0 .

Docker konteynır çalıştırma
Resim 5. Docker konteynır çalıştırma

Kaynaklar

  1. Overview , docs.docker.com, 27.01.2023 tarihinde alındı.
  2. A Beginner-Friendly Introduction to Containers, VMs and Docker , dzone.com, 28.01.2023 tarihinde alındı.
  3. What is Dockerfile and How to Create a Docker Image? , geekflare.com, 28.01.2023 tarihinde alındı.
  4. Difference between RUN and CMD in a Dockerfile , stackoverflow.com, 28.01.2023 tarihinde alındı.
  5. Docker RUN vs CMD vs ENTRYPOINT , codewithyury.com, 28.01.2023 tarihinde alındı.
  6. What is the Docker ADD command? , educative.io, 28.01.2023 tarihinde alındı.
  7. 6 Docker Basics You Should Completely Grasp When Getting Started , vsupalov.com, 28.01.2023 tarihinde alındı.
  8. Docker ARG, ENV and .env - a Complete Guide , vsupalov.com, 28.01.2023 tarihinde alındı.
  9. Dockerfile tutorial by example - basics and best practices [2018] , takacsmark.com, 31.01.2023 tarihinde alındı.
  10. Mastering Docker's CMD and ENTRYPOINT , shisho.dev, 31.01.2023 tarihinde alındı.
  11. Dockerfile Tutorial - Docker in Practice || Docker Tutorial 10 , youtube.com/TechWorldwithNana, 31.01.2023 tarihinde alındı.
  12. Docker Networking , aquasec.com, 31.01.2023 tarihinde alındı.

 


Beğen