Настройка SMTP-сервера для вашего приложения в контейнере

У меня есть приложение, которое отправляет электронную почту и требует, чтобы smtp работал на порту 25. Для чего я создал другой контейнер и сопоставил порт 25 с хостом на контейнер.

Это не очень хорошо работает, поскольку оно продолжало бросать следующую ошибку

ERROR: for smtp Cannot start service smtp: driver failed programming external connectivity on endpoint push_smtp_1 (25f260f6185dd34cfdb8fb9956c28187028aaca4d850d7a73acc4c2180c55696): Error starting userland proxy: Bind for 0.0.0.0:25: unexpected error (Failure EADDRINUSE)

Не уверен, что здесь может быть неправильным, следуя другим сообщениям, которые я пытался перезапустить клиент-докер, а также подтвердил, что ничего не работает на порту 25 lsof -i:25 Дайте мне знать, если я что-то упустил.

Вторая часть этого вопроса заключается в том, что является идеальным способом работы с SMTP-сервером.

  1. Если smtp-сервер будет создан в контейнере приложения. Пришел в этот блог http://www.tothenew.com/blog/setting-up-sendmail-inside-your-docker-container/

  2. Если нет (1), то лучше ли создавать контейнер smtp и отображать порты. Это так, в чем причина получения вышеуказанной ошибки.

Ниже приведен пример моей докеры:

version: Ɖ'
services:
  push:
    image: emailService
    ports:
    - "9602:9602/tcp"
    networks:
    - default
    build:
      context: ./
      dockerfile: Dockerfile
      args:
      - "TARGET=build"
    depends_on:
    - gearmand
    - smtp
  smtp:
    image: catatnight/postfix:latest
    ports:
    - "25:25"
    networks:
    - default
  gearmand:
    image: <path>/<to>/gearmand:latest
    ports:
    - "4730:4730/tcp"
    networks:
    - default

Спасибо!

Всего 3 ответа


Если вы хотите, чтобы SMTP-сервер мог быть доступен только из другого контейнера, а не извне, нет необходимости сопоставлять порт.

Используя компоновку докеров, все определенные контейнеры будут автоматически добавляться в сеть, в которой контейнеры могут достигать друг друга по их имени (см. Https://docs.docker.com/compose/networking/ ). Если ваша обычная сеть «по умолчанию» является мостовой сетью, это также сработает.

Это означает, что ваш SMTP-контейнер будет напрямую доступен в smtp:25 из других контейнеров (т. Е. Его внутренний порт и внутреннее имя хоста вместо хост-порта и публично маршрутизируемого IP-адреса вашего узла докера).

Никто другой не сможет использовать ваш SMTP-сервер. Я думаю, что это может привести к проблемам с получателями, не принимающими отправленные им электронные письма (см. Https://serverfault.com/q/364473 ). @David Maze имеет смысл сказать, что, вероятно, лучше использовать публичный / официальный почтовый провайдер.


Я думаю, проблема в том, что у вас есть что-то еще на хосте, который уже прослушивает этот порт

Попытайтесь выяснить, какие порты на хосте прослушиваются с помощью https://www.cyberciti.biz/faq/how-do-i-find-out-what-ports-are-listeningopen-on-my-linuxfreebsd-server/


Используйте другой порт на хосте:

version: Ɖ'
services:
  push:
    image: emailService
    ports:
    - "9602:9602/tcp"
    networks:
    - default
    build:
      context: ./
      dockerfile: Dockerfile
      args:
      - "TARGET=build"
    depends_on:
    - gearmand
    - smtp
  smtp:
    image: catatnight/postfix:latest
    ports:
    - "2525:25"
    networks:
    - default
  gearmand:
    image: <path>/<to>/gearmand:latest
    ports:
    - "4730:4730/tcp"
    networks:
    - default

Есть идеи?

10000