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

  1. Vytvoř adresáč s projektem např. 'muj-projekt'
  2. vlez do adresáře 'muj-projekt'
  3. 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