Docker Komutları

Cem Topkaya
23 min readOct 26, 2020

--

  • grep, ls, ancestor, filter
  • KONTEYNER LİSTESİ
  • Filitreyle Listeleme
  • GREP ile Listelemek
  • run, -- rm, -d
  • KOŞTURMAK
  • Önplanda Çalıştırma Örnekleri
  • Arkaplanda Çalıştırma Örnekleri
  • pause — unpause
  • DURAKLATMAK & DEVAM ETMEK
  • stop
  • DURDURMAK
  • start, -a, --attach, -i
  • BAŞLATMAK
  • Detached Mode
  • Attached Mode
  • LOG (Günlük)
  • rm
  • Çalışan Konteyneri Zorla Kaldırmak
  • Çalışmayan Konteynerleri Listelemek
  • Sadece Durmuş Konteynerleri Kaldırmak
  • Filtre Kullanarak Konteyner Kaldırmak
  • Volumeler İle Kaldırmak
  • IMAGE vs. REPOSITORY
  • EXEC
  • Root Yetkisi
  • Ctrl+p, Ctrl+q
  • Attach Komutu
  • Attach Mode’dan Çıkmak
  • Debian Linux Container Üstüne NodeJs Kurulumu
  • Centos Linux Container Üstüne NodeJs Kurulumu
  • docker-compose
  • docker-compose build, up
  • SERVICE
  • Service İLE Container Farkı
  • docker run
  • docker service create
  • Orkestrasyon Seçenekleri
  • Önce ORKESTRASYON Ne Demek?
  • Docker Restful API
  • NETWORK
  • NETWORK 1
  • NETWORK 2
  • Bridge
  • ncat/nc İle Aynı Host Ustunde 2 KAP Nasıl Konuşur
  • NC Sürekli Çalışsın
  • NC Proxy Gibi Çalışsın
  • Docker Kapları Arasında nc Nasıl Çalışıyor?
  • Port Tarayabiliriz (-z)
  • Konteyneri Ağa Bağlamak
  • DOCKER_HOST İle Uzak Sunucuda Docker Komutları Koşturmak

GİRİZGÂH

Windows 7 ve 8 için docker kurulumu “Docker Toolbox” ile, Windows 10 ve sonrası için “Docker Community Edition (Docker CE)” ile gerçekleştirilebilinir.

Docker Toolbox içerisinde sanallaştırma için VirtualBox ile gelirken Docker CE, Windows’un Hyper-V makina sanallaştırmasını (hypervisor) kullanır (Mac için HyperKit sanallaştırma alt yapısını).

Demek oluyor ki; Windows makinanıza Hyper-V seçeneği kapalı olarak kurulum yapabileceğiniz docker sürümü Docker Toolbox.

https://github.com/docker/toolbox

Online docker işlemlerini denediğim adres:

https://www.katacoda.com/courses/jenkins/build-docker-images

Güzel Kaynaklar

https://gokhansengun.com/docker-nedir-nasil-calisir-nerede-kullanilir/

https://www.youtube.com/watch?time_continue=26&v=xGn7cFR3ARU&feature=emb_logo

https://linuxize.com/post/how-to-remove-docker-images-containers-volumes-and-networks/

Docker Toolbox İçeriği

  • Docker Client (%ProgramFiles%\Docker Toolbox\docker.exe)
  • Docker Machine (%ProgramFiles%\Docker Toolbox\docker-machine.exe)
  • Docker Compose (%ProgramFiles%\Docker Toolbox\docker-compose.exe)
  • Kitematic (%ProgramFiles%\Docker Toolbox\kitematic\Kitematic.exe)

Docker-Machine

Docker Machine sayesinde docker’ın koştuğu VM seviyesinde işlemler yapabiliriz.

$ docker-machine 
ls
status <vm_adi>
start <vm_adi>
stop <vm_adi>
restart <vm_adi>
kill <vm_adi>
ip <vm_adi>
env <vm_adi>
inspect <vm_adi>
ssh

Docker Client

Docker bize hem Restful API hem komut satırı hem de declarative bir metin dosyasyıyla sanallaştırma imkanı sunuyor.

Komut satırını kullanarak vereceğimiz komutları Docker Client yerine getiriyor.

Docker Compose

Image, Container

Yansıları Class gibi düşünürsek Konteynerler nesneler/sınıf örnekleri olurlar.

Bir yansıdan istediğimiz kadar konteyner üretebiliriz.

Komutlara Genel Bakış

  • pull: Docker-hub üstünde eğer varsa parametre olarak verilen imajı sistemimize çeker.
docker pull <yansı-adı>

Eğer belirli bir versiyon verilmez ise son versiyonu indirecektir.

  • create: Docker imajlarını bir konteyner olarak çalıştırmamızı sağlar.
  • ps: Çalışan konteynerları listeler. -a parametresini eklersiniz, çalışan ve çalışmayan tüm konteynerlar listelenecektir.
  • start: Konteyneri tekrar başlatır. Konteyner kısmına dikkat!

Eğer daha önce pull veya run ile yansı sistemimize çekilmemiş ve çalıştırılarak, konteyner olmamışsa start ile tekrar başlatılamaz:

Böyle bir konteyner yok!” diyor. Yansı olarak mevcut olabilir ama bu yansı hiç çalıştırılarak konteyner olmamışsa bir ID ve NAME bilgisi oluşmamış demektir. Nitekim docker start komutu parametre olarak NAME veya ID alacaktır ki; bu bilgi ancak çalıştırılmış yansıların konteyner halleri için mevcuttur.

Start komutunu -a ile çalıştırdığımızda docker start -a e125d245009f hem container başlatılır hem konsolumuz çalışan konteynerin konsoluna bağlanır ve çıktıları görebiliriz.

  • build: Dockerfile dosyasını alarak imaj haline getirir.
  • images: Makineniz içerisinde çalıştırılabilir Docker imajlarını gösterir.
  • run: Konteyneri çalıştırır ve belirtilirse konteyner içinde komut çalıştırır.
  • rmi: Bir veya birden fazla Docker imajını silmek için kullanılır.
  • rm: Bir veya birden fazla konteyneri silmek için kullanılır.
  • kill: Bir veya birden fazla çalışan konteyneri durdurmak için kullanılır.
  • ps: Çalışan konteynerleri listelemek için kullanılır.
  • tag: Oluşturulan imajlara tekrar ulaşabilmek için etiketleme yapar. (Versiyonlama için kullanılabilir)
  • login: Docker Registery (Hub)’a bağlanmak için gerekli olan doğrulamayı yapar.

İndirmek Ve Bağlanmak

Aşağıdaki Docker for XXX güncel olup Hyper-V özelliğinin işletim sisteminde açık olmasını gerektirir.

Ama Docker Toolbox artık geliştirilmesi yapılmamasına rağmen Hyper-V olmaksızın çalışır.

  • Docker for Windows
  • Docker for Mac
  • Docker Toolbox

Docker Toolbox buradan indirildiyse ister Docker QuickStart Terminal ile ister putty ile 192.168.99.100 ipsine SSH ile bağlanalım kullanıcı adı docker, şifresi tcuser olacak şekilde giriş yapabiliriz.

İndirdiğiniz Docker Toolbox içeriğinde Docker istemcisi, Compose, Machine, Kitematic ve VirtualBox barındırır.

Docker size bir linux makinası üstünde çeşitli yansıların yazılımlarını birbirinden izole çalıştırmanızı sağlar. Google firmasının 2008 de Linux kerneline eklettirdiği cgroup (control group) özelliği, Linux Containers (LXC) adıyla dünyaya gelmiş. Linux işletim sisteminin, üstünde koşan yazılımlara sanki sadece kendileri kullanıyormuşçasına Dosya Sistemi, Ortam Değişkenleri (env. vars) gibi kaynaklar sunumasını sağlamış.

Peki neden Virtualbox geliyor!

Çünkü windows veya mac üstünde Docker Toolbox kullanmak istediğimizde, yansılarımızı indirip konteyner olarak koşturacağımız Linux makinası gerekiyor ki, LXC’nin nimetlerinden faydalanalım yani cgroup özelliğiyle uygulamaların izolasyonunu yapabilelim.

MacOS üstünde Docker Kurmak

Docker Sanal Sunucularını Listelemek

Yüklü docker sanal sunucularını aşağıdaki komutla listeleyebiliriz

$ docker-machine ls

Listelenen sunucuların

> ip adresini almak için

docker-machine ip <name>

> ssh bağlantısı kurmak için

  • ssh <kullanıcıAdı@IP_adresi>
  • docker-machine ssh <VM_adı>
ssh docker@192.168.99.100
docker-machine ssh <vm adı>

DNS Sunucusu Eklemek

Eğer sanal makinanın DNS bilgisini değiştirmek istersek sudo ile admin olarak açacağımız resolve.conf dosyasına nameserver 8.8.8.8 satırını ekleyebiliriz:

docker@default:/etc$ sudo vi resolv.conf

Artık ssh ile bağlantı kurup default isimli VM içinden ping atabiliriz.

VERSİYONU GÖRÜNTÜLEMEK

docker — version

prune

Kullanılmayan Her Şeyi Kaldırmak

The docker system prune command will remove all stopped containers, all dangling images, and all unused networks

-f veya — force ile kullanıldığında aşağıdaki uyarıyı verecektir:

WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all build cache
Are you sure you want to continue? [y/N]

FORMATLI Görüntüleme 1

Çıktıları farklı formatta görüntülemek için --format anahtarı kullanılır.

$ docker container 
ps -a
--format "\n{{.ID}}\t {{.Names}} \n\t {{.Status}} \n\t {{.Labels}} \n\t {{.Command}}"

Tablo formatında görüntülemek istersek

$ docker container ls -a --format "table {{.ID}}\t {{.Names}}\t {{.Status}}\t {{.Labels}}\t {{.Command}}"
Kendi isteğimize göre tablo formatında listeleme

FORMATLI Görüntüleme 2

Eger formati bir kere tanimlayip ortam degiskenlerine tanimlarsaniz tekrar tekrar yazmaniz gerekmez:

export FORMAT=”ID\t{{.ID}}\nNAME\t{{.Names}}\nIMAGE\t{{.Image}}\nPORTS\t{{.Ports}}\nCOMMAND\t{{.Command}}\nCREATED\t{{.CreatedAt}}\nSTATUS\t{{.Status}}\n”$ docker ps 
--format $FORMAT

https://cloud.githubusercontent.com/assets/7823011/19899780/41ff0db4-a09c-11e6-95f2-e275fb80bd2b.gif

Dockerfile

build

ARG, --build-arg

$ docker build 
-t cemt/nodeweb:0.0.1
.

Eğer parametreler vererek docker yansımızı yapılandırmak istersek:

Parametre Dockerfile dosyasında ARG ile aşağıdaki gibi belirtilir:

FROM yansı_adı
ARG hede
ARG hadi
CMD [
"sh", "-c",
"çalış ${hede} ${hadi}"
]

