Docker kısa kısa

Docker Container kodu ve tüm bağımlılıklarını paketleyen standart bir yazılım birimidir, böylece uygulama bir bilgisayar ortamından diğerine taşındığında hızlı ve güvenilir bir şekilde çalışır.
Docker Image bir uygulamayı çalıştırmak için gereken her şeyi içeren hafif, bağımsız, yürütülebilir bir yazılım paketidir: kod, çalışma zamanı, sistem araçları, sistem kitaplıkları ve ayarları

docker pull redis

-a : Stop durumda olan Container’ın tekrar başlatılırken terminal’in (komut satırı input/output’unun) Container’a tekrar attach edilmesinin (bağlanmasının) istendiğini belirtmektedir.(yani çalıştırılan containerdaki terminal, şuan aktif cmdye attach edilir.)
-i interaktif terminali -t ise terminalin attach olmasını istediğimizi belirtir.
Container’ın Bash’inde iken ps -ef komutunu verin ve Container içinde çalışan bütün process’leri listeleyin. Bende oluşan çıktı aşağıda.

docker build . ile oluşturulan images adı ve tagi boş olur. -t repo:tag ile yaratılırken verilebilir.
docker tag a748835505b2 gsengun/myubuntu:0.1 //repo ve tag değiştirilebilir.


Dockerfile yapısı;
INSTRUCTION argümanlar

RUN
Build işlemi sırasında koşturulması gereken komutları belirtmek için kullanılır. Örneğin baz ubuntu Image’ında bulunmayan bir paketin (örneğin ping) oluşturulacak Image’a eklenmesi isteniyorsa RUN apt-get install -y iputils-ping Instruction’ı Dockerfile’a eklenerek Image oluşturulması sırasında Image’a bu paket eklenmiş olur.
ENTRYPOINT 
Çalıştırılabilir bir dosya (executable) gibi kullanılmak üzere bir Image yaratılmasına olanak tanır.
ADD
Oluşturacağımız Image’e Host dosya sisteminden veya internetten yeni bir dosya/klasör eklemek için kullanılır ADD komutu. Aşağıdaki gibi iki formatta kullanılabilir, src (source - kaynak) ve dest (destination - hedef) path’lerde boşluk bulunması ihtimaline karşın ikinci formatın kullanılması daha uygun görünmektedir.

ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
Örnekler:

Host’tan Image’a klasör kopyalanması

ADD [ "./BuildDir/", "/app/bin"]
İnternetten Image’a dosya kopyalanması

ADD [ "https://curl.haxx.se/download/curl-7.50.1.tar.gz", "/tmp/curl.tar.gz" ]
ÖNEMLİ NOT: Host klasörde bulunan ve Image’a kopyalanmak istenmeyen dosyalar .dockerignore dosyasının içinde belirtilebilir. Bu dosya tıplı .gitignore‘a benzemektedir.


COPY
ADD komutu ile aynı şekilde kullanılır fakat İnternetten dosya indiremez sadece Host üzerindeki dosya ve klasörleri kopyalayabilir.


WORKDIR
WORKDIR Instruction’ı kendisinden sonra gelen RUN, CMD, ENTRYPOINT, COPY and ADD Instruction’larını etkiler ve bu Instruction’lar Daemon tarafından koşturulurken relatif olarak kullanılan path’lerin başına bu Instruction’la sağlanan path’i ekler. Bu açıklama komut satırını sıklıkla kullanmamış olan kişilere biraz karmaşık gelmiş olabilir. Bir örnek vererek açıklayalım.

Dockerfile’ımızda aşağıda iki Instruction’ın bulunduğunu düşünelim.

WORKDIR /app/src
ADD [ "./BuildDir/", "binaries/"]
/app/src Container’da WORKDIR olarak belirlendikten sonra ADD Instruction’ı ile Host üzerindeki ./BuildDir/ klasörünün altındaki bütün dosyalar binaries klasörü altına kopyalanmak istenmektedir. WORKDIR olarak /app/src sağlandığı için dosyalar Host’tan /app/src/binaries klasörü altına kopyalanacaklardır.


