Docker Laravel Compose

 Docker Laravel Composer  Nginx PHP8 Postgresql pgAdmin


github üzerinde bulunan projemizi indiriyoruz.

https://github.com/hkmsmart/Docker-Laravel

projemizin ana klasörüne girip laravel'i src klasörünün içine kuruyoruz. 
"src klasöründe text.txt varsa siliniz"

>    composer create-project laravel/laravel src

daha sonra docker container 'ımızı ayağa kaldırıyoruz.

>    docker-compose up -d


docker container kurulup ayağa kalktıktan sonra localhost yazıp projemizi açabiliriz.


Ek Bilgiler:
DockerFile içinde php8.2 ve composer kurulumu için komutlar bulunmaktadır.
php laravel için kullanacağımız temel extension lar yine dockerfile içinde bulunmaktadır.

Nginx url yönlendirme komutlarıda default.conf dosyasında bulunmaktadır.


Docker PHP8 MYSQL8 PhpMyAdmin

 


Klasorler oluşması için text.txt dosyası eklenmiştir, containerı ayağa kaldırmadan önce siliniz.

Github üzerinden projeyi indiriyoruz ve docker compose ayağa kaldırıyoruz.

github linki :https://github.com/hkmsmart/Docker-PHP8-MYSQL8-PhpMyAdmin

>    docker-compose up -d

Docker SuiteCRM8 Compose

 Docker SuiteCRM8 Compose


Github üzerinden docker projemizi indiriyoruz.

suitecrm8 versionumuzu aşağıdaki adresten indiriyoruz.

-    https://suitecrm.com/download/

Suitecrm projemizi docker projemiz içinde bulunan www klasörünün içine kopyalıyoruz.

kopyalama işlemi bittikten sonra docker-compose.yml klasörümüzü terminalde açıyoruz ve container ayağa kaldırıyoruz.

>    docker-compose up -d


contanier ayağa kalktıktan sonra localhost ile projemizin kurulumunu gerçekleştirebiliriz.

-    http://localhost/public/install.php

kurulum sayfasına geçip kurulumunuzu yapabilirsiniz.


Notlar:

suitecrm8 için gerekli php kütüphaneleri  "extension" dockerfile içinde indirilmektedir.

suitecrm8 için gerekli dosya yetkileri "permissions" dockerfile içinde tanımlanmıştır.

php.ini içinde bulunan gerekli kütüphaneler "extension" açılmıştır.



Docker PHP8 Xdebug PhpStorm


 Docker PHP8 MYSQL8 PhpMyAdmin Phpstorm


Github üzerinden projeyi indiriyoruz ve docker compose ayağa kaldırıyoruz.

github linki :https://github.com/hkmsmart/Docker-PHP8-XDEBUG


>    docker-compose up -d


İndirdikten sonra docker projemizin içinde bulunan www klasörünü phpstorm ile açalım.

Üst menüden edit configurations tıklayıp ilk önce docker-compose.yml dosyamızı ekliyoruz.

daha sonra phpxdebug ayarlarımızı ve server yolumuzu tanımlıyoruz.

En son bölümde xdebug için php.ini ye eklediğimiz tanımlar ve dockerfile da xdebug indirmemiz için gerekli kodlar bulunmaktadır. Bunları yapmanıza gerek yoktur. Github projesinde hazırdır. Sadece phpstorm tanımlamalarını yapınız.


1)    Phpstorm edit configurations 













2)    Docker Compose tanımlıyoruz














3)    Tekrardan edit configurations açıp Xdebug ekliyoruz. 

server için 3.1 alt resimdeki gibi localhost olarak tanımlıyoruz.













3.1)     Dosya yolu tanımı ve Server tanımı




Dockerfile xdebug indirmek için tanım kodu:

RUN pecl install xdebug-3.3.2 && docker-php-ext-enable xdebug


Php.ini Tanımları

[XDebug]

zend_extension = xdebug.so

xdebug.profiler_append = 0

xdebug.profiler_enable = 0

xdebug.remote_enable = 1

xdebug.remote_handler = "dbgp"

xdebug.remote_host = "127.0.0.1"

xdebug.idekey = "PHPSTORM"

xdebug.mode=develop,debug

xdebug.start_with_request=yes

xdebug.discover_client_host=0

xdebug.client_host=host.docker.internal

Docker Redis Ve RabbitMQ

Docker üzerine redis ve rabbitmq kurarak portlarını ve volumeslarını ayarlayarak çalıştıracağız.
projeyi github üzerinden indirip aşağıdaki kodu yazarak çalıştırabilirsiniz.


>    docker-compose up -d


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

version  - Bu, Docker Compose dosya biçiminin sürümüdür. 3.7 sürümünü kullanıyoruz.

services  - Bu, kapsayıcıların listesini ve ayarlarını tanımladığımız bölümdür. Bizim durumumuzda, bir hizmet tanımlıyoruz 

redis  - Bu, hizmetimizin adıdır.

rabbitmq  - Bu, hizmetimizin adıdır.

image  - Bu, kapsayıcımızı oluşturmak için kullanacağımız Redis ve Rabbitmq görüntüsünün adıdır.

restart  - Bu, Docker'a, durması veya arızalanması durumunda servis kapsayıcısını yeniden başlatmasını söyleyen bir ayardır.

ports  - Bu, kapsayıcının hangi bağlantı noktalarının ana sistemde erişilebilir olması gerektiğini tanımlayan bir ayardır. 

volumes  - Bu, ana sistemdeki hangi dizinlerin kapsayıcı içinde erişilebilir olması gerektiğini tanımlayan bir ayardır. 

environment  - Bu kapsayıcısı için ortam değişkenlerini tanımlamamızı sağlayan bir ayardır. 

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


Serialize ve Unserialize PHP

Serialize ve Unserialize  PHP

serialize — bir array  verisinin saklanabilir olarak string'e çevirip verir.

unserialize — serialize olmuş bir değeri tekrar eski array türüne çevirmek için kullanılır.

<?php
$data = serialize(array("Red", "Green", "Blue"));

echo $data . "<br>";
#a:3:{i:0;s:3:"Red";i:1;s:5:"Green";i:2;s:4:"Blue";}
$test = unserialize($data);
var_dump($test);
#array(3) { [0]=> string(3) "Red" [1]=> string(5) "Green"
# [2]=> string(4) "Blue" }
?>

Örnek Exception Throw PHP

 PHP Örnek Exception Throw 


Php ile örnek throw komutu ,Exception sınıfını miras alarak istediğimiz hata sınıfı oluşturabilir ve catch blogu içerisinde bu hataları daha detaylı gösterebilir ve özelleştirebiliriz. 

<?php
class customException extends Exception{ }

class fruit
{
public function test()
{
if ('a' == 'b') {
throw new customException("error: denk değildir");
} else {
return true;
}
}
}

try {
$a = new fruit();
echo $a->test();
}
catch (customException $e){
print_r($e->getMessage());
}

SoapClient WSA Action To Hatası Çözümü PHP

Php SoapClient WSA Action To Hatası

Hata mesajı:
errors:

1) The message with To '' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher.  Check that the sender and receiver's EndpointAddresses agree.

2) The SOAP action specified on the message, '', does not match the HTTP SOAP Action, 'http://tempuri.org/SoapService/login'

Php ile bir başka servise soap isteği atıldığında aşağıdaki gibi bir hata alınıyor ise soap header da action ve to parametreleri eklenerek soap servisin yollu belirtilmelidir. daha sonra soap servis methoduna istek atıldığında headerBody de birleştirilip gönderilmeldir.


<?php
ini_set("soap.wsdl_cache_enabled","0");
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);


$url = 'http://test.com/SoapService.svc?wsdl';//change
$client = new SoapClient($url,array('soap_version' => SOAP_1_2,
'trace' => 1,'exceptions'=> false));

$wsa_namespace = 'http://www.w3.org/2005/08/addressing';
$NS_ADDR = 'http://www.w3.org/2005/08/addressing';
$ACTION_ISSUE = 'http://tempuri.org/SoapService/login';//change
$ACTION_ADDR = 'http://test.com/SoapService.svc';//change

$action = new SoapHeader($NS_ADDR, 'Action', $ACTION_ISSUE, true);
$to = new SoapHeader($NS_ADDR, 'To', $ACTION_ADDR, false);

$headerbody = array('Action' => $action,'To' => $to);
$client->__setSoapHeaders($headerbody);

$parameters = array('username'=>'abc','password'=>'123');//change
$result = $client->__soapCall('login',$parameters);//change

echo '<pre>';print_r($result);exit();


soapUI 

ilgili method açılarak  alt menuden WS-A menusu açılır ve görseldeki görüntü gelir.

action ve to daki alanlar soap servisin url ile doldurulur.

action: http://tempuri.org/SoapService/login

to: soap-servis-url/SoapService.svc




Apache2 htaccess İle Tüm istekleri index.php Yönlendirme

 Apache2 ile Tüm istekleri index.php Yönlendirme .htaccess