build ederken komut satırımız:

$ docker build 
--build-arg
hede=hodo
hadi=nire
.

En son CMD çalışacak ve kapsayıcı çalıştığında terminal çıktısı: /usr/bin/sh olacaktır.

tag

Sistemimizdeki herhangi bir yansının REPOSITORY bilgisini değiştirmek istediğimizde tag anahtarını kullanırız.
(Bkz. “docker image tag — help”)

$ docker image tag
<Image ID>
"<repo/ad:tag>"

YAHUT

Bir Dockerfile dosyasını build etmek istediğimizde tag anahtarıyla etiket bilgisini verebiliriz.

docker build — help
$ docker build .
-t "<repo/adi:tag>"

docker build ederken repo/ad:tag bloklarından :tag kısmını olmadığı için latest olarak geldi.

Portları Listelemek

Docker kabın çalıştığında dışarıya açık portlarını ve ana makineyle hangi portlarla eşleştiğini görüntülemek için:

$ docker port <cntainerID>

Bilinçli Port Bağlama

Host üstünde hangi portun kap içindeki porta denk geleceğini kabı çalıştırmadan önce verebiliriz:

Host_Port:Docker_Port Bağlaması Yapmazsak

Eğer bilinçli olarak dış ve iç portları birbirine bağlamazsak docker bizim yerimize host makine portlarından uygun olanları seçerek docker kabımızın portlarıyla eşleştirecektir.

UDP Port Bağlama

Varsayılan olarak TCP bağlantısı yaparken portun sonuna UDP yazarak bağlantının türünü değiştirebiliriz

Port Binding

Docker’ın barındırdığı uygulamanın çalıştığı dahili PORT’u dışarıdan erişmek için farklı bir porta (veya aynı porta) bağlamak isteriz.

$ docker run -it -p 8080:80 apache_image
$ docker run -it -p 6603:3066 mysql_image

Birden fazla PORT’u bir kerede bağlamak istersek:

$ docker run -it 
-p 8080:80,8081:443
image_name

Bağlantı noktasını ana makinenin belirli ağ arabirimine bağlamanız gerekiyorsa, IP adresini aşağıdaki gibi tanımlayın. Aşağıdaki örnekte, 8080, 8081 numaralı bağlantı noktasına yalnızca 127.0.0.1 IP ile erişilebilir.

$ docker run -it 
-p 127.0.0.1:8080:80,
127.0.0.1:8081:443
yansı_adı
$ docker run -it
-p 192.168.1.111:8080:80, 192.168.1.111:8081:443
yansı_adı
docker run
--rm
-d
--network host
--name my_nginx
nginx

Eğer UDP portuyla dışarıya açılmışsa bağlantı portunun sonunda /udp gelecek.

VOLUME

  1. Hostun diskini Dockerla paylaşmak
  2. Veri taşıyıcı konteyner’ı Docker’a volume olarak bağlamak

1. Host’un Diskini Docker’la Paylaşmak

Volume Mounting

Volume bağlama işini -v ve --mount anahtarlarıyla yapabiliyoruz.

--mount Yeni ve her yerde kullanılabiliyorken docker service create ile servis yaratırken volume işlerinde sadece --mount kullanılabiliyor (-v useless yani)

Virtualbox üstünde koşan Docker sanal makinası default adıyla çalışıyor.

Default makinasının ayarlarından Shared Folder ayarlarına gidelim

c:/docker-share adıyla guest makinada yani docker makinasında erişilebilecek dizinin gerçekte yani host makinadaki adresi c:\Dev\docker-shared klasörüdür.

Toplu görünümü

Eğer Virtualbox ile paylaşılan dizinlerden birinin içindeki klasörü çalıştırılacak konteynere bağlayacaksak -v veya — volume anahtarları kullanılır.

Örnek

C:\Users\cem.topkaya\docker\utorrent klasörü windows makinasındadır ve Virtualbox üzerinde docker sanal makinasının Shared Folders ayarlarında aşağıdaki gibi paylaşılmış olan C:\Users klasörüne utorrent konteynerini bağlayacağız.

Windows makinasında: C:\Users

Linux Docker içinde: /c/Users

Docker makinasına bağlanmak için docker-machine ssh komutunu çalıştırırız

Klasöre docker için çalışan default adlı sanal makinamıza girerek ulaşabiliyorsak artık konteynerimizi çalıştırırken “volume mounting” yapabiliriz.

Özetle durumumuz:

-v kaynak:hedef YERİNE — mount source=kaynak,target=hedef DİYEBİLİRİZ

Şimdi web browserımız üstünden 82 portuna istek yapabiliriz:

http://192.168.99.100:82/gui

Kullanıcı adı ve şifre soracak.
Kullanıcı adı: admin
Şifre: boş bırakıp enter ile geçelim

http://192.168.99.100:82/gui/web/index.html

Artık gui geldi. Torrent olarak ubuntu linux indirmek istedik ve torrent dosyamızı ubuntu sitesinden indirip utorrent konteynerimize ekliyoruz

2. Veri taşıyıcı konteyner’ı Docker’a volume olarak bağlamak

Mesela bir web uygulamanız var ve 5 web sunucu konteyner içinde bu uygulamayı sunmak istiyorsunuz. Ya her nginx yansınıza web sitesini yükleyecek veya ortak bir konteyner içinde tuttuğunuz bu web sitesi dosyalarını diğer 5 konteynere bağlayacaksınız (mount)

