Статья Postfix и Dovecot в контейнере Docker расскажет о том, как простейшую связку MTA и MAA развертывать автоматически с помощью технологий контейнеризации. Этот сценарий идеален для целей обкатки и тестирования почтовых сервисов (например для групп разработки и тестирования ПО для отладки почтового функционала разрабатываемого софта), но мало применим для реальных инфраструктур в продакшене.
Содержание
Postfix и Dovecot в контейнере Docker
Все нюансы установки и настройки Postfix и Dovecot с использованием локального хранилища maildir я подробно рассказывал в одной из недавних статей – Базовая настройка Postfix и Dovecot. В этой же статье я хочу сделать упор на особенности развертывания абсолютно аналогичной конфигурации, но с помощью контейнеров Docker.
Dockerfile и все необходимое для сборки образа добро я выложил на GitHub – postfix-dovecot-maildir. Обратите внимание на тестовые ветки, возможно там будет более актуальная информация.
Подготовка
Установка Docker подробно расписана в официальной документации 1.
Для выкачивания репозитория с GitHub вам потребуется Git, установить его можно командой:
1 |
apt-get install git |
Советую создать отдельную папку, чтобы не мусорить в текущем каталоге, и сразу в неё перейти:
1 |
mkdir ~/testdir01 ; cd ~/testdir01 |
Далее скачиваем репозиторий командой:
1 |
git clone -b Test-branche https://github.com/bissquit/postfix-dovecot-maildir.git |
В текущем каталоге вы обнаружите новую папку с именем postfix-dovecot-maildir, в ней и будет нужный нам для сборки образа dockerfile. Перейдем в папку и проверим её содержимое:
1 |
cd postfix-dovecot-maildir/ && ls -lh |
1 2 3 4 |
-rw-r--r-- 1 root root 1,3K мар 27 13:36 dockerfile -rw-r--r-- 1 root root 930 мар 27 13:19 dovecot.conf -rw-r--r-- 1 root root 989 мар 27 13:19 main.cf -rw-r--r-- 1 root root 1013 мар 27 13:19 README.md |
Все эти файлы вы можете скачать и вручную без использования Git, но это не очень удобно. К тому же, если в каком-либо репозитории файлов будет больше, выкачивание вручную – не лучшая затея.
Сборка
Теперь настал самый ответственный момент – сборка образа. Сделать это можно с помощью команды:
1 2 3 4 |
docker build --build-arg DomainName=domain.tld \ --build-arg UserName=mailuser \ --build-arg UserPass=mailuser_pass \ -t mailserver . |
Где:
- domain.tld – DNS-имя почтового домена;
- mailuser – имя основного пользователя в системе, для которого будет создан ящик и на которое будут перенаправлена входящая почта с дефолтных адресов (например postmaster@bissquit.ru)
- mailserver – имя собираемого образа (можно задать исключительно техническое имя, например testcontainer01).
Далее последует длительный процесс сборки контейнера. Периодически будут создаваться промежуточные контейнеры (на каждую отдельную инструкцию dockerfile), потом удаляться. Вы увидите что-то на подобии этого:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sending build context to Docker daemon 136.7 kB Step 1/16 : FROM debian:latest ---> e5599115b6a6 Step 2/16 : MAINTAINER E.Vasilyev <bq@bissquit.ru> ---> Running in 4730bf38b22c ---> b5635a8c4586 Removing intermediate container 4730bf38b22c Step 3/16 : ARG DomainName ---> Running in c1bcf6e99bcb ---> a4c2ba9876f8 Removing intermediate container c1bcf6e99bcb Step 4/16 : ARG UserName ---> Running in c4f27862d661 ---> baac7ccc768c Removing intermediate container c4f27862d661 ... |
Потребуется подключение к интернету, если у вас не выкачены необходимые образы, а также если в dockerfile есть соответствующие команды (например apt-get update и др.).
Запуск
Образ собран, пришла пора запустить на его основе контейнер. Выполним команду:
1 2 3 4 |
docker run -d -p 25:25 \ -p 143:143 \ -p 110:110 \ mailserver |
Если все прошло нормально, то выполнив команду docker ps -a, вы увидите запущенный контейнер.
Если понадобиться зайти внутрь контейнера для изменения каких-либо настроек или для диагностики, то это можно сделать командой:
1 |
docker exec -it b8610b5cea19 /bin/bash |
где b8610b5cea19 – идентификатор контейнера (доступен также по команде docker ps -a). По окончанию сеанса наберите exit.
Отличия развертывания через Docker
Поскольку развертывание контейнера происходит в автоматическом режиме без участия пользователя, существует ряд отличий по сравнению с традиционным вариантом, когда все делается вручную.
Установка пакетов
В процессе установки пакетов пользователю могут быть заданы вопросы о желаемой конфигурации. При автоматическом сценарии развертывания важно эти ответы определить заранее.
Сделать это можно дополнив базу данных debconf 2. Для этого нужно создать файл (у меня он будет иметь имя postfix_silent_install.txt) с содержимым (файл построчный, каждая строка должна иметь четыре значения):
1 2 |
postfix postfix/main_mailer_type string Internet site postfix postfix/mailname string mail.domain.tld |
А потом вставляем ответы в БД командой debconf-set-selections 3:
1 |
debconf-set-selections postfix_silent_install.txt |
У меня в dockerfile эта операция описана инструкцией:
1 2 3 |
RUN echo "postfix postfix/main_mailer_type string Internet site" > postfix_silent_install.txt \ && echo "postfix postfix/mailname string mail.${DomainName}" >> postfix_silent_install.txt \ && debconf-set-selections postfix_silent_install.txt |
Следующий момент: нужно ставить пакеты в неинтерактивном режиме, чтобы пользователю не задавались никакие вопросы. Для этого необходимо задать тип пользовательского интерфейса командой DEBIAN_FRONTEND=noninteractive 4.
На все вопросы да/нет отвечать утвердительно поможет ключ -y утилиты apt-get. Ну и для совсем тихого режима используем ключ -q. В итоге команда установки выглядит следующим образом:
1 2 3 4 5 6 7 |
RUN DEBIAN_FRONTEND=noninteractive apt-get install -q -y \ postfix \ dovecot-common \ dovecot-imapd \ dovecot-pop3d \ nano \ rsyslog |
На этом с установкой разобрались.
Конфиги
Можно бесконечным количеством команд postconf определять все ключевые параметры в Postfix. То же самое придется проделать и с Dovecot. А можно просто взять и скопировать уже готовые и отлаженные конфиги. Это наиболее гуманный способ, именно поэтому у меня в dockerfile присутствуют две инструкции:
ADD main.cf /etc/postfix/main.cf
…
ADD dovecot.conf /etc/dovecot/dovecot.conf
Они просто копируют два файла из текущего каталога внутрь контейнера в заданное место.
Надеюсь статья внесла ясность во все вопросы касательно использования Docker для развертывания связки Postfix + Dovecot.