См. 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. Вот его DockerfileFROM 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% работы все-таки лучше создать свой образ).Образ приложения
Самый легкий образ, который оборачивает в контейнер наше приложение и делает его доступным для других контейнеров. Вот его DockerfileFROM 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
Комментариев нет:
Добавлять новые комментарии запрещено.