Apache de mod_write aktif değil ise aktifleştirmemiz gerekiyor.

aşağıdaki kod ile etkinleştirip apache yeniden başlatıyoruz.


>    sudo a2enmod rewrite

>    sudo service apache2 restart


daha sonra .htaccess den tüm istekleri index.php yönlendirmek için 

aşağıdaki kodu .htaccess dosyasına kaydetelim. 


dosya adı: .htaccess

dosya içeriği:

RewriteEngine on

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ index.php [L,QSA]

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


Docker-Compose, Networks, Volumes

 Docker Kod Notları 2

docker-compose, network, volumes

Docker Compose: image' ler dan oluşturduğumuz container'ları, servisleri tanımını tek bir dosyada yaparak ayağa kaldırmamızı sağlar. Aynı zamanda bir ağ bağlantısı köprüsü oluşturarak birden fazla container aynı ağda konuşturup iletişim sağlaması ve bir çok farklı özellikler ile tek bir dosyada yönetmemizi sağlar.

docker compose komutları docker-compose.yml dosyalarında tutulur ve bu dosyanın bulunduğu klasörde komut satırına girilerek çalıştırılır.

yml dosya uzantısı özelliği kolay okunaklı olduğu ve anahtar değer şeklinde değerler yazıldığı için kullanımı oldukça kolaydır.

önemli docker-compose.yml dosyasında girdiğimiz değerler 2 boşluk ve alt değerlerde 2 boşluk altında girilmelidir, bu düzen dikkat edilmez ise söz dizimi hatası verecektir.

version    kullanacağımız docker versionu belirtilir
services   çalışıcak uygulamayı belirtilir.
ports       dış portan gelen isteği uygulamanın kullandığı iç porta yönlendirmek için belirtilir
volume    dosylarımız tutalacağı veya yerel pcden container aktaracağımız yolu belirtiriz. bunu belirtmez isek docker default olarak bir volume oluşturur ve orda tutar ,fakat container her yeniden başlatıldığında bu veriler silinir. bu yüzden docker 'ın dışında bir yol belirtmemiz önemlidir.
container_name    container 'ımız için bir etiket ismi oluşturuyoruz.

Dosya adı: docker-compose.yml
Dosya içeriği:

version: "3.1"

services:

  s_nginx:

    container_name: c_nginx

    image: nginx

    ports:

      - 8080:80

      - 8081:80

  s_html:

    container_name: c_html

    image: httpd

    volumes:

      -  C:\docker-containers\docker_compose\html/:/usr/local/apache2/htdocs

    ports:

      - 9090:80

      - 9091:80

volumes:

  html:


oluşturduğumuz yml dosyamızı çalıştırmak için, dosyamızın bulunduğu klasöre girip komut satırını açıyoruz ve aşağıdaki kodu çalıştırıyoruz.

>    docker-compose up -d

çalışan compose durdurmak için yml dosyamızın bulundugu klasordeki komut satırımıza aşağıdaki kodu çalıştırıyoruz.

> docker-compose down

docker compose loglarını görmek için aşağıdaki kodu çalıştırıyoruz.

> docker-compose logs

docker compose içerisinde bir servisi oluşturmak için aşağıdaki kodu çalıştırıyoruz.

>docker-compose build s_html



Docker Network:
Docker host üzerindeki docker container’lar gateway’e sahiptirler ve bu gateway üzerinden birbirilerine bağlantı kurabilirler. Her container’ımızın kendisine ait IP adresi ve bir port numarası vardır.
Docker container’ların birbirleriyle ve dışarıdaki uygulamalardan bu container’larla iletişim sağlanmasını sağlayan şey, Docker network yapısıdır.

3 adet network türü vardır:

Bridge: Aksi belirtilmediği sürece varsayılan network türüdür. Container yarattığımızda herhangi bir network belirtmezsek, default olarak bu network yapısını yani bridge network’u kullanır.

Host: Eğer container’lar host network’ü ile çalıştırılırsa, container’lar hosttaki ayarları kullanarak hayatına devam edecektir. İlgili container’a, Docker hostun kendi IP adresi üzerinden erişim sağlanır.

None: Container’ların hiçbir şekilde ağ altyapısını kullanmamasını sağlarlar. Bu network türüyle yaratılan container’a, ne dışarıdan ne de docker host içerisinden erişim sağlayabilirsiniz.

