Docker etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Docker etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Docker Apache Virtual Host

 Docker Apache Virtual Host Yapımı

Docker virtual host tanımalama yapıyoruz.

ilk önce local bilgisayarımızda hosts dosyasına çağırmak istedğimiz sanal alan adlarımızı tanımlıyoruz.
Burda dikkat etmek gereken durum docker içinde değil local bilgisayarımızda tanımlamamız gerekiyor.

windows için hosts dosya adresi: "c:\Windows\System32\Drivers\etc\hosts"
macos için hosts dosya adresi :"/etc/hosts" veya "/private/etc/hosts" 
ubuntu için hosts dosya adresi :"/etc/hosts"

hosts tanımlanacak domainler:
127.0.0.1 site.prod
127.0.0.1 site.test

Dockerfile 'ımızın içinde php:8.2.0-apache image kendimize göre özelleştirdik.

site.prod.conf ve site.test.conf adında iki tane config dosyası oluşturuyoruz. config dosyalarımızda apache içerisinde bakacağı klasörleri belirtiyoruz.
Bunlar container ayağa kalkerken otomatik olarak kopyalanacaktır. Kopyalama işlemi Dockerfile içinde yapılmaktadır. 

docker-compose.yml dosyamızın içinde volumes oluşturarak local pc de bulunan www klasörünü container içine kopyalıyoruz. buradaki klasörler config de tanımladığımız klasörlerdir.

githubdan indirdiğimiz proje klasörünün içinde terminali açarak aşağıdaki komutu çalıştırıyoruz ve container ayağa kaldırıyoruz.

>    docker-compose up -d

daha sonra tanımış olduğumuz site.test "var/www/html/test" ve site.prod "var/www/html/prod"  adreslerine erişmek istedğimizde ilgili klasörün altındaki projeler açılacaktır.

url de açarken http:// isteği ile açılmasına dikkat edin.


github linki:    https://github.com/hkmsmart/Docker-Apache2-Php-Virtual-Host

Docker HealthCheck

Docker HealthCheck 



docker üzerinde çalışan bir container veya container içerisindeki çalışan uygulamanın sağlıklı bir şekilde çalışıp çalışmadığını kontrol edebilmek için kullanılır.

healthy http status code      200-300
unHealthy http status         400-500

Http status codes
100-199 bilgilendirme
200-299 başarılı sonuç
300-399 yönlendirme
400-499 istemci hatası
500-599 sunucu hatası

HealthCheck parametreleri:
--health-cmd "curl -f http://localhost || exit 1" => curl gidicek http üzerinde çalışan kontainer kendi üzerinde istek yapıcak, exit 1 gelen http koduna göre cıkıcak

--health-interval 5s => her 5 saniyede bir localhostu çağırsın.

--health-timeout 3s => 3 saniye içinde cevap vermezse bu işlemi sonlandırıcak.

--health-retries 3 => hata alırsam kaç kere deniyyim 

--health-start-period 6s => contanier ayağa kalktıktan sonra 6 saniye sonra istek atmaya başlasın

kullanım örneği:

>    docker run -d -p 80:80 --name c_nginx --health-cmd "curl -f http://localhost || exit 1" --health-interval 5s --health-timeout 3s --health-retries 3 --health-start-period 6s nginx


daha sonra docker ps yaparak çalışan container'larımızı listelediğimizde status kısmında çalışma zamanı ve healthcheck durumu yazdığını görürüz "STATUS Up 8 seconds (healthy)"

>    docker ps


Dockerfile ile kullanımı

dockerfile dosya içeriği:

FROM nginx:latest
RUN apt-get update &&apt-get install -y curl
HEALTHCHECK --interval=3s --timeout=3s CMD curl -f http://localhost || exit 1
EXPOSE 80


docker file bulundugu dosya klasörüne giderek cmd aşağıdaki kodu çalıştırarak image oluşturuyoruz ve daha sonra run komutu ile ayağa kaldırıyoruz


>    docker build -t nginx:1 .

>    docker run -d -p 80:80 --name c_nginx nginx:1


docker-compose.yml  ile kullanımı

version: '3.1'
services:
s_nginx:
container_name: c_nginx
image: nginx:latest
ports:
- 80:80
healthcheck:
test: ["CMD","curl","-f","http://localhost"]
interval: 5s
timeout: 10s
retries: 3
start_period:
10s


container'ımızı ayağa kaldırmak için docker-compose.yml dosyamızınız bulunduğu klasörü cmd açarak aşağıdaki kodu çalıştırıyoruz.

>    docker-compose up -d

Docker Portainer

 Docker Portainer

 Portainer, konteynerleri, servisleri, ağları ve depoları yönetmek için kullanılır. Kendiside bir container olarak kurulumunu yaptığımızda container içinden dış taraftaki docker engine erişerek işlemlerimizi gerçekleştirebiliriz. web tarayıcısında çalışır ve birden fazla Docker bağlantısını destekler. Ara yüz olduğu için kullanımı basittir, container ayağa kaldırdıktan sonra inceleyebilirsiniz.

docker-compose.yml üzerinden kurulumu,
9000 portundan bize yönetmemiz için bir web portal ekranı sunar ilk açılışta kullanıcı adı ve şifremizi oluşturuyoruz.
/var/run/docker.sock:/var/run/docker.sock    container içinden dış docker engine erişmek için kullanıyoruz.

dosya içeriği:
version: '3.1'
services:
  s_portainer:
    container_name: c_portainer
    image: portainer/portainer-ce
    ports:
      - 9000:9000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - C:\docker-containers\docker_portainer\data:/data

containerı ayağa kaldırmak için dosyanın bulundugu dizine komut satırından giderek aşağıdaki kodu çalıştırıyoruz.

>    docker-compose up -d

Docker Swarm Stack

Docker Swarm, Stack

Docker tarafından sunulan bir konteyner yönetim ve orkestrasyon aracıdır. Swarm, birden fazla Docker konteynerını yönetmek ve düzenlemek için kullanılır. Swarm, Docker konteynerlarına yüksek kullanılabilirlik, yük dengeleme, çoğaltma ve yeniden başlatma yetenekleri ekler.
Swarm master ve worker adı verilen makinelerin oluşturduğu bir ağdır "cluster"
raft consensus group ,internal distributed state store :masterların birbirine bağlı olduğu anlık makine durumlarını gösteren saklayan yapı.

docker swarm enable etmek için aşağıdaki komutu kullanıyoruz. ip döner.


>    docker swarm init

master nodu belirmek için aşağıdaki kodu kulanıyoruz.

-- listen-addr     node gelen istekleri dinlemek için


>    docker swarm init --advertise-addr ip_adresi -- listen-addr ip_adresi


yeni bir master node belirtmek istediğimizde container'a bağlanıp aşağıdaki kodu çalıştırıyoruz.


>    docker swarm join-token manager


yeni bir bir worker eklemek istiyorsak aşaıdaki kodu çalıştırıcağız.


>    docker swarm join-token worker


swarm altında docker containerları görmek için artık service komutuyla ayağa kaldıracağız.

replicas 1 : birden fazla kurmasını istiyorsak .

>    docker service create --name s_nginx --replicas 1 nginx

veya 

>    docker service create --name s_nginx -p 80:80 --replicas 3 nginx


altındaki çalışan container durumunu gösterir.


>    docker service ps s_nginx


eşitlik algoritması oldugu için 2. makine varsa  2. makinede kuracaktır.


>docker service scale s_nginx=2


servisleri kaldırmak için kullanılır.


>    docker service rm s_nginx


 node ile ilgili bilgilerini görmek için kullanılır


>    docker node


worker olan bir node manager olarak güncellemek için aşağıdaki kodu kullanılır.


>    docker node promote node_ismi


node durdurup başlatmak ve sonlandırmak istediğimizde kulnacağımız komutlar.

active    aktifleştirir

pause    durdurur

drain    sonlandırır

>    docker node update avability pause node_ismi


Docker Stack

Docker stack aslında docker swarm’ın production tarafında daha yönetilebilir bir şekilde işlemesi için ,bir konfigürasyon dosyası üzerinden kurgulandığı ve yönetildiği bir yapıdır. Ya da başka bir tanımlama ile docker compose dosyası ile docker swarmın tek elden yönetilmesini sağlamaktır.

yml dosyasında deploy için parametreler girilmiştir.

yml dosyamızı kaydettikten sonra, dosyamızın bulundugu dizine giderek aşağıdaki komutu çalıştırıyoruz ve stack servislerimiz ayağa kalkıyor.

>    docker stack deploy -c docker-compose.yml s_wordpress


docker-compose.yml dosya içeriği:

version: '3.1'
services:
s_wordpress:
image: wordpress
ports:
- 80:80
environment:
WORDPRESS_DB_HOST: s_db:3306
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: 12345
WORDPRESS_DB_NAME: wordpress_db
volumes:
- C:\docker_stack_wordpress\wordpress_data:/var/www/html

