Docker Komutları
- 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.
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
> ssh bağlantısı kurmak için
- ssh <kullanıcıAdı@IP_adresi>
- 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
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}}"
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 .
-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 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
- Hostun diskini Dockerla paylaşmak
- 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)
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
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:
Şimdi web browserımız üstünden 82 portuna istek yapabiliriz:
Kullanıcı adı ve şifre soracak.
Kullanıcı adı: admin
Şifre: boş bırakıp enter ile geçelim
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
image ls, filter, aq
YANSILARI LİSTELEMEK
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
Şimdi bir docker imajını silmek için iki komutu da görelim:
Bir de docker image rm <IMAGE ID>
ile silelim:
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
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:
Ş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 --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
pull
YANSI İNDİRMEK
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
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
- 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
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.
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.
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
Ç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:
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
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.
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ş
- docker-compose.yml Dosyasında servislerin (servis=konteyner) ayarları yapılır.
- docker-compose build ile bu dosya derlenir ve yansılar (image) oluşturulur
- 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-agiwebapp-satin-alma:
build:
context: .
dockerfile: saticilar.dockerfile
networks:
- extranet-agimongo-veritabani:
image: mongo
networks:
- intranet-agi
- extranet-aginetworks:
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:
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:
(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ıncreate
Ağ yaratındisconnect
Bir kabı (container) ağdan ayırıninspect
Bir veya daha fazla ağla ilgili ayrıntılı bilgi görüntüleyinls
Ağları listeleyinprune
Kullanılmayan tüm ağları kaldırınrm
Bir veya daha fazla ağı kaldırın
NETWORK 2
Örnekler
Docker ağları listeleyelim ve tanıyalım
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
veyanc
,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.