Docker-Compose
Development (geliştirme), kullanıcı kabul (UAT) ve test ortamlarının kolay bir şekilde yönetilebilmesi için Docker Compose kullanılmaktadır. Docker file bir Container çalıştırma ile ilgiliydi. Günlük olarak kullandığımız veya kullanılmak üzere müşterilerimize sunduğumuz ürünler ve sistemler birden fazla servisin (genellikle web sunucular, uygulama sunucuları, veri tabanı sunucuları, cache sunucuları, message queue sunucuları, vb) bir araya gelmesiyle oluşmaktadırlar. Orta ve büyük ölçekteki sistemleri Docker CLI kullanarak kullanıma sunmak ve bakımını yapmak pek makul değildir. Bu tip sistemlerde Container’ların çalıştırılması, durdurulması, birbirleri ile olan ilişkilerinin belirtilmesi yani basit bir şekilde yönetilebilmesi görevlerini yerine getirecek ayrı bir aracın varlığı gereklidir.
docker-compose.yml dosyasında detayları verilen ve birbirleri ile ilişkileri tanımlanan servisler (Container’lar) tek bir komut ile ayağa kaldırılıp tek bir komut ile durdurulur ve yine tek bir komut ile kaldırılabilirler (silinebilirler).
docker-compose up tüm servisleri ayağa kaldırır.
docker-compose build servicename sadece belli servisi çalıştırır.




FROM hangi docker image'i kullanılacağını belirttiğimiz komut. Bu projemiz build etmek için dotnetcore 2.2 SDK image'ini kullanacağız.
WORKDIR image içerisinde working directory olarak kullanacağımız yeri belirttiğimiz komut. Bu projemizde working directory olarak /app kullanacağız.
COPY proje dosyalarını local file system'dan image'e kopyalamak için kullanılan komuttur. Bizde projemizde ilk olarak csproj dosyasını kopyalayıp restore edeceğiz, sonra bütün bu oluşan dosyaları yeniden kopyalayıp dotnet publish komutu çalıştırarak uygulamamızı oluşturacağız.
ENTRYPOINT container ayağa kaldırılırken ilk olarak çalışacak olan komut ve parametreleri belirttiğimiz komuttur. Container run edilirken dotnet komutuyla HelloDocker.dll'i execute edilecektir.


docker build -t myimg .

docker image ls



Deploying a Container
Image'imizde hazır olduğuna göre son adım olarak bu image'i bir container içerisinde host edip kullanmaya başlayalım. Bunun için kullanmamız gereken en basit şekli aşağıdaki kod satırını çalıştırmak.

Oluşturulan bir imageden birden fazla container oluşturulabilir farklı isimlerde ve aynı anda çalıştırılabilir.

docker start cemtest
docker stop cemtest //containeri durdurur.
docker rm cemtest //containerı siler.
docker stop cemtest2

docker stop cemtest


docker run -p 5123:80 myimg

docker container ls -a


docker container stop stoic_williamson
docker container rm stoic_williamson

docker run --name cemtest --env ASPNETCORE_ENVIRONMENT=Development -p 5250:80 myimg:latest







Bazı Faydalı Docker Komutları
Yüklü olan docker image'lerini listelemeyi sağlayan komut

docker image ls
Image'i silmek için kullanılan komut

docker rmi image_id
Container'ları listelemek için kullanılan komut

docker container ls
Çalışmakta olan bir container'ı stop etmek için kullanılan komut

docker stop container_name
Durmakta olan bir container'ı silmek için kullanılan komut

docker rm container_name


ÖR: redis kurulumu;
docker pull redis
docker run -d -p 6379:6379 --name redis-cemtest redis

docker logs redis-cemtest// log izleme
docker ps //Çalıştığını kontrol edin

docker exec -it redis-cemtest sh //redisi komut satırı üzerinde çalıştırmak için sh geçilir.
redis-cli yazılır ve redis cli çalışır durumda olur.
set name cem
get name
exit



https://hub.docker.com/u/cemelma/

docker login //kullanıcı adı ve şifresi ile login olunur.
docker tag myimg cemelma/test:firsttry
docker push cemelma/test

docker pull cemelma/test:firsttry
docker run -p 5124:80 --name hubtest cemelma/test:firsttry



