вторник, 11 августа 2015 г.

Docker для PHP Разработчка. Часть 2 - Практическая.

Давайте создадим изолированно приложение. Используя Docker создадим PHP приложение, которое будет доступно через nginx web-сервер и общаться с MySQL БД.


См. Docker для PHP Разработчка. Часть 1 - Теоретическая.

Создайте рабочую директорию. Все команды будем выполнять в этой директории.

План действий

Итак, снчала нам необходимо установить Docker (Установка в ubuntu),

$ wget -qO- https://get.docker.com/ | sh

Проверим, что докер установился и работает

$ sudo docker run hello-world

потом настроить контейнеры сервисов, с которыми будет общатсья наше приложение, это не посредственно контейнер приложения, nginx, php-fpm и mysql контерйнеры.

Чтобы сэкономить место на диске, и уменьшить к-во скачиваний, будем использовать образы, основанные на Ubuntu 14.04. Чтобы собрать и настроить коммуникацию между контейнерами будем использовать Docker Compose. В итоге мы должны получить PHP окружение, поднимаемое по требованию, которрое запускается секунды одной bash командой. Так же мы обсудим как агрегировать логи. Помните, контейнены могут наследоваться, поэтому никакие данные не должны сохраняться внутри контейнера.

Docker Compose

Этот замечательный инструмент создан, чтобы облегчить нам жизнь. Установка

$ sudo pip install -U docker-compose

Используя его нам не нужно помнить имена параметров\флагов, нет шансов опечататься при наборе команд docker. Docker Compose - "утилита для определения и запуска мульти-контейнерных приложений" (с офф документации), она автоматизирует развертывание и конфигурирование контейнеров. В итоге, используя ее, вместо написания длинных bash команд мы можем просто определить  docker-compose.yml  файл конфигурации.

Запустим окружение Zend Framework 2:

$ git clone git@github.com:t4web/docker-zf2.git
$ composer create-project -n -sdev zendframework/skeleton-application application/
$ sudo sed -i "2i127.0.1.1  application.loc" /etc/hosts
$ cd docker-zf2/application &&  composer install
$ cd ..
$ sudo docker-compose up -d

Все, теперь можете открыть ваше zf2 приложение в броузере по ссылке  http://application.loc 

Теперь разберемся как это все работает и что находится в  t4web/docker-zf2 репозитории.

Nginx Docker Образ

Начнем с контейнера web-сервера. В директории  nginx/  есть файл  Dockerfile  и файлы конфигурации web-сервера.  Dockerfile  выглядит так

FROM phusion/baseimage

CMD ["/sbin/my_init"]

RUN apt-get update && apt-get install -y nginx

ADD nginx.conf /etc/nginx/
ADD application.conf /etc/nginx/sites-available/

RUN ln -s /etc/nginx/sites-available/application.conf /etc/nginx/sites-enabled/application
RUN rm /etc/nginx/sites-enabled/default

RUN echo "upstream php-upstream { server php:9000; }" > /etc/nginx/conf.d/upstream.conf

RUN usermod -u 1000 www-data

RUN mkdir -p /etc/service/nginx
ADD start.sh /etc/service/nginx/run
RUN chmod +x /etc/service/nginx/run

RUN mkdir -p /var/www

EXPOSE 80

RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

Синтаксис  Dockerfile  описан здесь Docker documentation.

Обратите внимание! Команда  CMD  должна присутствовать в файле один раз и запускать сервис в контейнере, а для образа  phusion/baseimage  сервисы запускаются немного по-другому.

Попробуем его запустить

$ sudo docker build -t zf2/nginx nginx

В конце должно появиться что-то вроде

Successfully built 3af65f60a099

Теперь можно посмотреть доступные образы

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
zf2/nginx           latest              3af65f60a099        2 hours ago         277.6 MB
phusion/baseimage   latest              e9f50c1887ea        3 weeks ago         237.7 MB

PHP-FPM Docker Образ

Точно так же как и nginx мы на основании образа  phusion/baseimage  подготавливаем образ php-fpm. Вот его  Dockerfile 

FROM phusion/baseimage

CMD ["/sbin/my_init"]

RUN apt-get update && apt-get install -y php5-common php5-cli php5-fpm php5-mcrypt php5-mysql php5-apcu php5-gd php5-imagick php5-curl php5-intl

ADD application.ini /etc/php5/fpm/conf.d/
ADD application.ini /etc/php5/cli/conf.d/

ADD application.pool.conf /etc/php5/fpm/pool.d/

RUN usermod -u 1000 www-data

RUN mkdir -p /etc/service/php5-fpm
ADD start.sh /etc/service/php5-fpm/run
RUN chmod +x /etc/service/php5-fpm/run

RUN mkdir -p /var/www

EXPOSE 9000

RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

Попробуем его запустить

$ sudo docker build -t zf2/php-fpm php-fpm

В конце опять должны увидеть

Successfully built 8f954f122995

Теперь можно посмотреть доступные образы

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
zf2/php-fpm         latest              8f954f122995        45 seconds ago      372.6 MB
zf2/nginx           latest              3af65f60a099        2 hours ago         277.6 MB
phusion/baseimage   latest              e9f50c1887ea        3 weeks ago         237.7 MB

Вот наглядный пример преимущества Docker, второй образ  phusion/baseimage  для php-fpm не создался, а использовался существующий, а разница в слоях только в отличие - установленном ПО.

MySQL Образ

Образ БД мы не будем создавать, а будем использовать существуюший  centurylink/mysql , он так же основан на  phusion/baseimage , поэтому смысла создавать свой - нет. (Почти нет, бывает, что автор образа передумал, и может изменить родителя или конфигурацию, поэтому для 100% работы все-таки лучше создать свой образ).

Образ приложения

Самый легкий образ, который оборачивает в контейнер наше приложение и делает его доступным для других контейнеров. Вот его  Dockerfile 
FROM phusion/baseimage

CMD ["/sbin/my_init"]

VOLUME /var/www/application

RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

Docker приложение, вместе

Ну и на последок  docker-composer.yml  конфиг который все это запускает и связывает:
application:
    image: zf2/application
    volumes:
        - application:/var/www/application
        - logs/application:/var/www/application/data/logs
    tty: true
db:
    image: centurylink/mysql
    ports:
        - 3306:3306
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: zf2
        MYSQL_USER: root
        MYSQL_PASSWORD: root
php:
    image: zf2/php-fpm
    expose:
        - 9000:9000
    links:
        - db
    volumes_from:
        - application
nginx:
    image: zf2/nginx
    ports:
        - 80:80
    links:
        - php
    volumes_from:
        - application
    volumes:
        - logs/nginx/:/var/log/nginx

Комментариев нет: