Disclaimer: Статья написана как напоминание в первую очередь для себя и не на что не претендует. Но надеюсь она сможет помочь кому-нибудь. Мне бы точно помогла, если бы была в начале моего знакомства с докером.
Вводная
К моменту как вы начнете это читать у вас должно быть минимальное представление о том что такое docker. А если представления нет, то отправляемся сюда, а потом в обязательном порядке проходим интерактивный туториал тут. После этого представление должно появится, а понимание вскорости прийдет. Для работы с докером на рабочей машине используется boot2docker: os x, windows. А если у вас линукс в качестве рабочего компьютера (надеюсь что нет ☺), то нативная поддержка.
Структура
Для того чтоб понять как работает технология надо начать ей пользоваться. А лучше сделать на ней рабочий продукт. Я опишу два таких проекта в соответствующих двух частях. Часть первая - вводная часть и простой домашний проект. Часть вторая - проект для моей работы, рассчитаный на нагрузки, который станет частью системы мониторинга. А так же подготовка инфраструктуры для будущих проектов на докере.
Часть 1.1. Docker. Введение.
Часть 1.2. Mysql, php, nginx via docker.
Часть 1.3. Линковка. Общие тома. Запуск. PhpBB.
Краткая версия доступна тут, github репозиторий.
Базовый образ
В качестве основного образа, который будет использоваться для построения всей инфраструктуры, будет использован baseimage-docker.
Внимание: Проблемы, которые решает baseimage-docker на момент написания этих статей еще присутствуют (версия docker 1.5). Но в будущем они могут быть исправлены. Прошу проверять актуальность решения по использованию baseimage-docker.
Проект
В качестве домашнего проекта для испытания докера была выбрана задача по развертыванию форума phpBB. Для форума потребуется следующие компоненты:
- база данных: mysql
- обработчик php: php-fpm
- фронтенд: nginx
Компонент №0
Докер – система, которая не сохраняет данные внутри контейнера. Вернее так: данные сохраняются в контейнере до тех пор пока он запущен. Для постоянного сохранения данных есть два подхода. Первый: монтирование папки из хост системы внутрь контейнера как тома (volume). Второй (канонический, на котором настаивает докер): это использование data volume контейнеров. Именно этот второй я и буду использовать.
Контейнер с данными mysql
Необходимо хранить данные для БД mysql. Опишу создание контейнера с данными в следующем Dockerfile:
FROM busybox
RUN \
adduser -H -D mysql mysql && \
mkdir /var/lib/mysql && \
chown -R mysql:mysql /var/lib/mysql
VOLUME /var/lib/mysql
CMD /bin/sh
FROM
- на базе легкого образа busybox
RUN
- исполняются следующий команды: создается пользователь mysql с соответствующей группой, создается директория /var/lib/mysql
и присваиваются соответствующие права
VOLUME
- директория /var/lib/mysql
назначается как том
CMD
- команда которая исполняется при старте контейнера
Соберем образ:
docker build -t mysql_datastore /путь/до/папки/с/докерфайлом/
где mysql_datastore - имя образа
Наш новый образ можно посмотреть командой docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
mysql_datastore latest 48270e80e3c5 3 days ago 2.436 MB
busybox latest 4986bf8c1536 8 weeks ago 2.433 MB
Контейнер с данными nginx
Php файлы форума, а так же конфиг сайта для nginx так же необходимо сохранить внутри контейнера с данными.
Следующий докерфаил содержит инструкции для автоматического скачивания и распаковки файлов phpBB и русской локализации. А также подключение конфига nginx.
FROM busybox
ADD https://www.phpbb.com/files/release/phpBB-3.1.3.zip /tmp/phpbb/phpbb.zip
ADD https://www.phpbb.com/customise/db/download/109011 /tmp/phpbb/phpbb-rus.zip
WORKDIR /tmp/phpbb
RUN \
mkdir -p /etc/nginx/conf.d /www/phpbb && \
unzip phpbb.zip -qq -d . && \
unzip phpbb-rus.zip -qq -d . && \
cp -r phpBB3/* russian_1_1_3/* /www/phpbb/ && \
rm -r /tmp/phpbb && \
chown -R www-data.www-data /www/phpbb/cache /www/phpbb/files /www/phpbb/store /www/phpbb/images/avatars/upload /www/phpbb/config.php
ADD phpbb.conf /etc/nginx/conf.d/
VOLUME /etc/nginx/conf.d
VOLUME /www
CMD /bin/sh
Прошу обратить внимание, что инструкция ADD
скачивает последнии на данный момент файлы форума (версия 3.1.3) и локализации (версия 1.1.3). К сожалению phpBB не выкладывает файлы по универсальным ссылкам и для получения последней версии возможно придется исправить адреса на актуальные. Далее происходит распаковка архивов и выкладывание по пути /www/phpbb
, так же папкам /www/phpbb/cache
, /www/phpbb/files
, /www/phpbb/store
, /www/phpbb/images/avatars/upload
и файлу /www/phpbb/config.php
меняется владелец на www-data. Это необходимое условии, е для нормального функционирования форума. Инструкцией ADD phpbb.conf /etc/nginx/conf.d/
добавляется фаил phpbb.conf по соответствующему пути. При создании образа, фаил phpbb.conf должен находится рядом с нашим Dockerfile'ом. Инструкцией VOLUME
папки с конфигами и файлами phpBB переводятся в том.
Содержимое phpbb.conf:
server {
listen 80;
root /www/phpbb;
location / {
index index.php ;
location ~ /(config\.php|common\.php|includes|cache|files|store|images/avatars/upload) {
deny all;
internal;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_pass php-fpm:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
}
Создадим образ nginx_datastore: docker build -t nginx_datastore /путь/до/папки/с/докерфайлом
Создание остальных компонентов далее "Часть 1.2. Mysql, php, nginx via docker"