$ docker service create 
-d
--replicas=4
--name devtest-service
--mount source=myvol2, target=/app
nginx:latest

YANSI KOMUTLARI

https://docs.docker.com/engine/reference/commandline/image_ls/

image ls, filter, aq

YANSILARI LİSTELEMEK

docker image ls

SQL deki DROP kullanımını hatırlayalım:

drop TABLE
drop INDEX
drop DATABASE
drop USER
drop FUNCTION
drop TRIGGER
drop ...

Tıpkı container listeler gibi imajları listelemek de aynı yazım ile şöyledir:

docker [container|image] ls as

--filter ile Yansıları (image) Süzmek

  • -a ile Tüm yansıları,
  • -q ile sadece ID bilgilerini

listeler:

$ docker image ls -aq --filter "reference=repo_adi"

rmi, image rm

YANSI SİLMEK

Önce listeleyelim ve sileceklerimizi görelim

docker image ls

Şimdi bir docker imajını silmek için iki komutu da görelim:

docker rmi repository_adı

Bir de docker image rm <IMAGE ID> ile silelim:

docker image rm <REPO ADI>

Nihayetinde tekrar yansıları listelediğimizde:

tag

Yansıyı Yeniden İsimlendirmek

Bir yansının adını değiştirmek için tag anahtarı kullanılır. Bu işlem aynı yansının yeni isimle kopyalanmasını sağlar. Eğer tek bir yansı ve yeni adıyla kalmasını istiyorsak en son olarak eski isimdeki yansının kaldırılması ortalığı temiz bırakmak için iyidir.

Yeni isimle yansıyı kopyalayım:

$ docker tag <old_name> <new_name>

Eski yansıyı silelim:

$ docker rmi <old_name>

YANSI EKLEMEK

docker run mysql

Sistemde mysql olmadığı için indirdi ve mysql kullanıcı şifresi verilmediği için başlatılmadığının mesajını verdi.

Yansı listesi içinde mysql repository adıyla imajımızı görüyoruz:

docker image ls

Şimdi bu yansıyı container haline getirmek için:

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

search

YANSI ARAMAK

docker search redis
$ docker search --help$ docker search <aranan>

Official olan yansı, adında bir ön ek olmayan imajdır. Aşağıdaki çıktılara göre circleci/mongo aradığımız resmi mongo yansısı değildir.

mongo         
circleci/mongo
ekesken/mongo
ccitest/mongo
Docker-Hub üstünde arama yaptığımızda çeşitli versiyon isim ve semantikleriyle listeleyebiliriz

pull

YANSI İNDİRMEK

docker pull <image|repo adı>

Yansı veya repository indirmek için docker pull <image|repo adı> kullanılır. Eğer versiyon bilgisini yansı adının ardına girmezsek son sürümü (latest) otomatik olarak indirecektir.

push

Docker Hub’a Yansı Yüklemek

Docker Hub üstünde giriş yapabilmek için CLI aracıyla aşağıdaki şekilde docker login komutunu çalıştırın:

$ docker login 
-u "myusername"
-p "mypassword"
docker.io

Unutmayın yükleyeceğiniz yansı repository adına karşılık gelecek kullanıcı adınız ile başlamalı. Çünkü ön ek almayan yansılar offical (resmi) yansılardır.

$ docker push myusername/myimage:0.0.1

Yükleme devam ediyor :)

Ve Docker-Hub üstünde imajımız:

KONTEYNER KOMUTLARI

grep, ls, ancestor, filter

KONTEYNER LİSTESİ

docker container ls -a
docker container ls --all

Filitreyle Listeleme

ID bilgisiyle listeleme

docker container ls 
--filter "ID=a7ebd"
-a

Image adıyla listeleme

docker container ls — filter “ancestor=ping” -a
docker container ls 
--filter "ancestor=ping" -a

Image adıyla başlatılmış konteynerlerin ID bilgilerini listelemek

docker container ls 
--filter "ancestor=ping" -aq

GREP ile Listelemek

docker container ls -a | grep "ekho" | awk '{print $1 "\t" $2}'

Grep ile Sütunların Yerini Değiştirmek

Grep ile ID bulmak ve sadece o IDler üstünde işlem yapmak

İçinde ping geçen satırların ID bilgilerini seç ve bu konteynerleri zorla (-f) kaldır (rm)

run, — rm, -d

KOŞTURMAK

Önplanda Çalıştırma Örnekleri

docker run <yansı-adı>
  • Simple Command:

docker run --rm hello-world

hello-world yansısından bir konteyner yaratır (konteyner adını vermediğimiz için dinamik bir adla yaratacak). Konteyner çalışıp exit yapacağı için kaldırılması için --rm anahtarını ekliyoruz (bir daha start etmeyeceğiz diye ortalıkta durmasın istiyoruz).

  • Testing Configuration:

docker run --rm -p 80:80 nginx

rm Anahtarı rEmOVE anlamına gelir ve çıkış yapmış konteynerleri silmeye yarar. Yani hemen sonrasında konteynerleri listelediğimizde göremeyeceğiz.

Arkaplanda Çalıştırma Örnekleri

Long Running Command:

docker run -d 
-p 80:80
--name=mynginx nginx

Now you can control this container using its name:

Get Logs: docker logs mynginx

Start Container: docker start mynginx

Stop Container: docker stop mynginx

Delete Container: docker container rm mynginx veya docker rm mynginx

docker run — name=konteynerAdimiz mongo
docker ps -a

pause — unpause

DURAKLATMAK & DEVAM ETMEK

pause
Pause all processes within one or more containers

unpause
Unpause all processes within one or more containers

