Невозможно заставить контейнеры общаться, несмотря на то, что они находятся в одной сети - PullRequest
0 голосов
/ 12 декабря 2018

Здравствуйте, я пытаюсь заставить сервер .NET Core взаимодействовать с базой данных Redis. Сервер хорошо работает вне контейнера.
Контейнеры настроены. Я могу получить доступ к базе данных, используя порт хостасопоставление.
Однако, когда я выполняю операцию, требующую от сервера вызова базы данных, соединение отклоняется.

dockercompose

version: '3.3'
    services:
           db:
              image: redis:4.0.5-alpine
              container_name: redis0
              networks:
                - redis-net
              ports:
                - 6381:6379   //i can acess redis from the hostmachine via 6381  but i can't acess it via 6379 from the container with the server

            backend:
              image: server
              container_name: server0
              build: ./Server
              command: ["dotnet","Server.dll"]
              ports:
                - 9400:9300
              networks:
                - redis-net
              environment:
                - dbport=6379
              depends_on:
                - db

        networks:
            redis-net:

Запуск

 public void ConfigureServices(IServiceCollection services) {

            services.AddOptions();
            services.AddMvc();

    try {
            var env = Environment.GetEnvironmentVariables();
            var portStr = env["dbport"].ToString();
            System.IO.File.AppendAllText("dock.txt",$"dbport:{portStr}");
            if (!(int.TryParse(portStr,out int redisPort))) {
                return;
            }

            var mux = new Multiplexer();
            var logicalConnection = mux.OpenLink(redius.Address.Create(redisPort));
            services.AddSingleton(logicalConnection);

        } catch (Exception ex) {

            Console.WriteLine("Could not open link, ex:" + ex.Message);
        }
    }

Для отладки я пишу exception, который сервер выбрасывает в файл в контейнере, и я ищу его, используя docker exec -it <container_id> bash

Метод контроллера, который выбрасывает

 public async Task<List<User>> GetUsers()
        {
            try
            {
                var usersRaw = await this.connection.HMGetAllAsync("users");
            }
            catch (Exception ex)
            {
                System.IO.File.AppendAllText(Constants.OUTPUT,ex.Message);
                return null;
            }
            return null;

        }

Ошибка говорит: connection refused for 127.0.0.1:6379. Неправильный ли адрес ip?В основном проблема заключается в следующем:

                Redis    Server
HostPort        6381     9400
ContainerPort   6379     9300
AppPort         6379     9300

Я могу получить доступ к Redis снаружи через 6381, а также могу получить доступ Server через 9400.Сервер может связываться с Redis обоими внешними контейнерами (поэтому нет ошибки в собственной библиотеке).
Невозможно получить доступ к Redis из Server через 6379 (оба находятся в network -> redis-net)

1 Ответ

0 голосов
/ 13 декабря 2018

Для сообщения об ошибке, кажется, вы используете localhost:6379 из server image.

Попробуйте базовый URL с http://redis0:6379 или http://db:6379

...