docker network yardımcı komutları:
>    docker network --help
connect :bir contenir o network bağlamak için
create  : yeni bir network oluşturmak için
disconnect : connect network bağlantısını koparmak için
inspect :  detaylarını görüntülemek için
ls : listeleme
prune : kullanım ıdısında olan aktif olarak kullanılmayan networkleri silmek için
rm : network kaldırmak için

örnek olarak komut satırında kullanıldığı gibi docker-compose.yml içerisinde de kullanabiliriz. :
>    docker network create custom_net --driver bridge
>    docker network inspect custom_net 

--network  hangi network de olması gerektiğini belirtiyoruz.

>    docker run -d -p 80:80 --name c_nginx --network custom_net nginx
>    docker network disconnect custom_net c_nginx

Docker Volumes

Docker üzerinde oluşan dataların saklanması ile ilgili bir bileşen docker container arasında veri saklamamız veya container arasında veri paylaşmamız için kullanılır, harici ortamda verilerin saklanması. 

docker volume yardımcı komutları:
>    docker volume --help
 create : yeni volume oluşturma  
 inspect : detaylarını görmek 
 ls : listeleme
 prune : kullanılmayan volume silmek
 rm : birvolume kaldırmak

örnek olarak komut satırında kullanıldığı gibi docker-compose.yml içerisinde de kullanabiliriz. :
docker volume prune
docker volume create v_test
docker volume inspect v_test

-v    kaydedeceğimiz yolu ve nereye kaydedeceğimizi belirtiyoruz.

>    docker run -d -p 80:80 --name c_nginx -v C:\app_data\nginx:/usr/share/nginx/html nginx

Docker Image, Container, Dockerfile

 Docker Kod Notları
image, container,dockerfile

Docker İmage: katman veya uygulamalardan olur. container içinde çalışır. image'lar oluşturup container içinde çalıştırırız. image 'ları kendi projemize göre özelleştiririz.

Docker Container: sanal makine, bir ip ,network ,sub mask vardır, image veya image'lerdan oluşur.


ls aktif listeyi verir.

ls -a daha önce çalışmış olduklarımızı da  gösterir

Image listeleme

>    docker image ls

>    docker image ls -a

Container Listeleme

>    docker container ls

>    docker container ls -a


Docker run Basit bir container ayağa kaldırmamıza yarar.

-d  container'ın komut satırında açık olmadan arka planda çalışması için kullanıyoruz.

-p iç porttan dış porta bağlanıyor, sunucu ipsinden 8080 protuna istek attığımızda container içerde nginx kullandığı 80 portuna yönlendirecektir.

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


DOCKERFILE

Dockerfile içerisinde hangi Image’ın kullanılacağı, hangi dosyaları içereceği ve hangi uygulamanın hangi parametrelerle çalışacağı yazılır. Docker, Dockerfile dosyasında bulunan komutları sırayla tek tek çalıştırır. Her komut yeni bir katman oluşturur. Docker build sonunda elimizde uygulaması ait Docker Image oluşur .

Dockerfile dosyasının herhangi bir uzantısı yoktur. bunun için dosta ismi sadece Dockerfile  olmalıdr. Dosya uzantıları işletim sisteminizde gizli ise, uzantıları açıp siliniz.

Örnek bir dockerfile

RUN uygulama içerisinde kullanacağımız kodlardır. her bir run komutu bir katmandır, image boyutunu arttırır. birden fazla komutu tek bir katmanda toplamak için aralara && "and" işareti ekleyerek kullanabiliriz.

From base image yani dockerhub içerisinde var olan bir uygulamayı çğrıyoruz ve kendimize göre özelleştiriyoruz.

alpine image en küçük boyutta minimum gereksinimle çalışan bir linux işletim sistemi dağıtımıdır.

Dosya adı:Dockerfile 

Dosya içeriği:

From alpine

RUN mkdir /test_dir && cd /test_dir

RUN echo "BU BİR TEST CONTAINER DIR." > test.txt

CMD cat test.txt


Dockerfile dosyasyının içinde bulunduğu klasörü komut satırında açıyoruz.

İlk önce dockerfile ile bir image oluşturuyoruz.

-t image bir etiket ismi vermek için kullanılır.

"nokta" işareti dockerfile bu klasörde oldugunu belirmetk için kullanılır.

>    docker image build -t test1 .

daha sonra oluşturduğumuz image container olarak ayağa kaldırıyoruz.

>    docker run test1

yukarıdaki komutu çalıştırarak dockerfile ile oluşturduğumuz image 'ı container olarak çalıştırıyoruz.

---------------------------------------------------------------------------------

Referans Belgeleri için tıklayınız