Noveo

Наш блог Использование Docker для запуска различных версий PHP на одном хосте

Использование Docker для запуска различных версий PHP на одном хосте

Автор статьи, наш PHP-разработчик Дмитрий, признается: «Описания головокружительных открытий вы в этой статье не найдете, но мне в свое время эти нехитрые решения помогли здорово сэкономить время. Буду рад, если кому-нибудь из вас тоже помогут :)».

Описание проблемы

К нам на разработку пришел проект, который работает только с версией php не выше 5.3. Но у меня на рабочем компьютере стоит ubuntu 13.04, в которой по умолчанию стоит php версии 5.4. В рамках данной задачи (разработка модуля для drupal 6) исправлять все проблемные места в коде (для запуска на 5.4) бессмысленно.

Рабочее окружение: Ubuntu 13.04, Nginx + php-fpm 5.4

Варианты решения:

1) Даунгрейдить пакеты на рабочей системе.

Плюсы:

  • отсутствуют.

Минусы:

  • просто так не сделаешь, т.к. много зависимостей для других пакетов и т.д.;
  • система перестанет нормально обновляться;
  • остальные проекты, которые требуют 5.4+, не будут работать;

2) Поднять локально или удаленно виртуальную машину с отдельной системой.

Плюсы:

  • не вносим изменения в рабочую систему.

Минусы:

  • скорость работы;
  • нужно как-то синхронизировать исходные коды разрабатываемого проекта между рабочей машиной и виртуалкой;
  • скорость развертывания.

3) Использовать LXC ‑ например, Docker.

Плюсы:

  • скорость развертывания решения (базовая версия Ubuntu поднимается за одну команду);
  • большой репозиторий образов, доступных прямо из консоли;
  • возможность шаринга локальной папки в контейнер;
  • возможность проброса портов на хост из контейнера;
  • малое потребление ресурсов;
  • возможность хранить свои образы в публичном репозитории.

Минусы:

  • нельзя пробросить порт из хоста в контейнер. В моем случае это означало, что нужно было поменять в настройках проекта адрес БД с localhost на ip хоста во внутренней сети.

Соответственно, я выбрал третий вариант. Рассмотрим его подробнее:

Docker

Компания DotCloud разработала и выложила в открытый доступ систему Docker — высокоуровневые интерфейсы для доступа к Linux-контейнерам (LXC). Это идеальный инструмент для работы с контейнерами на любом сервере x64, для развёртывания крупномасштабных веб-инсталляций, кластеров БД, частных PaaS и т.д.

LXC — система виртуализации на уровне операционной системы для запуска нескольких изолированных экземпляров Linux на одном компьютере. LXC не использует виртуальные машины, а создаёт виртуальное окружение с собственным пространством процессов и сетевым стеком. Все экземпляры LXC используют один экземпляр ядра ОС.

Ключевые особенности Docker

  • Изоляция файловой системы: каждый контейнер процесса работает в полностью отдельной корневой файловой системе.
  • Изоляция ресурсов: системные ресурсы, как CPU и память, можно выделять по-разному для каждого контейнера процесса, используя cgroups.
  • Сетевая изоляция: каждый контейнер процесса работает в своём собственном пространстве имён, с виртуальным интерфейсом и собственным IP-адресом.
  • Копирование при записи: корневые файловые системы создаются путём копирования при записи, что позволяет развёртывать контейнеры исключительно быстро, не используя лишней памяти и места на диске.
  • Логгирование: стандартные потоки (stdout/stderr/stdin) каждого контейнера процесса регистрируются и сохраняются для последующего анализа.
  • Менеджмент изменений: изменения, внесённые в файловую систему одного контейнера, можно применить к новому образу и повторно использовать для других контейнеров. Больше не нужны шаблоны и конфигурация вручную.
  • Интерактивная консоль: Docker может подключить pseudo-tty и стандартный ввод данных для любого контейнера.

Docker построен на файловой системе AUFS, в которой есть функция копирования при записи, и языке программирования Go.

Решение

Рассмотрим, какие конкретно шаги мне потребовалось сделать для установки Docker и поднятия на нем php5-fpm версии 5.3:

1. Установим сам Docker:

sudo apt-get update
sudo apt-get install linux-image-extra-`uname -r`
sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"
sudo sh -c "echo deb http://get.docker.io/ubuntu docker main
> /etc/apt/sources.list.d/docker.list"
sudo apt-get update
sudo apt-get install lxc-docker

2. Создадим Dockerfile, из которого соберется наш образ:

#base image name
FROM ubuntu:12.04
RUN echo  "deb http://archive.ubuntu.com/ubuntu/ precise universe" >> /etc/apt/sources.list
RUN apt-get update
#установка необходимых пакетов
RUN apt-get install -y php5 php5-fpm php5-mysql
#заставим php-fpm слушать не только localhost
RUN sed -i "s/listen = 127.0.0.1:9000/listen = 9000/g" /etc/php5/fpm/pool.d/www.conf

3. Соберем наш образ:

sudo docker build -t php-fpm53 - < Dockerfile

4. Запустим контейнер в фоне:

sudo docker run -d -i -p 9010:9000 -v /var/www/:/var/www/:rw php-fpm53 /bin/sh -c "service php5-fpm start && /bin/bash"

Рассмотрим подробнее параметры:

run -запускает контейнер

-d – Detached mode: Run container in the background, print new container id

-i – Keep stdin open even if not attached

-p – Map a network port to the container

-v – Create a bind mount with: [host-dir]:[container-dir]:[rw|ro]. If “container-dir” is missing, then docker creates a new volume.

php-fpm53 – имя образа

/bin/sh -c “service php5-fpm start && /bin/bash” – команда для выполнения в контейнере

Теперь наш инстанс php-fpm версии 5.3 доступен по адресу 127.0.0.1:9010

Внесем изменения в конфиг nginx:

fastcgi_pass 127.0.0.1:9010;

Все заработало, но подключение к БД не происходит. Исправим это, заменив в конфиге приложения 127.0.0.1 на 172.17.42.1

Код Docker на Github

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

НазадПредыдущий пост ВпередСледующий пост

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: