DevOps, Linux, 2 git`a
  • Обо мне
  • Категории
  • Теги
  • Архив

Часть 1.2. Mysql, php, nginx via docker.

Содержание

  • Mysql
  • Php-fpm
  • Nginx

Docker

Часть 1.1. Docker. Введение.
Часть 1.2. Mysql, php, nginx via docker.
Часть 1.3. Линковка. Общие тома. Запуск. PhpBB.

Краткая версия доступна тут, github репозиторий.

Создадим остальные компоненты phpBB с использованием docker'a.

Mysql

Докер, как система, хорош не только своей концепцией повторяемой инфраструктуры, но и своим публичным хранилищем Docker Hub. На данный момент Хаб содержит более 100 официальных репозиториев от производителей софта и более 45к публичных репозиториев пользователей. Если вы проходили интерактивный туториал, то уже должны были работать с публичным хранилищем от докера.

И в некоторых типовых случаях, будет вполне достаточно образа из докер хаба. Для БД mysql воспользуемся официальным имеджем. В консоли выполним docker pull mysql и в списке образов обнаружим :

    mysql                      latest              0beee7f478c8        3 weeks ago         282.8 MB

Php-fpm

Так как я использую в качестве фронтенда nginx, то необходим обработчик php — fastcgi сервер. В этом качестве выступит php-fpm. Для создания docker-php-fpm компонента опишу следующий докерфаил:

#
# Install imagemagic, php5, some php extentions
#

# Pull base image.
FROM phusion/baseimage

# Install
RUN \
    apt-get update && \
    apt-get install -y php5 php5-mysql php5-gd php5-fpm imagemagick unzip mysql-client && \
    sed -e 's/\/var\/run\/php5-fpm.sock/9000/' -i /etc/php5/fpm/pool.d/www.conf && \
    apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# Runit php-fpm  service
    ADD php-fpm.sh /etc/service/php-fpm/run

# Use baseimage-docker's init system.
    CMD ["/sbin/my_init"]

Образ будет создан на основе phusion/baseimage. Сначала будет установлен php с нужными расширениями, следом imagemagick, unzip и mysql-client. Далее с помощью sed будет исправлен конфиг php-fpm по умолчанию (интерфейс, на котором слушает php-fpm, изменится с локального unix-сокета /var/run/php5-fpm.sock на сетевой интерфейс 0.0.0.0:9000). А в конце команды RUN будет произведена чистка кэша и временных папок, чтоб не тащить мусор за собой внутрь образа.

Далее следует магия phusion/baseimage. Внутри образа присутствует своя собственная система запуска процессов. Для этого свой сервис необходимо добавить инструкцией ADD по пути /etc/service/<NAME>/run, где <NAME> имя сервиса. SH-фаил должен находиться в той же директории что и докерфаил и должен быть исполняемым. CMD как раз запускает внутреннюю систему запуска процессов my_init.

Содержимое файла php-fpm.sh:

1
2
3
#!/bin/sh
set -e
exec php5-fpm --nodaemonize

Процесс php5-fpm стартует в режиме без демонизации и без форка. Т.е. в текущем процессе. Это одно из главных условий использования phusion/baseimage.

Соберем наш образ: docker build -t php-fpm /путь/до/папки/с/докерфайлом

Обращаю внимание, что при создании образа инструкции RUN исполняются единожды (в одну линию), это рекомендации от самого докера. Т.к. каждая инструкция RUN это слой в построении образа.

Nginx

В качестве фронтенда/вебсервера был выбран nginx. Для создания docker-nginx приведу следующий конфиг докерфайла:

#
# Nginx stable Dockerfile
#

# Pull base image.
FROM phusion/baseimage

# Install Nginx.
RUN \
    add-apt-repository -y ppa:nginx/stable && \
    apt-get update && \
    apt-get install -y nginx && \
    echo "\ndaemon off;" >> /etc/nginx/nginx.conf && \
    chown -R www-data:www-data /var/lib/nginx && \
    unlink /etc/nginx/sites-enabled/default && \
    apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# Runit Nginx service
ADD nginx.sh /etc/service/nginx/run

# Disable ipv6
ADD ipv6off.sh /etc/rc.local

# Use baseimage-docker's init system.
CMD ["/sbin/my_init"]

По инструкции будет установлен последний стабильный nginx, отключен конфиг по умолчанию /etc/nginx/sites-enabled/default, а в главный конфиг будет добавлен daemon off; что не позволит nginx'у при запуске произвести демонизацию. Конфиги сайтов будут добавлены позже через директорию /etc/nginx/conf.d, которую необходимо будет подключить, как том контейнера с данными.

nginx.sh

1
2
3
#!/bin/sh
set -e
exec /usr/sbin/nginx -c /etc/nginx/nginx.conf

ipv6off.sh как следует из названия отключает ipv6, это связано с проблемой проксирования nginx, т.к. ответ может прийти как от 127.0.0.1 так и от 0:0:0:0:0:0:0:1.

1
2
3
4
5
#!/bin/sh
sysctl net.ipv6.conf.all.disable_ipv6=1
sysctl net.ipv6.conf.default.disable_ipv6=1
sysctl net.ipv6.conf.lo.disable_ipv6=1
exit 0

Собираем наш образ: docker build -t nginx /путь/до/папки/с/докерфайлом. Проверяем что получилось docker images:

REPOSITORY                 TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
php-fpm                 latest  49cfee7ea7bb         5 days ago          368.5 MB
nginx_datastore                 latest    16f48b621bee         5 days ago         20.02 MB
mysql_datastore         latest  48270e80e3c5        5 days ago          2.436 MB
nginx                       latest  1ebf34a9d0e5        3 weeks ago         299 MB
mysql                       latest  0beee7f478c8        3 weeks ago         282.8 MB
phusion/baseimage           0.9.16  5a14c1498ff4        5 weeks ago         279.7 MB
phusion/baseimage           latest  5a14c1498ff4        5 weeks ago         279.7 MB
busybox                 latest  4986bf8c1536        8 weeks ago         2.433 MB

Теперь со всем этим попытаемся взлететь "Часть 1.3. Линковка. Общие тома. Запуск. PhpBB."

Комментарии
comments powered by Disqus

Опубликовано

мар 1, 2015

Изменено

мар 6, 2015

Категория

devops

Теги

  • data container 4
  • datastore 4
  • docker 4
  • mysql 3
  • nginx 5
  • php 3
  • phpbb 3

Контакты

Получать обновления

  • Creative Commons License DevOps, linux, 2 git`a. Дмитрий Леонов
  • Создано с помощью Pelican. Тема Elegant от Talha Mansoor. Перевод темы Дмитрий Леонов