5 Temmuz 2021 Pazartesi

Docker Çalışma Notlarım

     S.A. Arkadaşlar,

     Son dönemlerde docker üzerinde çalışmalar yapıyorum. Üzerinde çalıştığım açık kaynak projesini docker'a taşırken, bu süreçte izlediğim eğitimleri, edindiğim notları paylaşmak istedim. Bu süreçte yardımlarını esirgemeyen Akif'e de teşekkürlerimi iletirim. Yararlandığım kaynakları aşağıda ayrıca paylaşacağım.

     Docker'in temel kullanımını kabaca aşağıdaki gibidir.

Usage: docker [OPTIONS] COMMAND [ARG...]

      image

 docker image COMMAND

- Dockerfile'daki talimatlara göre statik yapıda oluşan dosyadır.

- Her image bir base image'den türemek zorundadır. Her nesne bir nesneden oluşmalıdır gibi düşünebiliriz.

- İmage'ler katmanlı yapıya sahip olabilirler. Bu da belirli yerel değişiklikler yapma imkanını kolaylaştırır. Ayrıca cachleme işlemi yaparak build işlemlerini hızlandırır.

- Komutlar : ls, rm, build, prune gibi komutları bulunmaktadır.


     container

 docker container COMMAND

- Diğer tüm katmanlar container için oluşturulur. Diğer tüm yapılar container içerisinde ayağa kalkar. Bu nedenle docker'in beyni dersek sanırım yanlış söylemiş olmayız.

- Bir image çalıştırmak için ortam bağımsız bir pakettir.

- Sanal makine mantığına benzer. Kendine has bileşenleri var, bu şekilde bağımsız bir ortam oluşturur.

Komutlar: rm , exec, stop, kill, logs, start gibi komutları bulunmaktadır.

- docker run -d --name c_containername -p 8080:80 imagename  ile oluşturmaya başlayabiliriz.

- (-d) detach komutu ile container ayakta kalmaya devam ederken diğer işlemlerimize devam edebilmemize olanak sağlar.

-(-p) dış port ile iç portu birbirine bağlayarak birbirleriyle konuşmasına olanak sağlar.

- --name ile container isim verebiliyoruz.

- Sanal makinelere ssh ile bağlanabiliriz. Bunu ortama göre aşağıdaki komut ile yapabiliriz.

- docker container exec -it containername bash/ps

- (it) Komutlar karşılıklı konuşabilmeli anlamına gelir. (interactive)

- exec ile istediğimiz komutu bu container içerisnde yazabilme imkanını elde ediyoruz.


     Dockerfile

- Docker'a image oluşturmak için oluşturulan bir metin belgesidir. Kendisine has komutları vardır. Dockerfile ismiyle oluşmadığı takdirde komutlarda parametre ile göndermek zorundayız.

- Her satır bir image katmanıdır.

   dotnet core projesinden örnek bir Dockerfile

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /app
EXPOSE 80