Tüm containerları silmek
docker container rm $(docker ps -aq)
docker container rm $(docker container ls -aq)


container içerisine girmeden yaratmak.
docker run -i -d ubuntu bash
docker exec -i -t adi


docker commit -a "Cem Elma <cemelma.20@gmail.com>" benim_ubuntum cemelma/benim_ubuntum:latest 
docker push cemelma/benim_ubuntum

huba gönderme:
docker commit -a "CEM ELMA" cemelma/benim_ubuntum:latest cemelma/benim_ubuntum:latest

hubdan çalışır şekilde alma:
docker run -d -i cemelma/benim_ubuntum:latest
docker exec -it containerid bash //bashe geç


docker run --name benim_ubuntum -i -t ubuntu bash

docker start -ia benim_ubuntum //içerisine girer başlatıp








HUB indir;
docker run -d -i cemelma/test:ubuntu
docker ps -a
docker exec -it stoic_liskov bash

apt-get update
apt-get install nano
apt-get install golang
cd /home
mkdir deneme_go_uygulamasi //mv deneme_go_uygulamasi test --isim değiştirme
cd /deneme_go_uygulamasi
touch main.go
nano main.go
//
	package main
	import ("fmt")
	
	func main(){
		fmt.Println("Hello, World")
	}
//

go run main.go
exit
docker ps
docker ps -a
docker stop stoic_liskov
docker start -ai stoic_liskov
docker exec -it stoic_liskov bash
docker stop stoic_liskov
docker commit -a "CEM Elma" stoic_liskov yenirepo:latest
docker images
docker run -d -i yenirepo
docker ps -a //nice_hoover
docker exec -it nice_hoover bash
cd /home/deneme_go_uygulamasi
go run main.go
exit

docker tag yenirepo cemelma/test:ubuntunew
docker push cemelma/test:ubuntunew



docker container rm -f nice_hoover stoic_liskov
docker run -d -i cemelma/test:ubuntunew
docker exec -it objective_dhawan bash

----------------------------------------------------------------------------
docker pull cemelma/test:firsttry
docker run -p 5111:80 --name testweb cemelma/test:firsttry



docker run --name benim_ubuntum -i -d -v C:\Users\celma\Desktop\cwd:/home/test ubuntu
docker exec -it benim_ubuntum bash


docker run -i --rm -v C:\Users\celma\Desktop\cwd:/home/test -w /home/test golang go run main.go

docker inspect golang

//sadece çalışıtrııp kontainer silinir.
docker run -i --rm -v C:\temp\go_app:/home/go_app -w /home/go_app cemelma/test:ubuntunew go run main.go

//çalıştırıp kalır.
docker run --name cem -i -d -v C:\temp\go_app:/home/test cemelma/test:ubuntunew
docker exec -it cem bash
cd /home/test/
go run main.go


docker exec -it -w /home/test/ benim_ubuntum bash  
docker run --name cemubuntu -it -v C:\temp\go_app:/home/go_app -w /home/go_app cemelma/test:ubuntunew bash  



//image kaydetme
docker save -o asd.tar denemecem

//container kaydetme
docker save -o asd.tar denemecem






Docker Machine
//Docker-machine create --driver hyperv --hyperv-virtual-switch HyperVNetwork node1
docker-machine create --driver hyperv --hyperv-virtual-switch HyperVNetwork  --hyperv-memory "4096" --hyperv-cpu-count "1" --hyperv-disk-size "20000" node1
docker-machine ssh node1
Docker-machine env node1
docker-machine regenerate-certs node1
docker-machine restart node1

eval $("C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env node1) //git bash ile çalışır, ve sanal makine içerisinde giriş yapılır.
eval $("C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env -u) //normal dockera dönmek için  kullanılır.

docker volume create portainer_data
docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart always -v \\.\pipe\docker_engine:\\.\pipe\docker_engine -v portainer_data:C:\data portainer/portainer
//machine üzerinden;
docker run -d -p 8000:8000 -p 9000:9000 --name portainerCemPc --restart always -v portainer_data:/data  portainer/portainer


cat /etc/os-release //kurulu olan sistem bilgilerini verir.
uname -r // Linux kernel version