Fejlesszünk konténerben III.
További hasznos Docker Compose példák a sorozat harmadik részében.
Az előző részekben volt alkalmunk többször is megcsodálni, hogy milyen egyszerűen lehet adatbázist rakni az alkalmazásunk mögé Docker Compose segítségével. De kár lenne itt megállni. A Docker kabalaállata biztos ránk is kiabálna, ha így tennénk. Jöjjön hát még pár kedvcsináló példa.
SFTP szerver
Kezdésnek nézzünk valami egyszerűt. Ha az alkalmazásunknak egy SFTP szerverre lenne szüksége, azt nagyon egyszerűen meg tudjuk oldani. Létezik egy remek image, ami elvégzi helyettünk a munka nagy részét, így csak pár sor és meg is vagyunk.
docker-compose.yml
version: "3"
services:
sftp:
image: atmoz/sftp:alpine
ports:
- "2222:22"
command: user:pass
Névfeloldás
A service-eknek megadhatunk egyedi DNS szervert (vagy szervereket) is, ami akár egy másik konténer is lehet. Ehhez először is szükség van egy saját hálózatra, ahol a DNS szervernek fix IP címe van.
docker-compose.yml
networks:
default:
dnsnet:
ipam:
config:
- subnet: 172.16.113.0/24
gateway: 172.16.113.1
A default
biztosítja azt, hogy az egymáshoz linkelt konténerek név alapján továbbra is elérik egymást (pl. ha van egy db
nevű service-ünk, akkor arra db
néven tudunk alkalmazásunkban hivatkozni). A dnsnet
-et használjuk arra, hogy a DNS szerverünknek legyen fix címe.
docker-compose.yml
dns:
build: ./dns
networks:
default:
dnsnet:
ipv4_address: 172.16.113.2
Már csak az alkalmazás konténernek kell megadni, hogy a mi DNS szerverünket használja.
docker-compose.yml
app:
build: ./app
links:
- dns
dns: 172.16.113.2
networks:
default:
dnsnet:
Ha minden jól ment, láthatjuk, hogy az egyébként nem létező look-me-up.test
domain-t megfelelően fel tudjuk oldani az alkalmazáson belül:
$ host look-me-up.test
Host look-me-up.test not found: 3(NXDOMAIN)
$ docker-compose run --rm app
look-me-up.test has address 172.3.4.5
A teljes példa szokás szerint megtalálható a kapcsolódó Github repóban.
Email (nem) küldés
Fejlesztés közben jó, ha nem kezdünk el random címekre leveleket kiküldeni. Viszont fejlesztés közben néha jó az is, ha mégis csak kimennek ezek a levelek és meg tudjuk nézni őket egy email kliensben. Szóval szeretnénk is levelet küldeni, meg nem is.
Ha szerencsénk van, akkor az általunk használt keretrendszer vagy library beállításai között van valami olyasmi, hogy SMTP szerverhez csatlakozás helyett csak egy fájlba írja ki a levél tartalmát (pl. Django-ban az EMAIL_BACKEND
beállítás).
Így már nem kell kézzel összevadásznunk, hogy mi volt az aktivációs link, amit az új regisztrálónak kiküldött (volna) a rendszer, de ez még nem ad választ arra, hogy "Hogyan néz ki a levél Outlook 97-ben?".
A konténerek itt is a segítségünkre lehetnek. Felhúzhatunk egy olyan SMTP szervert, ami címzettől függetlenül az összes megkapott levelet egy lokális fiókba kézbesíti és egy POP3 vagy IMAP szervert, amihez csatlakozva ezeket a leveleket meg is nézhetjük.
Nem hangzik túl bonyolultan, de azért megvannak a maga kis buktatói. Nézzük először az SMTP szervert.
smtp/Dockerfile
FROM alpine:3.5
RUN apk add --no-cache postfix postfix-pcre rsyslog supervisor
RUN adduser -u 1000 -D dev && \
mkdir -p /home/dev/Maildir && \
chown -R dev:dev /home/dev
COPY ./etc /etc
RUN touch /etc/aliases && \
postalias /etc/aliases
EXPOSE 25
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]
A postfix
már önmagában is egy trükkös jószág. Nem egyszerű rábírni, hogy standard output-ra logoljon, vagy hogy éppen az előtérben maradjon. Így szükség van mellé még egy rsyslog
-ra és egy supervisor
-ra is. Az rsyslog
-nak megmondhatjuk, hogy küldjön mindent az stdout-ra. A supervisor
pedig van olyan kedves és kérésre az előtérben marad (és mellesleg kezeli a másik két alkalmazás elindítását is).
Ezen kívül még létrehozunk egy dev
felhasználót. Ő fogja az összes levelet megkapni a Maildir
könyvtárába. Meg persze bemásolunk még egy rakás konfig fájlt, ami nem különösebben érdekes, úgyhogy a szokott helyen meg lehet őket tekinteni. Térjünk át az IMAP szerverre.
imap/Dockerfile
FROM alpine:3.5
RUN apk add --no-cache dovecot
RUN adduser -u 1000 -D dev && \
mkdir -p /home/dev/Maildir && \
chown -R dev:dev /home/dev
COPY ./etc /etc
EXPOSE 143
CMD ["/usr/sbin/dovecot", "-F"]
Jól látható, hogy a dovecot egy fokkal jobban viseli a konténerizálást. A dev
felhasználót itt is létrehozzuk, ugyanazzal az UID-dal, mint a másik konténerben. A beállításokból csak annyit emelnék ki, hogy egy felhasználó lett megadva dev
néven, aki dev
jelszóval tud belépni.
Nem maradt más hátra, mint a docker-compose.yml
fájl, ami az egészet összefogja.
docker-compose.yml
version: "3"
volumes:
mail-data:
services:
app:
image: python:2.7-alpine
depends_on:
- smtp
volumes:
- ./app:/app
working_dir: /app
smtp:
build: ./smtp
depends_on:
- imap
volumes:
- mail-data:/home/dev/Maildir
imap:
build: ./imap
volumes:
- mail-data:/home/dev/Maildir
ports:
- "143:143"
A dev felhasználó Maildir
könyvtára meg van osztva az SMTP- és az IMAP service között, ami biztos nem egy optimális megoldás, de a célnak megfelel. Az app
service segítségével pedig tudunk küldeni teszt levelet.
$ docker-compose run --rm app python send_mail.py
Amit aztán kedvenc IMAP kliensünkkel el tudunk olvasni a localhost:143
-ra csatlakozva.