04/06/2019 - DOCKER, PHP
Bu örnekte, uygulama bağımlılıklarını yüklemek için composer'ı çalıştıracağız, sonra vendor
klasörünü ve uygulama dosyalarının geri kalanını konteyner imajına kopyalayacağız. Bu sayede imajımız her zaman varsayılan olarak uygulama ile birlikte gelecektir, dolayısıyla tek yapmamız gereken bir konteyner oluşturmak ve kullanmaya başlamaktır. Bu iyi bilinen bir uygulamadır ancak sadece temel bir uygulamaya değinmek istiyorum. Ana amaç, uygulama kodunu izole etmek ve ana işletim sistemine maruz bırakmamaktır. Bu işlemin faydalarını burada listeleyeceğim çünkü hepsi internette yazılıdır. Bu çözümdeki kayda değer tek sorun, son docker imajının büyüklüğü, uygulama ve vendor
klasörünün boyutuna bağlı olmasıdır.
.
├── composer.json
├── docker
│ ├── docker-compose.yml
│ ├── Makefile
│ └── php
│ ├── Dockerfile
│ ├── php.ini
│ └── www.conf
├── .dockerignore
├── .gitignore
└── src
└── index.php
Sadece önemli dosyaların içeriğini gösteriyorum. Gerisi çok önemli değil.
build:
@docker-compose build
up:
@docker-compose up -d
#
# STAGE 1: composer
#
FROM composer:1.8.5 as composer
# Copy composer files from project root into composer container's working dir
COPY composer.* /app/
# Run composer to build dependencies in vendor folder
RUN set -xe \
&& composer install --no-dev --no-scripts --no-suggest --no-interaction --prefer-dist --optimize-autoloader
# Copy everything from project root into composer container's working dir
COPY . /app
# Generated optimized autoload files containing all classes from vendor folder and project itself
RUN composer dump-autoload --no-dev --optimize --classmap-authoritative
#
# STAGE 2: php
#
FROM php:7.2.13-fpm-alpine3.8
# Set container's working dir
WORKDIR /app
# Copy everything from project root into php container's working dir
COPY . /app
# Copy vendor folder from composer container into php container
COPY --from=composer /app/vendor /app/vendor
# Copy necessary files
COPY docker/php/php.ini /usr/local/etc/php/conf.d/php.override.ini
COPY docker/php/www.conf /usr/local/etc/php-fpm.d/www.conf
CMD ["php-fpm", "--nodaemonize"]
.dockerignore
.gitignore
*.md
.git/
.idea/
.DS_Store/
Bu isteğe bağlıdır ve kullanıp kullanmamak size kalmış. Benim yaptığımın aksine, doğal docker komutlarının yerine projenin temelinde $ make -sC docker/ build up
komutunu kullanabilirsiniz.
version: "3.4"
services:
php:
build:
context: ".."
dockerfile: "docker/php/Dockerfile"
hostname: "php"
$ docker build -t my_php_app:latest -f /absolute/path/to/project/docker/php/Dockerfile .
Successfully built c62632b82433
Successfully tagged my_php_app:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my_php_app latest c62632b82433 5 minutes ago 77.7MB
$ docker run -itd --name my_php_app my_php_app:latest sh
4ec090d70437cf3312d735f754bcb5abcd96759fd8f76f24fbeb43e42c04f140
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4ec090d70437 my_php_app:latest "docker-php-entrypoi…" 4 seconds ago Up 3 seconds 9000/tcp my_php_app
$ docker exec -it my_php_app sh
/app # ls -l
-rw-r--r-- 1 root root 133 Jun 3 20:23 composer.json
drwxr-xr-x 4 root root 4096 Jun 3 20:33 docker
drwxr-xr-x 2 root root 4096 Jun 3 20:39 src
drwxr-xr-x 4 root root 4096 Jun 3 20:56 vendor
Eğer konteyner içinde php src/index.php
komutunu çalıştırırsanız sonuç beklendiği gibi olacaktır.