Docker 上にメールサーバを構築する (2)
共通ユーザ作成
前回 において、三つのコンテナを利用してメールサーバを構築するとしたが、 最終的に postfix と dovecot、postfixadmin は共通のバーチャルドメイン用のメールディレクトリを参照することになる。 そこでパーミッションの問題を解決するために同じ uid/gid のユーザを各コンテナに用意することにした。
あと、共通のメールディレクトリは Docker のホストとなるディレクトリに作成するので、 Docker のホストにもおなじ uid/gid のユーザを作っておくことにする。
- User: vmail(1500)
- Group: vmail(1500)
- Maildir: /var/vmail
Docker 上のホストで以下の操作を行う。
sudo groupadd -g 1500 vmail sudo useradd -g vmail -u 1500 vmail -d /var/vmail sudo mkdir /var/vmail sudo chown vmail:vmail /var/vmail
適当に図辞するとこんな感じ。
yuanying/postfix
Maildir への配送をどうするかちょっと迷ったが、 結局 procmail を使うことにした。ということでさくっと Dockerfile を書く。
Dockerfile
# docker build -t yuanying/postfix . # docker run -d --link mysql:mysql \ # -e "POSTFIX_MYSQL_PASSWORD=postfixpassword" \ # -h 'mail.fraction.jp' \ # -v /var/vmail:/var/vmail \ # -p 25:25 \ # yuanying/postfix # FROM ubuntu:precise MAINTAINER O. Yuanying "yuan-docker@fraction.jp" ENV DEBIAN_FRONTEND noninteractive RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list RUN apt-get update RUN bash -c 'debconf-set-selections <<< "postfix postfix/main_mailer_type string Internet site"' RUN bash -c 'debconf-set-selections <<< "postfix postfix/mailname string mail.example.com"' RUN apt-get install -y postfix postfix-mysql postgrey syslog-ng procmail ADD postfix/header_checks /etc/postfix/header_checks ADD postfix/main.cf /etc/postfix/main.cf ADD postfix/master.cf /etc/postfix/master.cf ADD postfix/mysql-virtual-mailbox-maps.cf /etc/postfix/mysql-virtual-mailbox-maps.cf ADD postfix/mysql-virtual-alias-maps.cf /etc/postfix/mysql-virtual-alias-maps.cf ADD postfix/mysql-virtual-domains-maps.cf /etc/postfix/mysql-virtual-domains-maps.cf ADD procmail/procmailrc /etc/procmailrc RUN chown root:root /etc/procmailrc RUN groupadd -g 1500 vmail && \ useradd -g vmail -u 1500 vmail -d /var/vmail && \ mkdir /var/vmail && \ chown vmail:vmail /var/vmail ADD run /usr/local/bin/run RUN chmod +x /usr/local/bin/run EXPOSE 25 # VOLUME ["/var/vmail"] CMD ["/usr/local/bin/run"]
設定ファイルをいろいろ追加しているが、
結局は mysql と接続する設定は run
ファイルで一括置換している。
run
#!/bin/bash set -e sed -i "s/__REPLACE_DATABASE_HOST__/${MYSQL_PORT_3306_TCP_ADDR}/g" /etc/postfix/mysql-virtual-alias-maps.cf sed -i "s/__REPLACE_DATABASE_PORT__/${MYSQL_PORT_3306_TCP_PORT}/g" /etc/postfix/mysql-virtual-alias-maps.cf sed -i "s/__REPLACE_DATABASE_PASSWORD__/${POSTFIX_MYSQL_PASSWORD}/g" /etc/postfix/mysql-virtual-alias-maps.cf sed -i "s/__REPLACE_DATABASE_HOST__/${MYSQL_PORT_3306_TCP_ADDR}/g" /etc/postfix/mysql-virtual-domains-maps.cf sed -i "s/__REPLACE_DATABASE_PORT__/${MYSQL_PORT_3306_TCP_PORT}/g" /etc/postfix/mysql-virtual-domains-maps.cf sed -i "s/__REPLACE_DATABASE_PASSWORD__/${POSTFIX_MYSQL_PASSWORD}/g" /etc/postfix/mysql-virtual-domains-maps.cf sed -i "s/__REPLACE_DATABASE_HOST__/${MYSQL_PORT_3306_TCP_ADDR}/g" /etc/postfix/mysql-virtual-mailbox-maps.cf sed -i "s/__REPLACE_DATABASE_PORT__/${MYSQL_PORT_3306_TCP_PORT}/g" /etc/postfix/mysql-virtual-mailbox-maps.cf sed -i "s/__REPLACE_DATABASE_PASSWORD__/${POSTFIX_MYSQL_PASSWORD}/g" /etc/postfix/mysql-virtual-mailbox-maps.cf service syslog-ng start service postfix start tail -F /var/log/mail.log
run ファイルの最後で /var/log/mail.log
を tail することで docker logs の結果に mail.log を表示している。
細かい設定などは以下を参照のこと。
スパムメール対策
とりあえず postfix のイメージを作ってはたと思ったことは、 「スパムメール対策をどうしよう」 であった。 spamassasin を同じコンテナに同居させるか、それとも別途コンテナを建てるか…。
とりあえず続く。