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.


Yapı


.
├── composer.json
├── docker
│   ├── docker-compose.yml
│   ├── Makefile
│   └── php
│   ├── Dockerfile
│   ├── php.ini
│   └── www.conf
├── .dockerignore
├── .gitignore
└── src
└── index.php

Dosyalar


Sadece önemli dosyaların içeriğini gösteriyorum. Gerisi çok önemli değil.


Makefile


build:
@docker-compose build

up:
@docker-compose up -d

Dockerfile


#
# 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


.dockerignore
.gitignore
*.md
.git/
.idea/
.DS_Store/

docker-compose.yaml


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"

Kurulum


İmaj kurulumu


$ 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

Konteyner yaratmak


$ 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

Konteyner içeriğinin kontrolü


$ 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.