COPY src/Microservices/Auth/TelephoneDirectory.Auth/*.csproj src/Microservices/Auth/TelephoneDirectory.Auth/
COPY src/Microservices/Auth/TelephoneDirectory.Auth.Entities/*.csproj src/Microservices/Auth/TelephoneDirectory.Auth.Entities/

RUN dotnet restore src/Microservices/Auth/TelephoneDirectory.Auth/*.csproj
COPY . .
RUN dotnet publish src/Microservices/Auth/TelephoneDirectory.Auth/*.csproj -c Release -o out

FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS runtime
WORKDIR /app
COPY --from=build /app/out .
ENTRYPOINT ["dotnet", "TelephoneDirectory.Auth.dll"]

   Komutlar:

   From-> indirilecek image

   workdir -> inen image çalışma klasörünü belirtilir.

   run dotnet restore -> eksik paketleri tamamlar.

   copy . ./ -> kaynaktan dosyaları hedefe kopyalar.

  entrypoint -> container'i ayağa kaldırmak için son komut


      compose

 docker compose COMMAND

- Kompleks uygulamaların çalıştırılmasını sağlayan docker aracıdır. Birden fazla cotainer'i tek bir dosyada toplayarrak uygulamanın ihtiyaç duyduğu tüm gereksinimlerle birlikte ayağa kaldırır.

- Tümüyle bir ortam olarak ayağa kaldırabiliyoruz.

     Aynı projeden kısaltılmış bir compose örneği

version: "3.8"
services: 
    authdb:
        image: mcr.microsoft.com/mssql/server:2019-latest
	
	auth.api:
        image: auth_image
        build: 
            context: .
            dockerfile: src/Microservices/Auth/TelephoneDirectory.Auth/Dockerfile
volumes: 
    authdb_volume: 

- docker run -d -p 8080:80 -name c_container imagename ile aynı işlemi yapmasına rağmen çoklu image yönetiminde işimizi kolaylaştırmaktadır.

- Komutlar: build, up, down, kill, logs, ls, port gibi komutları bulunmaktadır.   


     network

docker network COMMAND

- container'lerin sanal bir makine gibi çalışmasını sağlayan bir sanal network yapısıdır.

- Normalde container'ler izoledir, fakat bunları aynı ağda çalışıyor gibi ayarlayabiliyoruz.

- Bir container'i birden fazla network'e ekleyebiliyoruz.

- Host network: normal bir container'in docker engine ile haberleşmesini sağlar.

- Komutlar: connect, disconnect,inspect, ls, create, prune, rm gibi komutları bulunmaktadır.

- docker run -d -p 8080:80 --name containername --network networkname imagename şekilde kullanılabilir.


    volume/storage

- Verilerin kalıcılığı ile ilgili bileşenlerdir. Verileri harici olarak tutabilmekteyiz.

- Storage genel adıdır. Bu yöntemlerden biri volume iken diğeri ise mount yöntemidir.

- Volume bu işleri otomatik yaparken mount ile bazılarını manual olarak yönetmek zorundayız.

- v containerDışı: containerİçi veya -v volumename gibi kullanımı mevcuttur.

- Komutlar: create, inspect, ls, prune ve rm komutları bulunmaktadır.


     swarm 

docker swarm COMMAND

- Farklı sunucularda docker uygulamalarının yönetilmesini sağlar. Kubernates'in alternatifi olarak ele alabiliriz. Docker içerisinde geldiği için öğrenimi daha kolaydır. Başlangıçta inactive gelir. Bunu docker swarm init ile aktif hale getirmemiz gerekecektir.

- Raft konsensus birden çok sunucunun bir değer hakkındaki son kararıdır.

- X sayıda manager Y sayıda worker yönetebilir. Manager çalışmazsa diğer manager onun worker'lerini yönetir. (manager'lerin %50den fazla çalışması gerekmektedir. Aksi halde swarm bunu handle edemeyecektir.)

- Permisson ve port ayarlamalarına dikkat etmekte fayda var.

- Komutlar: init, join, leave gibi komutları bulunmaktadır.

- docker swarm join --token SWMTKN--- IP -> bu şekilde istenilen worker eklenebilir.

- Image ve container'leri swarm'de görebilmek için docker service komutu ile devam edilmeli.


     stack 

docker stack [OPTIONS] COMMAND

 - Swarm'ın production ortamında yönetilmesini kolaylaştıran bir yapıdır. 

- Komutlar: deploy, ls, rm, ps ve services komutları bulunmaktadır.


     secret

docker secret COMMAND

- Gizli bilgi ve şifreleri yönetir.

- swarm'ın bir özelliğidir, bu yüzden swarm aktif olmalıdır. 

- Komutlar: create, inspect, ls ve rm komutları bulunmaktadır.

- echo "This is a secret" | docker secret create my_secret_data - 

- docker service  create --name redis --secret my_secret_data redis:alpine

- Üst satırdaki gibi tanımlanır ve alt satırdaki gibi kullanılabilir.


    health check

- Container ya da uygulamaların sağlıklı bir şekilde çalışıp çalışmamasıyla ilgilidir.

- Healthy -> Http status 200-300 ve UnHealthy-> 400 - 500 değerleriyle ilişkilendirilir.

    

     pull/push

docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker push [OPTIONS] NAME[:TAG]

  - Bir tane image alıp üzerine değişikler yapılabilir veya sıfırdan bir tane oluşturulup push edilebilir. Git üzerinden hatırlayacağımız komutlar ile benzer mantıktadır.

- Docker hub üzerinde sadece 1 private image olabilir, diğerleri public olmalı. Aksi halde ücretli olarak saklamamız gerekmektedir.

 

Bazı ilişkili notlar:

jenkins: CI (Continous Integration) Yazılım geliştirme oluşturma gibi işlemleri otomatize eden bir araçtır. Docker üzerinde çok kararlı bir şekilde çalışmadığını hatırlatmak isterim.

docker hub: Image havuzu olarak adlandırabilir. Github gibi düşünebilirsiniz.

 - portainer: Docker için web arayüzü sunmaktadır. 


     Uzun süredir okuyup derlediğim notlar bu şekildedir. Umarım faydası dokunur. Her daim güncel kalmak dileğiyle.


Kaynakça

Resmi Kaynak

Tech Buddy

https://deniz-turkmen.medium.com/

https://serkanbingoll.medium.com/

Hiç yorum yok:

Yorum Gönder