Подключитесь к серверу Redis из образа Docker - PullRequest
1 голос
/ 21 июня 2020

У меня 2 хоста, веб-модуль (WU) и вычислительный модуль (CU). В WU у меня есть свой сайт. В CU у меня есть сервер Redis и приложение (C ++), которое выполняет некоторые вычисления.

Пользователь вводит входные данные на веб-сайт, а затем я хочу поставить задание из WU в очередь на сервер Redis по КС. Затем у меня есть рабочий на CU, который выполняет задачу.

Теперь я могу поставить задание из WU (вне любого изображения docker) в CU с терминала (используя python rq модуль). Однако на моем веб-сайте изображение docker, и я не могу заставить его работать. Из образа docker я пытаюсь подключиться к 172.17.0.1:6370 (172.17.0.1 - это IP-адрес шлюза между образом и хостом docker). Я получаю сообщение об ошибке: в соединении отказано . Затем я подумал, что мне, возможно, придется сопоставить порты в моем docker -compose файле: 6739: 6739. Однако затем я получил сообщение об ошибке, что порт уже используется. И действительно, он используется службой stunnel4, которая позволяет мне ставить задания из WU в очередь на сервер redis на CU.

Должен ли я запускать службу stunnel4 в образе docker? И если да, то как я мог это сделать? Или мне следует решить мою проблему по-другому?

Структура сети

WU и CU - это 2 (виртуальные) машины. Мой сервер redis находится на CU, а не в контейнере docker. Я могу подключиться к серверу redis из WU в CU с помощью модуля python redis (но не из контейнера docker). Для этого мне пришлось настроить stunnel4.service (redis-client на WU и redis-server на CU).

1 Ответ

0 голосов
/ 03 июля 2020

Наконец, мне удалось создать stunnel-сервис в контейнере docker на WU. Теперь я могу просто подключиться с помощью python redis к этой службе stunnel, и конец туннеля указывает на CU.

Вот что я сделал в WU:

Dockerfile

FROM alpine:3.12
RUN apk add --no-cache stunnel
COPY ./entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
COPY ./ca_file.crt /etc/stunnel/ca_file.crt
ENTRYPOINT ["/entrypoint.sh"]

точка входа. sh

#!/bin/sh
cd /etc/stunnel

cat > stunnel.conf <<_EOF_

foreground = yes

[stunnel-client]
client = yes
accept = ${ACCEPT}
connect = ${CONNECT}
CAfile = ca_file.crt
verify = 4

_EOF_

exec stunnel "$@"

Значения ACCEPT и CONNECT указаны в файле среды:

.env.stunnel

ACCEPT=6379
CONNECT=10.110.0.3:6379

где 10.110.0.3 - IP-адрес моего хоста redis.

docker -compose

stunnel-client:
    container_name: stunnel-client
    build:
      context: ./stunnel
      dockerfile: Dockerfile
    restart: always
    volumes:
      - stunnel_volume:/etc/stunnel
    env_file:
      - ./.env.stunnel
    networks:
      - stunnel-net
    ports:
      - "6379:6379"

stunnel-net также находится в моей услуге web, поэтому я могу подключиться оттуда к услуге stunnel-client с помощью python redis.

...