Часть 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."