Установка Docker и использование нескольких версий php на сервере

Для тех кто использует vps и кому требуется версия не только одна версия php на сервере для различных проектов и для тестов в принципе подойдет способ запуска еще одной версии php в контейнере Docker. 

Установка Docker и использование нескольких версий php на сервере

Установка docker на сервер

Обновляемся

$ sudo apt update

Устанавливаем и подключаем ядро виртуализации

$ sudo apt install \
    linux-image-extra-$(uname -r) \
    linux-image-extra-virtual

Используем при загрузке защищенное соединение

$ sudo apt install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

Добавляем ключи

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Проверяем ключи

sudo apt-key fingerprint 0EBFCD88

Если все гуд то покажет так:

pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22

Добавляем репозиторий с которого мы будем загружать, обновлять, и устанавливать Docker

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

Еще раз проверим обновления

apt update

И теперь установим Docker

apt install docker-engine

Создание контейнера Docker с еще одной версией php

Самый простой способ создать контейнер docker с еще 1 версией php. Создаем конфигурационный Dockerfile

nano Dockerfile

PHP 5.3 и PHP 5.5

FROM ubuntu:12.04
#FROM ubuntu:14.04 если изменить на эту версию то установится php5.5
RUN apt-get update
#установка пакетов php внутри контейнера
RUN apt-get install -y php5 php5-fpm php5-mysql
#Изменяем доступность php-fpm чтобы слушать не только в localhost
RUN sed -i "s/listen = 127.0.0.1:9000/listen = 9010/g" /etc/php5/fpm/pool.d/www.conf

Создаем контейнер с php5.3

docker build -t php-fpm53 - < Dockerfile

Запускаем контейнер в фоне

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

Все одна версия php запущена, запустим еще одну.

  Русификация Ubuntu 12.04 / 13.04

Контейнер для PHP 7.0

nano Dockerfile2

вставим в него

#base image name
FROM ubuntu:16.04
RUN apt-get update
#установка необходимых пакетов
RUN apt-get install -y curl php7.0 php7.0-fpm php7.0-mysql php7.0-curl php7.0-mbstring
#Изменяем доступность php-fpm чтобы слушалось не только в localhost
RUN sed -i 's@listen = /run/php/php7.1-fpm.sock@listen = 9011@'  /etc/php/7.0/fpm/pool.d/www.conf

создадим еще 1 контейнер

docker build -t php7-fpm - < Dockerfile2

Так же запускаем в фоне

docker run -d -i -p 9011:9000 -v /var/www/:/var/www/:rw php7-fpm /bin/sh -c "service php7.0-fpm start && /bin/bash"

Теперь у вас запущено 2 версии php в контейнерах docker, возможно еще 1 уже есть в системе и того у нас 3 версии. Версия php 5.3 висит на 9010, версия php7.0 на 9011 порту.

Предполагается что вы используете сервер nginx в конфигурационный файл вашего сайта в директиве fastcgi_pass
нужно будет указать для версии 5.3

fastcgi_pass 127.0.0.1:9010;

для версии 7.0

fastcgi_pass 127.0.0.1:9011;

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

ifconfig

Увидите вывод команды:

docker0   Link encap:Ethernet  HWaddr 02:42:d5:70:e5:f5  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:d5ff:fe70:e5f5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8828 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9825 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:9570869 (9.5 MB)  TX bytes:5496589 (5.4 MB)

Этот адрес будет нужен для подключения к бд для php работающей в контейнере docker

inet addr:172.17.0.1

Устранение проблем, работа с контейнером Docker

Проблема может возникнуть при автоматической замене порта в файле www.conf, из за этого не будет запускаться сайт с другой версией php.
Это тоже не проблема и быстро решаема. Смотрим список контейнеров

docker ps -a

у меня вывод команды выглядит так:

CONTAINER ID  IMAGE    COMMAND                 CREATED     STATUS      PORTS                  NAMES
c80c17c9b0fe  php-fpm  "/bin/sh -c 'servi..."  5 weeks ago Up 11 hours 0.0.0.0:9010->9000/tcp jolly_turing

Из всего этого нам нужно имя контейнера jolly_turing у вас оно может быть другим. Подключаемся к нашему контейнеру
docker exec -i -t имя контейнера bash
все вы зашли в контейнер теперь можете отредактировать www.conf
Заменив в поле listen =

listen = 9010

Как отредактировать файл в контейнере? Так же как и в ubuntu.

  Серверная авторизация nginx. Настройка auth_basic.

Можно например установить в контейнер mc если не знаете точных путей к файлам

apt install mc

Запускается просто командой mc после чего появляется псевдо-графический интерфейс.

Удаление, отключение контейнеров Docker

Просмотр списка запущеных контейнеров

docker ps -a

Отключение / остановка  контейнера если запущен

docker stop id контейнера

Если не запущен, а просто висит, а нам нужно его отключить и удалить. смотрим список, выбираем то что нам нужно

docker rm id или имя контейнера

Просмотр списка образов и удаление

docker images

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

docker rmi id образа

Чтобы удалить все образы и контейнеры

docker rmi -f $(docker images -q) - удаление всех образов
docker rm -f $(ps docker -q -a) - удаление всех контейнеров

Вопросы, предложения ?

  Резервное копирование в Ubuntu server , Сценарии Shell

3 Комментария (ев)

  1. Отличная статья!
    Просьба написать статью как всё это сделать при условии, что на домашнем компе стоит локальный сервер (apache2, php5.6, линукс дебиан 8 или 9).
    Нужно часто тестировать сайты с разными версиями php (5.2, 5.3, 5.4).
    Буду очень признателен.
    Спасибо огромное.

    • Я думал apache уже никто не использует )) Время будет напишу, но думаю и на nginx + php + mysql можно неплохо потестировать сайты.

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here