Herkese merhaba!

Uzun yıllardır bol miktarda kişisel zaman ve enerji harcayarak bilgimizi hepinizle paylaşıyoruz. Ancak şu andan itibaren bu blogu çalışır durumda tutabilmek için yardımınıza ihtiyacımız var. Yapmanız gereken tek şey, sitedeki reklamlardan birine tıklamak olacaktır, aksi takdirde hosting vb. masraflar nedeniyle maalesef yayından kaldırılacaktır. Teşekkürler.

Bu örnekte, uygulama dosyalarımızı/verilerimizi saklamak için Docker'ın "named (adlandırılmış) volume" seçeneğini kullanacağız. Bu seçenek, production ortamında "bind/shared (paylaşılmış) volume" seçeneğinin aksine daha güvenlidir. Daha fazla ayrıntı için Manage data in Docker sayfasını okuyun. "bind/shared (paylaşılmış) volume" seçeneğini kullanmadığımız için (bu genellikle geliştirme ortamında kullanılır) uygulama kodunu my_app adı verilen "veri konteyner" içine kopyalayacağız. PHP-FPM ve Nginx konteynerları daha sonra uygulama verilerine erişmek için bu konteynerı kullanacaklar.


Uyarı


Kodunuzu production ortamına aktarırken, eğer "named (adlandırılmış) volume" için her seferinde farklı bir isim kullanmazsanız, uygulama kodunuzda yaptığınız değişiklikler kullanılmaz halde olacaktır. Örnek: Bir önceki isim app_code_volume_1 ise, daha sonraki isim mesela app_code_volume_2 olmalıdır.


Yapı


├── docker
│   ├── docker-compose.yml
│   ├── Makefile
│   ├── nginx
│   │   ├── app.conf
│   │   ├── Dockerfile
│   │   └── nginx.conf
│   ├── php
│   │   ├── Dockerfile
│   │   └── www.conf
│   └── source
│   └── Dockerfile
├── index.php
└── Readme.md

Dosyalar


docker/nginx/app.conf


server {
listen 80 default_server;

server_name localhost;

root /app;

index index.php;

location ~ \.php$ {
try_files $uri =404;
fastcgi_pass my_php:9000;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}

error_log /var/log/nginx/app_error.log;
access_log /var/log/nginx/app_access.log;
}

docker/nginx/Dockerfile


FROM nginx:1.15.8-alpine

COPY app.conf /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/nginx.conf

WORKDIR /app

docker/nginx/nginx.conf


user nginx;

worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;

keepalive_timeout 65;

include /etc/nginx/conf.d/*.conf;
}

docker/php/Dockerfile


FROM php:7.2.13-fpm-alpine3.8

COPY www.conf /usr/local/etc/php-fpm.d/www.conf

WORKDIR /app

CMD ["php-fpm", "--nodaemonize"]

docker/php/www.conf


[global]
daemonize=no

[www]
user=www-data
group=www-data

listen=my_nginx:9000

pm=dynamic
pm.max_children=40
pm.start_servers=2
pm.min_spare_servers=2
pm.max_spare_servers=4
pm.max_requests=500

docker/source/Dockerfile


FROM tianon/true

COPY . /app

docker/docker-compose.yml


version: "3.4"

services:

my_app:
build:
context: ".."
dockerfile: "docker/source/Dockerfile"
volumes:
- "app_code:/app"

my_php:
build:
context: "./php"
hostname: "my-php"
volumes:
- "app_code:/app"
depends_on:
- "my_app"
environment:
PS1: "\\u@\\h:\\w\\$$ "

my_nginx:
build:
context: "./nginx"
hostname: "my-nginx"
ports:
- "4080:80"
volumes:
- "app_code:/app"
depends_on:
- "my_php"
environment:
PS1: "\\u@\\h:\\w\\$$ "

volumes:
app_code:
name: "app_code_volume"

index.php


echo 'UP';

Kurulum


$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker_my_app latest fa430e0dd199 21 minutes ago 48.6kB
docker_my_php latest 642a68c15625 22 minutes ago 77.7MB
docker_my_nginx latest 9ac2a0cd6fb0 22 minutes ago 16.1MB
tianon/true latest 183cb5fd5414 7 months ago 125B

docker_my_app_1 ismindeki konteyner hiçbir zaman çalışır halde olmayacak bu nedenle paniğe kapılmayın.


$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e1327e7c84fa docker_my_nginx "nginx -g 'daemon of…" 22 minutes ago Up 22 minutes 0.0.0.0:4080->80/tcp docker_my_nginx_1
97a336f95a6b docker_my_php "docker-php-entrypoi…" 22 minutes ago Up 22 minutes 9000/tcp docker_my_php_1
2117d5b517ea docker_my_app "/true" 22 minutes ago Exited (0) 22 minutes ago docker_my_app_1

$ docker inspect app_code_volume
[
{
"CreatedAt": "2019-05-23T20:36:01+01:00",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "docker",
"com.docker.compose.version": "1.21.2",
"com.docker.compose.volume": "app_code_volume"
},
"Mountpoint": "/var/lib/docker/volumes/app_code_volume/_data",
"Name": "app_code_volume",
"Options": null,
"Scope": "local"
}
]

$ sudo ls -l /var/lib/docker/volumes/app_code_volume/_data
total 12
drwxr-xr-x 5 root root 4096 May 23 20:36 docker
-rw-r--r-- 1 root root 18 May 22 22:49 index.php
-rw-r--r-- 1 root root 124 May 23 19:27 Readme.md

Test


$ curl -i 0.0.0.0:4080
HTTP/1.1 200 OK
Server: nginx/1.15.8
Date: Thu, 23 May 2019 19:39:08 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/7.2.13

UP

Bildiğiniz gibi, uygulama verilerini veri konteynerimizin içine kopyaladık fakat beklediğimiz gibi PHP-FPM ve Nginx konteynerlarıda verilere erişilebilir durumdalar.


$ docker exec -it docker_my_php_1 ls -l
total 12
-rw-r--r-- 1 root root 124 May 23 18:27 Readme.md
drwxr-xr-x 5 root root 4096 May 23 19:36 docker
-rw-r--r-- 1 root root 18 May 22 21:49 index.php

$ docker exec -it docker_my_nginx_1 ls -l
total 12
-rw-r--r-- 1 root root 124 May 23 18:27 Readme.md
drwxr-xr-x 5 root root 4096 May 23 19:36 docker
-rw-r--r-- 1 root root 18 May 22 21:49 index.php