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.

Hozzáfűznél valamit?

Dobj egy emailt a blog kukac deadlime pont hu címre.

Feliratkoznál?

Az RSS feed-et ajánljuk, ha kedveled a régi jó dolgokat.