restart: always

deploy:
replicas: 1 # 2 ikitane replicae oluştur
restart_policy: #yeniden başlatma kuralı
max_attempts: 3 # 3 kere dene max
condition: on-failure # hata oldugunda dene
placement:
constraints:
- node.role == manager
s_db:
image: mysql:5.7
environment:
MYSQL_DATABASE: wordpress_db
MYSQL_USER: root
MYSQL_PASSWORD: 12345
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- C:\docker_stack_wordpress\mysql_data:/var/lib/mysql
ports:
- 3307:3306

deploy:
replicas: 1
restart_policy: #yeniden başlatma kuralı
condition: on-failure # hata oldugunda dene
placement:
constraints:
- node.role == manager

Docker Secret

 Docker Secret


Docker üzerinde kullanılan hassas bilgilerin saklanabilmesi ve yönetilebilmesi için geliştirilmiş docker özelliğidir. Parolalar sunucu veri tabanı bilgileri saklanması için kullanılır.
Secret oluşturduğumuzda container ayağa kalkarken memory "hafıza" de saklanan bir bilgi otomatik olarak geliyor. Sabit bir klasöre hedeflenmiş oluyor.

secret'lerı listelemek için kullanılan kod

>    docker secret ls 

secret oluşturma
echo nun tırnak içinde bulunan veri bizim şifreleyeceğimiz değerdir.
sec_test şifrelediğimiz değerin anahtarıdır.

>    echo "secret test icerik" | docker secret create sec_test -

örnek olarak bir container ayağa kaldıralım ve içine secret keyimizi de ekleyelim.

>    docker service create -d -p 80:80 --name s_nginx --secret sec_test

oluşturduğumuz container içine exec yaparak giriyoruz.

>    docker exec -ti  s_nginx 

daha sonra container işletim sistemimizin içinde verdiğimiz secret key bulunduğu klasörde görebiliriz.

>    cat /run/secrets/sec_test

docker-compose.yml dosyamızdan da aşağıdaki şekilde şifreyi farklı bir klasörden çekerek de kullanabiliriz.

secrets:
  sec_db_pass:
    external: true
    file: C:\docker\db_pass.txt


Docker hub.docker.com Pull Push

 Docker Kod Notları 3
hub.docker.com pull push 

github gibi projelerimizin versionlarını kontrol etmemize yarayan docker içinde bulunun ve bulut da saklanan bir version yönetme aracı vardır.

https://hub.docker.com/ sitesinden aramak isteğimiz image ları bulup , bunları kendi projemize göre özelleştirip kendi repo alanımız içinde versiyonlarını tutup yayınlayabiliriz.
private  "özel" olarak 1 proje saklama hakkı vermektedir. ektra için ücret ödemek gerekmektedir.
public   "açık" olarak sınırız repo saklama hakkı vardır.

örnek bir dockerfile dosyası oluşturuyoruz ve basit bir image oluşturuyoruz.

dockerfile içeriği:
FROM alpine
RUN echo "pull push test image" >hkm.txt
CMD cat hkm.txt

-t     image ait bir tag vermek için kullanılır
dosyanın bulunduğu klasörde komut satırını açarak image oluşturuyoruz ve testapp etiketi veriyoruz. daha sonra bu tag ile push pull işlemi yapacağız.

>    docker image build -t testapp .


tagımıza bir versiyon veriyoruz ve hub.dockerda kayıtlı olan kullanıcı adımızı yazdıktan sonra image adını yazarak repomuzu belli ediyoruz.

>    docker tag testapp:latest hkmsmart/testapp

Belirlediğimiz repoyu push ediyoruz.

>    docker push hkmsmart/testapp

not: repoyu silmek istiyorsak hub.docker giriyoruz, ilgili repomuzun içine girdikten sonra setting bölümünden delete buttonuna tıklayarak silebiliriz.

Pull etme işlemi

hub.docker gönderdiğimiz image çağırıyoruz.
İmage pull etmek istiyorsak gönderdiğimiz repo ve tag adını kullanarak pull edebiliriz. bir compose  yml üzerinden gösterelim.

bir tane docker-compose.yml dosyası oluşturuyoruz.
docker-compose.yml içeriği:
version: '3.1'
services:
  s_testapp:
    image: hkmsmart/testapp
    build:
      context: .

yml dosyamızın bulunduğu klasörün içinde komut satırı açarak containerımız çalıştırıyoruz.

>    docker-compose up -d