SDTR
Published in

SDTR

Docker Çalışma Notlarım

S.A. Arkadaşlar,

https://devopedia.org/docker

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ı kabaca aşağıdaki gibidir.

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 en baştan yapılmasına ihtiyaç kalmamış olur.

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

container

docker container COMMAND

- Diğer tüm katmanlar container için oluşturulur. Tüm bu yapılar container içerisinde ayağa kalkar. Bu nedenle docker’in beyni dersek sanırım yanlış bir şey 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 bir container 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 yazıp çalıştırma imkanını elde etmiş oluyoruz.

Dockerfile

- Docker’a image oluşturmak için oluşturulan bir metin belgesidir. Kendisine has komutları vardır. Dockerfile ismiyle oluşmadığı takdirde komutlarla birlikte 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-> projenin geliştirme ortamı için 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 containername 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. Health check ile ilgili yazıma buradan erişebilirsiniz.

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 tarafında hatırlayacağımız komutlar ile benzer mantıktadır.

- Docker hub içerisinde sadece 1 private image olabilir, diğerleri public olmalı. Aksi halde ücretli olarak saklamamız gerekmektekdir.

Bazı ilişkili notlar:

- jenkins: (Continous Integration) Yazılım geliştirme, oluşturma gibi işlemleri otomatize eden açık kaynaklı bir araçtır. Docker üzerinde çok kararlı bir şekilde çalışmayabilir. En azından bu konuda bazı hatalar alabileceğinizi hatırlatmak isterim.

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

- portainer: Docker için oluşturulan bir 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/

Originally published at https://malikmasis.blogspot.com.

--

--

--

Yetenekli ve bilgili geliştiricilerden oluşan bir topluluk!

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Malik Masis

Malik Masis

Muslim, father, developer malikmasis.blogspot.com.tr

More from Medium

Docker/Container Introduction

How Browsers Verify Digital Certificates — Part 2

Implementing CI/CD with GitLab CI and Docker

How to make a project into gitlab and upload your existing code into gitlab