Docker Laravel Compose
DockerDocker Laravel Composer Nginx PHP8 Postgresql pgAdmin
Yazılım mühendisliği, yazılım dökümanlar. Html5 game, Ios, Android ,Php, Python, Javascript, Css, Mysql, Sql, Node js ' and Software documents .
Docker Laravel Composer Nginx PHP8 Postgresql pgAdmin
Docker SuiteCRM8 Compose
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.
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-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 Yapımı
Docker HealthCheck
> 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 Swarm, Stack
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
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" }
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());
}
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
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 Kod Notları 2
docker-compose, network, volumes
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:
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.
---------------------------------------------------------------------------------