Rozdělení containerů
nginx container
docker pull registry.gitlab.mondayfactory.cz/mondayfactory/php-apps-base/nginx
Je použit jako http proxy a k servírování statických souborů. Statické soubory jsou při buildu aplikace nahrány do /data/www
a to včetně index.php
.
apache container
docker pull registry.gitlab.mondayfactory.cz/mondayfactory/php-apps-base/apache
Stejné použití jako nginx
container.
php container
docker pull registry.gitlab.mondayfactory.cz/mondayfactory/php-apps-base/php
V produkčním prostředí slouží ke zpracování requestů mířených na PHP. Soubory projektu se kopírují do adresáře /data
a spustitelný soubor (index.php
) pak do /data/www
. Vychází z Alpine
containeru.
php-build container
docker pull registry.gitlab.mondayfactory.cz/mondayfactory/php-apps-base/php-build
Slouží k buildu aplikace, ke stažení composer
závislostí apod. Vychází z php
containeru.
Řešení závislostí projektu
Do build containeru je možné přidat ssh klíč pro deploy. Klíč se jednoduše zpropaguje do ENV proměnné DEPLOY_KEY
v gitlabu. V případě, že je klíč přidaný, tak se při buildu containeru automaticky přidá gitlab do známých hostů a tím je vyřešeno stahování závislostí přes composer.
php-develop container
docker pull registry.gitlab.mondayfactory.cz/mondayfactory/php-apps-base/php-develop
Tento container je navržen k vývoji. Jsou v něm nainstalované nástroje pro snadnější vývoj (Xdebug
apod). Vychází z php-build
containeru.
Základní použití
Vývoj
Vytvoření nového projektu
- Vytvoř adresáč s projektem např. 'muj-projekt'
- vlez do adresáře 'muj-projekt'
- zavolej
docker run -v ${PWD}:/data registry.gitlab.mondayfactory.cz/mondayfactory/php-apps-base/php-develop:master composer create-project nette/web-project /data
Základní použití v projektu
Pro vývoj se používá container php-develop
, který má oproti php
containeru navíc dostupný např. composer
a xdebug
.
Příklad docker-compose.yml pro vývoj projektu:
version: '2'
services:
nginx:
image: registry.gitlab.mondayfactory.cz/mondayfactory/php-apps-base/nginx:latest
volumes:
- .:/data:delegated
ports:
- 12345:80
links:
- fpm:fpm
fpm:
image: registry.gitlab.mondayfactory.cz/mondayfactory/php-apps-base/php-develop:latest
volumes:
- .:/data:delegated
Build
Následující ukázka reflektuje build z adresáře
tests
tohoto repozitáře
Pro build se používá php-build
. Princip je velmi jednoduchý. Spustí se build v containeru klasicky přes docker build -t $CI_REGISTRY_IMAGE:$CI_BUILD_REF_NAME ./Dockerfile
, ale container se nepushuje. Následně se vyrobí nová instance neběžícího containeru přes docker create
a do něj se pomocí docker cp
nakopírují vybuildované soubory aplikace do adresáře /data
.
.gitlab-ci.yml
pro základní build aplikace:
build_image:
stage: build
image: docker:17.11.0
services:
- docker:17.11.0-dind
script:
- docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
- docker build --force-rm -t fpm-temp${CI_COMMIT_SHA} -f ./tests/build.Dockerfile ./tests/
- docker create --rm --name build-cont${CI_COMMIT_SHA} fpm-temp${CI_COMMIT_SHA}
- docker cp build-cont${CI_COMMIT_SHA}:/data/test-app ./tests/tmp
- docker build -t $CI_REGISTRY_IMAGE/test/static-nginx:$CI_BUILD_REF_NAME -f ./tests/static-nginx.Dockerfile ./tests/
- docker push $CI_REGISTRY_IMAGE/test/static-nginx:$CI_BUILD_REF_NAME
# Pro uplnost uvadim i Apache container, potreba je vzdy jen jeden, bud NGINX, nebo Apache
- docker build -t $CI_REGISTRY_IMAGE/test/static-apache:$CI_BUILD_REF_NAME -f ./tests/static-apache.Dockerfile ./tests/
- docker push $CI_REGISTRY_IMAGE/test/static-apache:$CI_BUILD_REF_NAME
- docker build -t $CI_REGISTRY_IMAGE/test/fpm:$CI_BUILD_REF_NAME -f ./tests/fpm.Dockerfile ./tests/
- docker push $CI_REGISTRY_IMAGE/test/fpm:$CI_BUILD_REF_NAME
# Remove build image
- docker rm -f build-cont${CI_COMMIT_SHA} && docker rmi -f fpm-temp${CI_COMMIT_SHA}
build.Dockerfile
pro přípravu applikace:
FROM registry.gitlab.mondayfactory.cz/mondayfactory/php-apps-base/php-build
COPY ./mini-app /data
RUN cd /data && composer create-project nette/sandbox test-app
static-*.Dockerfile
pro static server:
FROM registry.gitlab.mondayfactory.cz/mondayfactory/php-apps-base/nginx
COPY ./tmp/www /data/www
fpm.Dockerfile
pro fpm server:
FROM registry.gitlab.mondayfactory.cz/mondayfactory/php-apps-base/php
COPY ./tmp /data
RUN chmod +r -R /data && \
chmod 0777 /data/temp && \
chmod 0777 /data/log
Produkce
Na produkci jsou containery zamýšleny pro provoz v chainu nginx + php
resp. apache + php
. K tomuto musí splňovat pouze jediný předpoklad a sice, že php aplikace běžící v php
containeru je do nginx
resp. apache
containeru nalinkovaná jako fpm
.
Ilustrační docker-compose.yml
pro produkci
version: '2'
services:
nginx:
image: registry.gitlab.mondayfactory.cz/mondayfactory/php-apps-base/nginx:latest
stdin_open: true
links:
- php:fpm
labels:
io.rancher.container.pull_image: always
php:
image: registry.gitlab.mondayfactory.cz/mondayfactory/php-apps-base/test/fpm:master
stdin_open: true
labels:
io.rancher.container.pull_image: always