docker container pause <container_id>docker container unpause <container_id>

stop

DURDURMAK

docker container stop konteynerAdi

veya

docker stop <NAME|ID>

start, -a, --attach

BAŞLATMAK

  • Konteyneri tekrar başlatır. Konteyner kısmına dikkat!

Eğer daha önce pull veya run ile yansı sistemimize çekilmemiş ve çalıştırılarak, konteyner olmamışsa start ile tekrar başlatılamaz:

Böyle bir konteyner yok!” diyor. Yansı olarak mevcut olabilir ama bu yansı hiç çalıştırılarak konteyner olmamışsa bir ID ve NAME bilgisi oluşmamış demektir. Nitekim docker start komutu parametre olarak NAME veya ID alacaktır ki; bu bilgi ancak çalıştırılmış yansıların konteyner halleri için mevcuttur.

docker ps -a
veya
docker container ls -a

Komutuyla aktif ve pasif konteynerlerin listesinde hello-world yansının konteyner halini görebilirsek, buradan isim veya ID değeriyle tekrar başlatabiliriz.

Olmadığına göre yansıyı koşturalım
Ve çalıştırılmış yansılar listesine bakalım
Aynı şekilde konteyner listesine de bakalım
Artık ID & NAME bilgileri var konteynerin
İster ID ister NAME ile tekrar başlatabiliriz
docker start — attach container_adi

Detached Mode

rm

Yukarıdaki ekran görüntüsünde docker start komutu -a argümanı olmadan bağımsız (detached) modda çalışıyor ve sadece çıktı olarak eğer konteyner adını kullandıysak; adını, ID değerini kullandıysak; ID bilgisini dönüyordu. Yani çalıştırdığımız konsolu, konteynerin konsol çıktılarına bağlamadan, yani kendi konsolumuzu konteynerin çıktılarıyla bloklamadan çalıştırıyoruz.

Detached modda başlatılan bir konteynere bağlanmak için attach anahtarını kullanırız:

docker attach <ID|NAME>

Attached Mode

LOG (Günlük)

rm

Eğer -a veya --attach argümanını kullanırsak terminalimize (konsolumuz), konteynerin terminalini iliştirebiliriz (attach). Böylece konteynerin stdout sonuçlarını docker start diyerek çalıştırdığımız konsolumuzda görebiliriz.

Yani start komutunu -a ile çalıştırdığımızda
docker start -a <Container ID>
veya
docker start --attach <ContID>

hem konteyner başlatılır hem konsolumuz çalışan konteynerin konsoluna bağlanır ve çıktıları görebiliriz.

LOG (Günlük)

Konteyner çalıştı ve konsola neler yazdığını görmek istiyoruz.

docker container logs <NAME|ID>

rm

KALDIRMAK

  • f, -- force
    Çalışan konteyneri zorla kaldırır (SIGKILL sinyali göndererek konteyneri kapatır ve ardından kaldırır)
  • -l,-- link
    --link ile bir konteynere yeni bir ad vererek başka bir konteynere bağlıyoruz. Bu bağlantıyı kaldırmak için kullanırız -l anahtarını
  • -v, --volumes
    Konteyner ile ilişkili diski kaldırır

Konteyner çalışmıyorsa, yani çıkış yapmışsa rm argümanı kullanılır

rm : Remove one or more containers

Çalışan Konteyneri Zorla Kaldırmak

docker container
rm -f <NAME|ID>..

Çalışmayan konteynerler rm anahtarıyla kaldırılabilir ancak çalışan konteynerler ise -f anahtarı kullanılınca kaldırılabilirler.

Ya da çalışan konteyner durdurulur ve kaldırılır. Durdurmak için:

docker container stop konteynerAdi

Birden fazla konteyneri kaldırmak için sadece konteyner ID bilgileri (ilk 32 harfi yeterli) arasına boşluk koymak yeterli olacak:

$ docker container
rm -f c2 d3 ca 13

4 Konteyneri bir kerede durdurur ve kaldırır.

Çalışmayan Konteynerleri Listelemek

Çalışmayan konteynerleri listelemek:

$ docker container 
ls -a
--filter status=exited
--filter status=created

Sadece Durmuş Konteynerleri Kaldırmak

$ docker container prune

Filtre Kullanarak Konteyner Kaldırmak

DOCKER_HOST İle Uzak Sunucuda Docker Komutları Koşturmak

12 Saat öncesine kadar çalışanları kaldırmak

$ docker container prune 
--filter "until=12h"

Volumeler İle Kaldırmak

İlgili Container’ı ilişkili Volume’lar ile birlikte kaldırmak için -v anahtarı kullanılır

docker container
rm -v <NAME|ID>

IMAGE vs. REPOSITORY

A Docker repository is where you can store 1 or more versions of a specific Docker image.

An image can have 1 or more versions (tags).

A Docker image can be compared to a git repo. … It’s also worth pointing out that the Docker Hub and other third party repository hosting services are called “registries”

docker pull <repo_name>/<image_name>:<image_tag>

Buna göre esas yansı, ön eki (repository name) olmayan, doğrudan yansı adı (image name) olandır.

docker pull jmeter3.0

Eğer yansı adından sonra bir etiket (tag) yazmıyorsanız son sürüm olan latest çekilir. Ya da ilgili etiket adını yazabiliriz. Bu etiket adı bir isimlendirme olabileceği gibi versiyon bilgisi de olabilir

docker pull jmeter3.0:1.7

Eğer yansının önünde bir repo adı varsa, özelleştirilmiş bir yansı çekiyoruz demektir.

