Postfix и Dovecot в контейнере Docker

Postfix и Dovecot в контейнере Docker 01Статья Postfix и Dovecot в контейнере Docker расскажет о том, как простейшую связку MTA и MAA развертывать автоматически с помощью технологий контейнеризации. Этот сценарий идеален для целей обкатки и тестирования почтовых сервисов (например для групп разработки и тестирования ПО для отладки почтового функционала разрабатываемого софта), но мало применим для реальных инфраструктур в продакшене.

Postfix и Dovecot в контейнере Docker

Все нюансы установки и настройки Postfix и Dovecot с использованием локального хранилища maildir я подробно рассказывал в одной из недавних статей — Базовая настройка Postfix и Dovecot. В этой же статье я хочу сделать упор на особенности развертывания абсолютно аналогичной конфигурации, но с помощью контейнеров Docker.

Dockerfile и все необходимое для сборки образа добро я выложил на GitHub — postfix-dovecot-maildir. Обратите внимание на тестовые ветки, возможно там будет более актуальная информация.

Подготовка

Установка Docker подробно расписана в официальной документации 1.

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

apt-get install git

Советую создать отдельную папку, чтобы не мусорить в текущем каталоге, и сразу в неё перейти:

mkdir ~/testdir01 ; cd ~/testdir01

Далее скачиваем репозиторий командой:

git clone -b Test-branche https://github.com/bissquit/postfix-dovecot-maildir.git

Примечание: я воспользуюсь тестовой веткой, поскольку она включает наиболее  свежие изменения. Обратите внимание, что код в этой ветке теоретически может быть неработоспособным (на то она и тестовая, чтобы тестировать изменения. Ваш Кэп). Чтобы выкачать основную рабочую ветку, просто уберите ключ -b и имя ветки Test-branche.

В текущем каталоге вы обнаружите новую папку с именем postfix-dovecot-maildir, в ней и будет нужный нам для сборки образа dockerfile. Перейдем в папку и проверим её содержимое:

cd postfix-dovecot-maildir/ && ls -lh
-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, но это не очень удобно. К тому же, если в каком-либо репозитории файлов будет больше, выкачивание вручную — не лучшая затея.

Сборка

Теперь настал самый ответственный момент — сборка образа. Сделать это можно с помощью команды:

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), потом удаляться. Вы увидите что-то на подобии этого:

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 и др.).

Запуск

Образ собран, пришла пора запустить на его основе контейнер. Выполним команду:

docker run -d -p 25:25 \ 
              -p 143:143 \
              -p 110:110 \
              mailserver

Если все прошло нормально, то выполнив команду docker ps -a, вы увидите запущенный контейнер.

Если понадобиться зайти внутрь контейнера для изменения каких-либо настроек или для диагностики, то это можно сделать командой:

docker exec -it b8610b5cea19 /bin/bash

где b8610b5cea19 — идентификатор контейнера (доступен также по команде docker ps -a). По окончанию сеанса наберите exit.

Отличия развертывания через Docker

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

Установка пакетов

В процессе установки пакетов пользователю могут быть заданы вопросы о желаемой конфигурации. При автоматическом сценарии развертывания важно эти ответы определить заранее.

Примечание: Например Postfix обычно задает вопросы о типе настройки (см. Установка Postfix на Debian) и почтовом имени.

Сделать это можно дополнив базу данных debconf 2. Для этого нужно создать файл (у меня он будет иметь имя postfix_silent_install.txt) с содержимым (файл построчный, каждая строка должна иметь четыре значения):

postfix postfix/main_mailer_type string Internet site
postfix postfix/mailname string mail.domain.tld

А потом вставляем ответы в БД командой debconf-set-selections 3:

debconf-set-selections postfix_silent_install.txt

У меня в dockerfile эта операция описана инструкцией:

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. В итоге команда установки выглядит следующим образом:

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.

comments powered by HyperComments