docker pull gsengun/jmeter3.0:1.7

EXEC

run ile exec Arasındaki fark:
run: yeni bir konteyner başlatacak ve bu yeni konteyner içinde bir işlem gerçekleştirecektir.
exec: zaten çalışmakta olan bir konteyner içinde bir komut yürütecek

-i interaktif terminali
-t ise terminalin attach olması
/bin/bash windows dizinindeki cmd.exe gibi konsolu bash ise “komut dili yorumlayıcısıdır
--user=root terminale root kullanıcısıyla bağlanır

docker exec -it <container_id> /bin/bash
# docker exec -it jenkins bash

Root Yetkisi

Root yetkisi olmadan kurulum yapmamıza müsade etmiyor! Root olarak terminal açmak için --user root argümanı kullanılır.

docker exec — user root -it jenkins bash

Ctrl+p, Ctrl+q

Attach Komutu

Hostun terminaline calisan kabin terminalini baglamak icin kullaniyoruz.

Aşağıdaki ekran çıktısında 5 dakikada 1 ping atıp çıktısını terminale yazan bir kap var. Host makinenin terminalini attach komutuyla kabın terminaline bağlıyoruz (stdIn, stdOut, stdError, monitor ve tüm çevre birimler linux üstünde birer dosyaya denk geldiğinden, dosyaya bağlanmış ve değişimlerde ekrana dosya icerigini yazmis oluyoruz). Her ping atıldığında stdOut dosyasına yazılanlar bizim terminalimizde görünür oluyor.

Attach Mode’dan Çıkmak

Konteynerin konsoluna attach mode ile eklendiğinizde çıkmak için Ctrl+c, Ctrl+Brk denediniz olmadıysa bir de Ctrl+p ve Ctrl+q deneyebilirsiniz.

Debian Linux Container Üstüne NodeJs Kurulumu

  • apt Paket yöneticisi kullanır.

Nodejs için paket listesinin güncellenmesi sağlanır ve ardından nodejs kurulumu istenir.

apt-get update         \
&& apt-get upgrade -y \
&& curl -sL https://deb.nodesource.com/setup_12.x | bash - \
&& apt-get install -y nodejs \
&& node --version \
&& npm --version

Paket kaynakları güncellenir:

.nodesource.com/setup_8.x adresinden çekildiği için node’un 8 sürümü yüklenir.

.nodesource.com/setup_10.x adresinden çekildiğinde node sürümü 10.x.x olacaktır:

Sonuç olarak komut npm’in versiyonunu ekrana yazdıracaktır:

Detaylı anlatım için burası ideal.

Centos Linux Container Üstüne NodeJs Kurulumu

Hem container başlatılacak hemen ardından -i interaktif olarak, -t terminal çalıştırılıp bash ekranında kalınacak.

docker run 
-ti
-dP
--name centos
-v /c/Users:/mnt/Users
centos:latest
/bin/bash

Konteyneri başlat: docker start centos ve terminali standart giriş/çıkış (I/O) konteynera bağlamak için konteyner id bilgisini bulalım:

docker ps -a

Ve konsoluna bağlanalım

docker exec -it <container-id> bash

Şimdide nodejs kuralım:

# Run as root on RHEL, CentOS, CloudLinux or Fedora:
curl -sL https://rpm.nodesource.com/setup | bash -
# Install as Root
yum install -y nodejs

Docker-Compose

Dockerfile sadece bir yansı üretmek için komutları bir araya getirdiğimiz metin dosyasıdır. Konteyner bilgisi içermez. Zaten yukarıdaki grafiğe bakınca göreceğiniz üzere docker-compose.exe ile birden fazla konteyneri yönetebiliriz.

Docker-compose.yml ise bir veya birden fazla konteyneri oluşturup (gerekirse bağlantılı Dockerfile dosyalarını build ederek yansılardan bu konteynerleri oluşturarak) birbirine bağlayabilen, ağ ve disk ayarlarını yaparak, services ile istenilen sayıda konteyneri aynı anda ayaklandırmaya yarayan kompozitördür.

  • Servisleri başlatır, durdurur, tekrar yapılandırır (rebuild)
  • Çalışan servislerin durumlarını görüntüler
  • Çalışan servislerin günlük çıktılarını (log) bir akışa yönlendirir
  • Bir serviste tek seferlik bir komut çalıştırır

https://docs.docker.com/compose/compose-file/#/links

İşleyiş

  1. docker-compose.yml Dosyasında servislerin (servis=konteyner) ayarları yapılır.
  2. docker-compose build ile bu dosya derlenir ve yansılar (image) oluşturulur
  3. docker-compose up ile ayar dosyasında (docker-compose.yml) tanımlı servisler başlatılır
version: "3.x"
services:
webapp-satis:
build:
context: .
dockerfile: musteri.dockerfile
networks:
- extranet-agi
webapp-satin-alma:
build:
context: .
dockerfile: saticilar.dockerfile
networks:
- extranet-agi
mongo-veritabani:
image: mongo
networks:
- intranet-agi
- extranet-agi
networks:
intranet-agi
driver: bridge
extranet-agi
driver: bridge

docker-compose Komutları

(build) Yalnızca yansıları ilk kez veya tekrar yapılandırır, konteynerleri başlatmaz:

$ docker-compose build

Sadece docker-compose.yaml içindeki belirli bir servisi yapılandırmak için:

$ docker-compose build web-musteri

(up) Eğer yansılar yoksa yaratır ve konteynerleri başlatır:

$ docker-compose up

(no-deps) Birden fazla servisin olduğu bir docker-compose.yaml içinde sadece belirli bir servisi “durdurup, yansısını yok edip, tekrar oluşturmasını” sağlar. Bu servisin bağımlı olduğu hizmetleri tekrar oluşturmaz!

$ docker-compose up --no-deps servis_adı

(--build) Gerekmese bile yansılar yaratır ve konteynerleri başlatır:

$ docker-compose up --build

( --no-build) Yansılar yaratmayı es geçer ve konteynerleri başlatır:

$ docker-compose up --no-build

(--no-cache)Yansı yaratırken hızlandırmak için ön bellekleme (caching) yapmaz ve gereken yansıları yeniden çekerek yansıyı yaratır:

$ docker-compose 
build
--no-cache

(-d) Eğer yansılar yoksa yaratır ve konteynerleri detached modda başlatır:

$ docker-compose up -d

(down) Tüm konteynerleri durdurup kaldırır:

$ docker-compose down

(--rmi all --volume) Sadece konteynerleri değil aynı zamanda TÜM (all) YANSIları ve DİSKleri (--volume) kaldırmak için:

$ docker-compose down --rmi all --volume

(stop) Konteynerleri kaldırmak istemiyor ama durdurmak istiyorsanız:

$ docker-compose stop

(ps) Aktif çalışan konteynerleri gösterir:

$ docker-compose ps

(logs) Konteynerlerin günlüklerini görüntüler:

$ docker-compose logs

(start) Durmuş olan konteynerleri başlatmak için:

$ docker-compose start

(rm) Kaldırmak için:

$ docker-compose rm

SERVICE

Service İLE Container Farkı

docker run

Bir yansıdan bir kerede sadece 1 adet konteyner üretmek için docker run komutunu kullanırız.

$ docker run yansı_adı

docker service create

Bir yansıdan bir kerede n adet konteyner üretmek için SWARM/Kubernates/… sayesinde servis yaratırız.

$ docker service create 
--name service-name
--network network-name
--replicas kont_sayısı
image-name

Mesela 5 tane Redis konteyner ayaklandırmak istiyoruz:

docker service create 
--name service1
--network swarm-net
--replicas 5
redis

Orkestrasyon Seçenekleri

Önce ORKESTRASYON Ne Demek?

Bir çalgı topluluğu için yazılmış parçanın notalarını, çalgıların tını farklarını göz önünde tutarak bu topluluğu oluşturan çalgılar arasında paylaştırma sanatı

Docker Restful API

Tıpkı CLI tarafında docker isim fiil şeklinde çalıştığı gibi Restful API olarak da /isim/fiil şeklinde web üzerinden çalışacaktır. API için detaylı bilgi burada.

Docker uzaktan yönetilebilmek için Http RestFul API hizmeti sunar. Nasıl kurulduğunu bu videodan izleyebilirsiniz.

SDK İle Docker

Restful API ile yönetebildiğimiz gibi SDK kullanarak yazılımlarımız üstünden de yönetmemize imkan verilir. SDK’nın kullanılabildiği çok çeşitli dil desteği ve nasıl kullanılabileceğini buradan takip edebiliriz.

Örneğin C# ile yazdığımız uygulama içinden bir docker yansısı yaratmak istersek:

Birleştirelim

Restful API sayesinde orkestrasyon için docker’a HTTP üstünden komutlar verebiliyoruz. Peki bu araçlar nelerdir:

NETWORK

NETWORK 1

Komutlar

Docker network tipleri

$docker network <COMMAND>connect     
Bir kabı (container) bir ağa bağlayın
create
Ağ yaratın
disconnect
Bir kabı (container) ağdan ayırın
inspect
Bir veya daha fazla ağla ilgili ayrıntılı bilgi görüntüleyin
ls
Ağları listeleyin
prune
Kullanılmayan tüm ağları kaldırın
rm
Bir veya daha fazla ağı kaldırın

NETWORK 2

Örnekler

Docker ağları listeleyelim ve tanıyalım

docker network list

Docker kapları içinde programların internet erişimleri varsayılan olarak yalıtılmıştır.

Docker kaplarını özel ağlar oluşturarak gruplayabilirsiniz. Bu özel ağlar sayesinde kaplar birbirleriyle iletişime geçebilirler.

Böylece bilinçli olarak hangi kabın hangi kapla iletişim kurabileceğini de ayarlayabilirsiniz.

Ayrıca PORT bilgilerini dışarıya açabilir böylece kabın dışından erişilebilir hale getirebilirsiniz.

Bridge

Docker kapları host bilgisayar üstünden ağa bağlanır.

ncat/nc İle Aynı Host Üstünde 2 Konteyner Nasıl Konuşur

Öncelikle nc komutunun ne olduğunu öğrenelim:

ncat veya nc, cat komutuna benzer ancak ağ için işlevselliğe sahip bir ağ yardımcı programıdır. Bir ağ üzerinden verileri okumak, yazmak ve yeniden yönlendirmek için genel amaçlı bir CLI aracıdır. Komut dosyalarıyla veya diğer programlarla kullanılabilen güvenilir bir arka uç aracı olacak şekilde tasarlanmıştır.

-l Parametresi listen (dinle) anlamına gelir ve ardından gelen sayısı TCP portu olacak şekilde dinler.

Eğer -u parametresi kullanılırsa UDP portunu dinler

nc -l 1234 Örneği TCP’nin 1234 portunu dinler.

Örneğin 8080 TCP portunu dinleyen sunucu gelen bilgiyi dosyaya yazabilir:
$ ncat -l 8080 > cikti.txt

Dinleyen sunucuya ise diğer istemci bir dosyanın içeriğini gönderebilir:

$ ncat host.docker.internal 8080 --send-only < girdi.txt

NC Sürekli Çalışsın

ncat Eğer istemci bağlantıları biterse otomatik kapanmasın diye -k anahtarı kullanılabilir.

$ ncat -l -k 8080

NC Proxy Gibi Çalışsın

Kabın içinde iki port çalışsın 1111 ve 2222 TCP portları.

$ docker port 838d19d002c
1111/tcp -> 0.0.0.0:1111
2222/tcp -> 0.0.0.0:2222

Gelen istek 1111 portuna düşsün ve ne gelmişse 2222 portuna yönlendirelim.

$ ncat -l 1111 | ncat 2222

Docker Kapları Arasında nc Nasıl Çalışıyor?

Dikkat etmemiz gereken iki docker kabı arasında iletişim kurmak için host.docker.internal kullanılmasıdır. Mac için özel bir ağ durumu olması sebebiyle (örn. Mac için Docker Desktop, kapsayıcılara trafik yönlendiremez ve Mac içinde docker0 diye bir ağ ara yüzünün olmaması vs.) host.docker.internal kullanılıyor. Windows için IP adresi yazılabilir. Örneğin docker içinde bir nginx sunucu ayağa kaldırıyor olsaydık internet gezgini adresi olarak http://host.docker.internal:80 kullanacaktık.

Port Tarayabiliriz (-z)

İster taramasını istediğimiz portları boşluklarla gireriz ister iki port numarası arasındaki tüm değerleri tire işaretiyle (orta çizgi diye bir şey YOK! Türkçemizi yaşatalım lütfen) ayırarak veririz.

$ nc -zv host.docker.internal 1100–2223

Bash Betiğinde nc İle Portun Aktif Olduğunu Anlamak

Ref: *

netcat Paketleri farklı çıktı ürettiği için metine göre betik yazacaksanız çıktıya dikkat etmelisiniz.

netcat-traditional

Başarılı:

# nc -vz 172.17.0.4 5000
172.17.0.4: inverse host lookup failed: Unknown host
(UNKNOWN) [172.17.0.4] 5000 (?) : Connection refused

Başarısız:

# nc -vz 172.17.0.4 5001
172.17.0.4: inverse host lookup failed: Unknown host
(UNKNOWN) [172.17.0.4] 5000 (?) : Connection refused

netcat-openbsd

Başarılı: Connection to 172.17.0.4 5000 port [tcp/*] succeeded!

Başarısız: nc: connect to 172.17.0.4 port 5000 (tcp) failed: Connection refused

-z Argümanı ile portu dinleyen bir process var mı diye denetlenir. Eğer başarılıysa nc komutu başarılı olarak çıkacak (exit status code: 0)

Eğer portu dinleyen bir process yok ise hata kodu 0'dan farklı olarak çıkış yapacak (aşağıdaki örnekte 1 koduyla çıkıyor)

nc -vz hedeMakine hedefPort

Başarısız çıkarsa false döner ve değilini (!) aldıkça 1 milisaniye bekler ve tekrar while içine girer.

Konteyneri Ağa Bağlamak

Önce bir ağ yaratılır:

$ docker network create denetim_agi

Sonra

  • ya kap oluşturulurken --net ayarıyla bağlanacağı ağ bilgisi verilebilir:
$ docker run --net denetim_agi --name cem debian
  • ya da kap oluşturulduktan sonra ağa bağlanılır:
$ docker network connect denetim_agi cem

Nihayetinde konteyner ilk yaratıldığında ön ayarlı olarak bridge ağına bağlı olacak:

Ancak başka bir ağa daha bağladığımızda hem bridge hem de yeni ağda (denetim_agi) IP adresleri alacak:

İki yeni ağ yaratalım (intranet_agi ve extranet_agi) ve bir konteyneri bu ağlara bağlayarak IP adreslerini görelim:

Önce ağları yaratalım:

# docker network create intranet_agi --driver bridgeVarsayılan olarak bridge sürücüsü kullanılır
# docker network create extranet_agi
# docker network ls
NETWORK ID NAME DRIVER SCOPE
b23329488d52 bridge bridge local
f9573f88f225 extranet_agi bridge local
127b8a31537a host host local
1bfd384995f1 intranet_agi bridge local
d47c2d6568bd none null local

Şimdi konteyneri bağlayalım:

# docker run -d --name ornek alpine top -b# docker ps  --format "{{.Names}} \t {{.Networks}}"
ornek bridge
# docker network connect intranet_agi ornek
# docker network connect extranet_agi ornek
# docker ps --format "{{.Names}} \t {{.Networks}}"
ornek extranet_agi,intranet_agi,bridge

Konteyner içinden bakalım:

DOCKER_HOST İle Uzak Sunucuda Docker Komutları Koşturmak

Docker istemcisi DOCKER_HOST ile verilmiş sunucu üstünde işlemlerini çalıştırır. Neticede Docker istemcisi Docker REST API ye komutları HTTP üstünden iletilebilecek şekilde dönüştürür ve uzak sunucunun yanıtına göre sonucu görüntüler.

--

--

Cem Topkaya
Cem Topkaya

Written by Cem Topkaya

Evlat, kardeş, ağabey, eş, baba, müzik sever, öğrenmek ister, paylaşmaya can atar, iyi biri olmaya çalışır, hakkı geçenlerden helallik ister vs.

No responses yet